bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * CDDL HEADER START
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The contents of this file are subject to the terms of the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Common Development and Distribution License (the "License").
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * You may not use this file except in compliance with the License.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * See the License for the specific language governing permissions
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * and limitations under the License.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * CDDL HEADER END
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * Copyright 2010 QLogic Corporation. All rights reserved.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <sys/note.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <qlge.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/strsubr.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <netinet/in.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <netinet/ip.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <netinet/ip6.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <inet/ip.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * GLDv3 functions prototypes
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_m_getstat(void *, uint_t, uint64_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_m_start(void *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic void ql_m_stop(void *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_m_setpromiscuous(void *, boolean_t);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_m_multicst(void *, boolean_t, const uint8_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_m_unicst(void *, const uint8_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic mblk_t *ql_m_tx(void *, mblk_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic void ql_m_ioctl(void *, queue_t *, mblk_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic boolean_t ql_m_getcapab(void *, mac_capab_t, void *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_m_setprop(void *, const char *, mac_prop_id_t, uint_t,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan const void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int ql_m_getprop(void *, const char *, mac_prop_id_t, uint_t, void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void ql_m_propinfo(void *, const char *, mac_prop_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define QL_M_CALLBACK_FLAGS (MC_IOCTL | MC_GETCAPAB | MC_SETPROP | \
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MC_GETPROP | MC_PROPINFO)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic mac_callbacks_t ql_m_callbacks = {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_M_CALLBACK_FLAGS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_getstat,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_start,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_stop,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_setpromiscuous,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_multicst,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan NULL,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan NULL,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_ioctl,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_getcapab,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan NULL,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan NULL,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_setprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ql_m_getprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ql_m_propinfo
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerchar *qlge_priv_prop[] = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "_adv_pause_mode",
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan "_fm_enable",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This function starts the driver
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_start(void *arg)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * reset chip, re-initialize everything but do not
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * re-allocate memory
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->hw_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->mac_flags = QL_MAC_INIT;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Write default ethernet address to chip register Mac
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Address slot 0 and Enable Primary Mac Function.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_unicst_set(qlge,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (uint8_t *)qlge->unicst_addr[0].addr.ether_addr_octet, 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->stats.rpackets = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->stats.rbytes = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->stats.opackets = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->stats.obytes = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->hw_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_do_start(qlge);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->mbx_mutex);
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_get_firmware_version(qlge, NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->mbx_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This function stops the driver
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic void
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_stop(void *arg)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_do_stop(qlge);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->mac_flags = QL_MAC_STOPPED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Add or remove a multicast address
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_multicst(void *arg, boolean_t add, const uint8_t *ep)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int ret = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_DETACH) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (add) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_DUMP(DBG_GLD, "add to multicast list:\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (uint8_t *)ep, 8, ETHERADDRL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret = ql_add_to_multicast_list(qlge, (uint8_t *)ep);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_DUMP(DBG_GLD, "remove from multicast list:\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (uint8_t *)ep, 8, ETHERADDRL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret = ql_remove_from_multicast_list(qlge, (uint8_t *)ep);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (ret != DDI_SUCCESS) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ret = EIO;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan } else {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ret = 0;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan return (ret);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Enable or disable promiscuous mode
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_setpromiscuous(void* arg, boolean_t on)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int mode;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* enable reception of all packets on the medium, */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (on) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mode = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_GLD, ("%s(%d) enable promiscuous mode\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mode = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_GLD, ("%s(%d) disable promiscuous mode\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->hw_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_set_promiscuous(qlge, mode);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->hw_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (DDI_SUCCESS);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_getstat(void *arg, uint_t stat, uint64_t *valp)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct ql_stats *cur_stats;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint64_t val = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int i;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t val32;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct rx_ring *rx_ring;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct tx_ring *tx_ring;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(qlge != NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats = &qlge->stats;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* these stats are maintained in software */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (stat) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_IFSPEED /* 1000 */ :
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (CFG_IST(qlge, CFG_CHIP_8100) != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->speed = SPEED_10G;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = qlge->speed * 1000000ull;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_MULTIRCV:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->multircv;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_BRDCSTRCV:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->brdcstrcv;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_MULTIXMT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->multixmt = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->tx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring = &qlge->tx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->multixmt += tx_ring->multixmt;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->multixmt;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_BRDCSTXMT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->brdcstxmt = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->tx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring = &qlge->tx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->brdcstxmt += tx_ring->brdcstxmt;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->brdcstxmt;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_NORCVBUF:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->norcvbuf;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_IERRORS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->errrcv;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_OBYTES:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->obytes = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->tx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring = &qlge->tx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->obytes += tx_ring->obytes;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->obytes;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_OPACKETS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->opackets = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->tx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring = &qlge->tx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->opackets += tx_ring->opackets;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->opackets;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_DEFER_XMTS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->defer = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->tx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring = &qlge->tx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->defer += (tx_ring->defer);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->defer;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_OERRORS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->errxmt = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->tx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring = &qlge->tx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->errxmt += tx_ring->errxmt;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->errxmt;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_RBYTES:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->rbytes = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->rx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rx_ring = &qlge->rx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->rbytes += rx_ring->rx_bytes;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->rbytes;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_STAT_IPACKETS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->rpackets = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->rx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rx_ring = &qlge->rx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->rpackets += rx_ring->rx_packets;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->rpackets;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_FCS_ERRORS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->crc = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->rx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rx_ring = &qlge->rx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->crc += rx_ring->fcs_err;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->crc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_TOOLONG_ERRORS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->frame_too_long = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < qlge->rx_ring_count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rx_ring = &qlge->rx_ring[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_stats->frame_too_long +=
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rx_ring->frame_too_long;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = cur_stats->frame_too_long;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_XCVR_INUSE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = XCVR_1000X;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_JABBER_ERRORS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_sem_spinlock(qlge, qlge->xgmac_sem_mask) !=
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_JABBER_PKTS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &val32);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = val32;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_sem_unlock(qlge, qlge->xgmac_sem_mask);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_STATS, ("%s(%d) MAC_STAT_JABBER_ERRORS "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "status %d\n", __func__, qlge->instance, val));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_LINK_DUPLEX:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->duplex == 1)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = LINK_DUPLEX_FULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = LINK_DUPLEX_HALF;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* statics saved in hw */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case ETHER_STAT_MACRCV_ERRORS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_sem_spinlock(qlge, qlge->xgmac_sem_mask) !=
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_ALIGN_ERR,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &val32);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val += val32;
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_FCS_ERR, &val32);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val += val32;
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_JABBER_PKTS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &val32);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val += val32;
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_SYM_ERR,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &val32);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val += val32;
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_INT_ERR,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &val32);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan val += val32;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_sem_unlock(qlge, qlge->xgmac_sem_mask);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ENOTSUP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *valp = val;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Set the physical network address
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_unicst_set(qlge_t *qlge, const uint8_t *macaddr, int slot)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan int ret;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ret = ql_sem_spinlock(qlge, SEM_MAC_ADDR_MASK);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (ret != DDI_SUCCESS)
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan goto exit;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ret = ql_set_mac_addr_reg(qlge, (uint8_t *)macaddr,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MAC_ADDR_TYPE_CAM_MAC,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (uint16_t)(qlge->func_number * MAX_CQ + slot));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_sem_unlock(qlge, SEM_MAC_ADDR_MASK);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanexit:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (ret != DDI_SUCCESS) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ret = EIO;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan } else {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ret = 0;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan return (ret);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Set default MAC address
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Each function has a total of 128 mac address, function0: 0~127,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * function1 128~254 etc or func_number *128 + n (0~127), but
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * we only support one MAC address, so its address is
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * func_number*128+0
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_unicst(void *arg, const uint8_t *mac)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int status;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(qlge->mac_flags != QL_MAC_DETACH);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->hw_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bcopy(mac, qlge->unicst_addr[0].addr.ether_addr_octet, ETHERADDRL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* Set Mac Address to slot 0 and Enable Primary Mac Function */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan status = ql_unicst_set(qlge, mac, 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->hw_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (status);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_m_tx is used only for sending data packets into ethernet wire.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic mblk_t *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_tx(void *arg, mblk_t *mp)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct tx_ring *tx_ring;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mblk_t *next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rval;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t tx_count = 0;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan caddr_t bp;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan uint8_t selected_ring = 0;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((qlge->port_link_state == LS_DOWN) ||
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan (qlge->mac_flags != QL_MAC_STARTED)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_WARN, "!%s(%d): exit due to link down",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan freemsgchain(mp);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mp = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto tx_exit;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * Calculate which tx ring to send this packet
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan bp = (caddr_t)mp->b_rptr;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan selected_ring = ql_tx_hashing(qlge, bp);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan tx_ring = &qlge->tx_ring[selected_ring];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&tx_ring->tx_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (tx_ring->mac_flags != QL_MAC_STARTED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&tx_ring->tx_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto tx_exit;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* we must try to send all */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (mp != NULL) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * if number of available slots is less than a threshold,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * then quit
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (tx_ring->tx_free_count <= TX_STOP_THRESHOLD) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring->queue_stopped = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rval = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If we return the buffer back we are expected to
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * call mac_tx_ring_update() when
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * resources are available
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring->defer++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan next = mp->b_next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mp->b_next = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rval = ql_send_common(tx_ring, mp);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rval != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mp->b_next = next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_count++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mp = next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * After all msg blocks are mapped or copied to tx buffer,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * trigger the hardware to send the msg!
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (tx_count > 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_doorbell_reg(tx_ring->qlge, tx_ring->prod_idx_db_reg,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tx_ring->prod_idx);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&tx_ring->tx_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathantx_exit:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (mp);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic void
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct iocblk *iocp;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan boolean_t need_privilege = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int err, cmd;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan enum ioc_reply status;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Validate the command before bothering with the mutex...
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan iocp = (struct iocblk *)(void *)mp->b_rptr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan iocp->ioc_error = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmd = iocp->ioc_cmd;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan miocnak(wq, mp, 0, EINVAL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (cmd) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_GLD, ("unknown ioctl cmd \n"));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan miocnak(wq, mp, 0, EINVAL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_PCI_STATUS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_REG:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_PCI_REG:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_PCI_REG:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_GET_DBGLEAVEL:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SET_DBGLEAVEL:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_CONTRL_REGISTERS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_MANUAL_READ_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_MANUAL_WRITE_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_GET_BINARY_CORE_DUMP:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SUPPORTED_DUMP_TYPES:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_TRIGGER_SYS_ERROR_EVENT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_VPD:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_GET_PROP:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SHOW_REGION:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_LIST_ADAPTER_INFO:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_FW_IMAGE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_FW_IMAGE_HEADERS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_CONTINUE_COPY_IN:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_CONTINUE_COPY_OUT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SOFT_RESET:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_GET_INFO_SIZE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_GET_INFO:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_GET_MODE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan need_privilege = B_FALSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* FALLTHRU */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_SET_MODE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (need_privilege) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Check for specific net_config privilege
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = secpolicy_net_config(iocp->ioc_cr, B_FALSE);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (err != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan miocnak(wq, mp, 0, err);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Implement ioctl
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (cmd) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_PCI_STATUS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_REG:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_PCI_REG:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_PCI_REG:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_GET_DBGLEAVEL:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SET_DBGLEAVEL:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_CONTRL_REGISTERS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_MANUAL_READ_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_MANUAL_WRITE_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_GET_BINARY_CORE_DUMP:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SUPPORTED_DUMP_TYPES:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_TRIGGER_SYS_ERROR_EVENT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_FLASH:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_VPD:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_GET_PROP:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SHOW_REGION:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_LIST_ADAPTER_INFO:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_READ_FW_IMAGE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_WRITE_FW_IMAGE_HEADERS:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_CONTINUE_COPY_IN:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_CONTINUE_COPY_OUT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case QLA_SOFT_RESET:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan status = ql_chip_ioctl(qlge, wq, mp);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_GET_INFO_SIZE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_GET_INFO:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_GET_MODE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case LB_SET_MODE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan status = ql_loop_ioctl(qlge, wq, mp, iocp);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan status = IOC_INVAL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Decide how to reply
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (status) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IOC_INVAL:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Error, reply with a NAK and EINVAL or the specified error
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan miocnak(wq, mp, 0, iocp->ioc_error == 0 ?
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan EINVAL : iocp->ioc_error);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IOC_DONE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * OK, reply already sent
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IOC_ACK:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * OK, reply with an ACK
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan miocack(wq, mp, 0, 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IOC_REPLY:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * OK, send prepared reply as ACK or NAK
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mp->b_datap->db_type = (uint8_t)(iocp->ioc_error == 0 ?
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan M_IOCACK : M_IOCNAK);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qreply(wq, mp);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/* ARGSUSED */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanqlge_set_priv_prop(qlge_t *qlge, const char *pr_name, uint_t pr_valsize,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan const void *pr_val)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int err = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan long result;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (strcmp(pr_name, "_adv_pause_mode") == 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (result > PAUSE_MODE_PER_PRIORITY ||
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan result < PAUSE_MODE_DISABLED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = EINVAL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (qlge->pause != (uint32_t)result) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->pause = (uint32_t)result;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->flags & INTERRUPTS_ENABLED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->mbx_mutex);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (ql_set_pause_mode(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = EINVAL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->mbx_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (err);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan } else if (strcmp(pr_name, "_fm_enable") == 0) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan (void) ddi_strtol(pr_val, (char **)NULL, 0, &result);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((result != 0) && (result != 1)) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan err = EINVAL;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan } else if (qlge->fm_enable != (boolean_t)result) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan qlge->fm_enable = (boolean_t)result;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan return (err);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ENOTSUP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * callback functions for set/get of properties
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/* ARGSUSED */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_setprop(void *barg, const char *pr_name, mac_prop_id_t pr_num,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint_t pr_valsize, const void *pr_val)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = barg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int err = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t cur_mtu, new_mtu;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ECANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (pr_num) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_PROP_MTU:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cur_mtu = qlge->mtu;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bcopy(pr_val, &new_mtu, sizeof (new_mtu));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_GLD, ("%s(%d) new mtu %d \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, new_mtu));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (new_mtu == cur_mtu) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((new_mtu != ETHERMTU) && (new_mtu != JUMBO_MTU)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = EINVAL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * do not change on the fly, allow only before
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * driver is started or stopped
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((qlge->mac_flags == QL_MAC_STARTED) ||
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (qlge->mac_flags == QL_MAC_DETACH)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = EBUSY;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) new mtu %d ignored, "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "driver busy, mac_flags %d", __func__,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->instance, new_mtu, qlge->mac_flags);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->mtu = new_mtu;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = mac_maxsdu_update(qlge->mh, qlge->mtu);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (err == 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_GLD, ("%s(%d) new mtu %d set success\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan new_mtu));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_PROP_PRIVATE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = qlge_set_priv_prop(qlge, pr_name, pr_valsize,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan pr_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = ENOTSUP;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (err);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerqlge_get_priv_prop(qlge_t *qlge, const char *pr_name, uint_t pr_valsize,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer void *pr_val)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int err = ENOTSUP;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint32_t value;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(pr_name, "_adv_pause_mode") == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer value = qlge->pause;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer err = 0;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan } else if (strcmp(pr_name, "_fm_enable") == 0) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan value = qlge->fm_enable;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan err = 0;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (err == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(pr_val, pr_valsize, "%d", value);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (err);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/* ARGSUSED */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_getprop(void *barg, const char *pr_name, mac_prop_id_t pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t pr_valsize, void *pr_val)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = barg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint64_t speed;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_state_t link_state;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_duplex_t link_duplex;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int err = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mac_flags == QL_MAC_SUSPENDED) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = ECANCELED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (pr_num) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_PROP_DUPLEX:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(pr_valsize >= sizeof (link_duplex_t));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->duplex)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_duplex = LINK_DUPLEX_FULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_duplex = LINK_DUPLEX_HALF;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bcopy(&link_duplex, pr_val,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sizeof (link_duplex_t));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_PROP_SPEED:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(pr_valsize >= sizeof (speed));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan speed = qlge->speed * 1000000ull;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bcopy(&speed, pr_val, sizeof (speed));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_PROP_STATUS:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(pr_valsize >= sizeof (link_state_t));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->port_link_state == LS_DOWN)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_state = LINK_STATE_DOWN;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_state = LINK_STATE_UP;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bcopy(&link_state, pr_val,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sizeof (link_state_t));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_PROP_PRIVATE:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer err = qlge_get_priv_prop(qlge, pr_name, pr_valsize, pr_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan err = ENOTSUP;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->gen_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (err);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerql_m_propinfo(void *barg, const char *pr_name, mac_prop_id_t pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t prh)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan _NOTE(ARGUNUSED(barg));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (pr_num) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_PROP_DUPLEX:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_PROP_SPEED:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_PROP_STATUS:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_PROP_PRIVATE: {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char val_str[64];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int default_val;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(pr_name, "_adv_pause_mode") == 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default_val = 2;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan else if (strcmp(pr_name, "_fm_enable") == 0)
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan default_val = 1;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(val_str, sizeof (val_str), "%d", default_val);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_set_default_str(prh, val_str);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/* ARGSUSED */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic boolean_t
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int ret = B_FALSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t cksum = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge_t *qlge = (qlge_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (cap) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_CAPAB_HCKSUM:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((qlge->cfg_flags & CFG_CKSUM_FULL_IPv4) != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cksum |= HCKSUM_INET_FULL_V4;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((qlge->cfg_flags & CFG_CKSUM_FULL_IPv6) != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cksum |= HCKSUM_INET_FULL_V6;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((qlge->cfg_flags & CFG_CKSUM_HEADER_IPv4) != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cksum |= HCKSUM_IPHDRCKSUM;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((qlge->cfg_flags & CFG_CKSUM_PARTIAL) != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cksum |= HCKSUM_INET_PARTIAL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->chksum_cap = cksum;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *(uint32_t *)cap_data = cksum;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MAC_CAPAB_LSO: {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mac_capab_lso_t *cap_lso = (mac_capab_lso_t *)cap_data;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t page_size;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan uint32_t lso_max;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((qlge->cfg_flags & CFG_LSO)&&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (qlge->cfg_flags & CFG_SUPPORT_SCATTER_GATHER)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cap_lso->lso_flags = LSO_TX_BASIC_TCP_IPV4;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan page_size = ddi_ptob(qlge->dip, (ulong_t)1);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan lso_max = page_size * (QL_MAX_TX_DMA_HANDLES-1);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cap_lso->lso_basic_tcp_ipv4.lso_max =
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan min(lso_max, QL_LSO_MAX);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (B_FALSE);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ret);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_gld3_init(qlge_t *qlge, mac_register_t *macp)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_driver = qlge;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_dip = qlge->dip;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* This is the mac address from flash to be used by the port */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_src_addr = qlge->dev_addr.ether_addr_octet;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_min_sdu = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_max_sdu = qlge->mtu;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_margin = VLAN_TAGSZ;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_priv_props = qlge_priv_prop;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_v12n = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_callbacks.mc_unicst = ql_m_unicst;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_m_callbacks.mc_tx = ql_m_tx;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan macp->m_callbacks = &ql_m_callbacks;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}