4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/* Copyright © 2003-2011 Emulex. All rights reserved. */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Source file containing the implementation of the driver entry points
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and related helper functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_impl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_stat.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_ioctl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define ATTACH_DEV_INIT 0x1
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define ATTACH_FM_INIT 0x2
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_PCI_CFG 0x4
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_LOCK_INIT 0x8
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_PCI_INIT 0x10
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_HW_INIT 0x20
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_SETUP_TXRX 0x40
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_SETUP_ADAP 0x80
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_SETUP_INTR 0x100
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_STAT_INIT 0x200
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define ATTACH_MAC_REG 0x400
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* ---[ globals and externs ]-------------------------------------------- */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanconst char oce_ident_string[] = OCE_IDENT_STRING;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanconst char oce_mod_name[] = OCE_MOD_NAME;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amorestruct oce_dev *oce_dev_list[MAX_DEVS + 1]; /* Last entry is invalid */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* driver properties */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char flow_control[] = "flow_control";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char mtu_prop_name[] = "oce_default_mtu";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char tx_ring_size_name[] = "tx_ring_size";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char tx_bcopy_limit_name[] = "tx_bcopy_limit";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char rx_bcopy_limit_name[] = "rx_bcopy_limit";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char rx_frag_size_name[] = "rx_frag_size";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char rx_max_bufs_name[] = "rx_max_bufs";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char fm_cap_name[] = "oce_fm_capability";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char log_level_name[] = "oce_log_level";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char lso_capable_name[] = "lso_capable";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char rx_pkt_per_intr_name[] = "rx_pkts_per_intr";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char tx_reclaim_threshold_name[] = "tx_reclaim_threshold";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char rx_rings_name[] = "max_rx_rings";
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic const char tx_rings_name[] = "max_tx_rings";
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* --[ static function prototypes here ]------------------------------- */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int oce_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int oce_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int oce_quiesce(dev_info_t *dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int oce_suspend(dev_info_t *dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int oce_resume(dev_info_t *dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_unconfigure(struct oce_dev *dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_init_locks(struct oce_dev *dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_destroy_locks(struct oce_dev *dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_get_params(struct oce_dev *dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic int oce_get_prop(struct oce_dev *dev, char *propname, int minval,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int maxval, int defval, uint32_t *values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic struct cb_ops oce_cb_ops = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nulldev, /* cb_open */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nulldev, /* cb_close */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_strategy */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_print */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_dump */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_read */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_write */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_ioctl */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_devmap */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_mmap */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_segmap */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nochpoll, /* cb_chpoll */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_prop_op, /* cb_prop_op */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, /* cb_stream */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan D_MP, /* cb_flag */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan CB_REV, /* cb_rev */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* cb_aread */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev /* cb_awrite */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic struct dev_ops oce_dev_ops = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DEVO_REV, /* devo_rev */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0, /* devo_refcnt */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, /* devo_getinfo */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, /* devo_identify */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nulldev, /* devo_probe */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_attach, /* devo_attach */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_detach, /* devo_detach */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* devo_reset */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &oce_cb_ops, /* devo_cb_ops */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, /* devo_bus_ops */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan nodev, /* devo_power */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_quiesce /* devo_quiesce */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic struct modldrv oce_drv = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &mod_driverops, /* Type of module. This one is a driver */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (char *)oce_ident_string, /* Description string */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &oce_dev_ops, /* driver ops */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic struct modlinkage oce_mod_linkage = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MODREV_1, &oce_drv, NULL
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define OCE_M_CB_FLAGS (MC_IOCTL | MC_GETCAPAB | MC_SETPROP | MC_GETPROP | \
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MC_PROPINFO)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic mac_callbacks_t oce_mac_cb = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_M_CB_FLAGS, /* mc_callbacks */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_stat, /* mc_getstat */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_start, /* mc_start */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_stop, /* mc_stop */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_promiscuous, /* mc_setpromisc */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_multicast, /* mc_multicast */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_unicast, /* mc_unicast */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_send, /* mc_tx */
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan NULL, /* mc_reserve */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_ioctl, /* mc_ioctl */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_getcap, /* mc_getcapab */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, /* open */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan NULL, /* close */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_m_setprop, /* set properties */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer oce_m_getprop, /* get properties */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer oce_m_propinfo /* properties info */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextern char *oce_priv_props[];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Module Init */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan_info(struct modinfo *modinfop)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (mod_info(&oce_mod_linkage, modinfop));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* _info */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan_init(void)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* install the module */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac_init_ops(&oce_dev_ops, "oce");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = mod_install(&oce_mod_linkage);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan cmn_err(CE_WARN, "mod_install failed rval=%x", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* _init */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan_fini(void)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* remove the module */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = mod_remove(&oce_mod_linkage);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac_fini_ops(&oce_dev_ops);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* _fini */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_dev *dev = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac_register_t *mac;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore uint8_t dev_index = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan switch (cmd) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case DDI_RESUME:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (oce_resume(dip));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan default:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case DDI_ATTACH:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate dev */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev = kmem_zalloc(sizeof (struct oce_dev), KM_SLEEP);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* populate the dev structure */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->dip = dip;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->dev_id = ddi_get_instance(dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->suspended = B_FALSE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->dev_list_index = MAX_DEVS;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore while (dev_index < MAX_DEVS) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore (void) atomic_cas_ptr(&oce_dev_list[dev_index], NULL, dev);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if (oce_dev_list[dev_index] == dev) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore break;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev_index++;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if (dev_index == MAX_DEVS) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "Too many oce devices on the system. Failed to attach.");
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore goto attach_fail;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->dev_list_index = dev_index;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the parameters */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_get_params(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * set the ddi driver private data pointer. This is
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * sent to all mac callback entry points
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_set_driver_private(dip, dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->attach_state |= ATTACH_DEV_INIT;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_fm_init(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->attach_state |= ATTACH_FM_INIT;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore ret = pci_config_setup(dev->dip, &dev->pci_cfg_handle);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if (ret != DDI_SUCCESS) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_log(dev, CE_WARN, MOD_CONFIG,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "Map PCI config failed with %d", ret);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore goto attach_fail;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->attach_state |= ATTACH_PCI_CFG;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore ret = oce_identify_hw(dev);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if (ret != DDI_SUCCESS) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "Device Unknown");
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore goto attach_fail;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore ret = oce_get_bdf(dev);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if (ret != DDI_SUCCESS) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_log(dev, CE_WARN, MOD_CONFIG,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "Failed to read BDF, status = 0x%x", ret);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore goto attach_fail;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore /* Update the dev->rss */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_dev_rss_ready(dev);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* setup PCI bars */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = oce_pci_init(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (ret != DDI_SUCCESS) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan "PCI initialization failed with %d", ret);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan goto attach_fail;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->attach_state |= ATTACH_PCI_INIT;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_setup_intr(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Interrupt setup failed with %d", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->attach_state |= ATTACH_SETUP_INTR;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize locks */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_init_locks(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->attach_state |= ATTACH_LOCK_INIT;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* HW init */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_hw_init(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "HW initialization failed with %d", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->attach_state |= ATTACH_HW_INIT;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_init_txrx(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Failed to init rings");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->attach_state |= ATTACH_SETUP_TXRX;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_setup_adapter(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Failed to setup adapter");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->attach_state |= ATTACH_SETUP_ADAP;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_stat_init(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "kstat setup Failed with %d", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->attach_state |= ATTACH_STAT_INIT;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* mac_register_t */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "MAC_VERSION = 0x%x", MAC_VERSION);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac = mac_alloc(MAC_VERSION);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (mac == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "MAC allocation Failed");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fill the mac structure before calling mac_register
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_driver = dev;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_dip = dip;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_src_addr = dev->mac_addr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_callbacks = &oce_mac_cb;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_min_sdu = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_max_sdu = dev->mtu;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore mac->m_margin = VTAG_SIZE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac->m_priv_props = oce_priv_props;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Driver Private structure = 0x%p", (void *)dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* now register with GLDv3 */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = mac_register(mac, (mac_handle_t *)&dev->mac_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* regardless of the status, free mac_register */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac_free(mac);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mac = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "MAC registration failed :0x%x", ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto attach_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* correct link status only after start */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->link_status = LINK_STATE_UNKNOWN;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan mac_link_update(dev->mac_handle, dev->link_status);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->attach_state |= ATTACH_MAC_REG;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->state |= STATE_INIT;
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "ATTACH SUCCESS");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanattach_fail:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_unconfigure(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_attach */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan struct oce_dev *dev;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan int pcnt = 0;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int qid;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev = ddi_get_driver_private(dip);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (dev == NULL) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Detaching driver: cmd = 0x%x", cmd);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan switch (cmd) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan default:
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan case DDI_SUSPEND:
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (oce_suspend(dip));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan case DDI_DETACH:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan } /* switch cmd */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* Fail detach if MAC unregister is unsuccessfule */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (mac_unregister(dev->mac_handle) != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Failed to unregister MAC ");
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->attach_state &= ~ATTACH_MAC_REG;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* check if the detach is called with out stopping */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan DEV_LOCK(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (dev->state & STATE_MAC_STARTED) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->state &= ~STATE_MAC_STARTED;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_stop(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan DEV_UNLOCK(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan } else
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan DEV_UNLOCK(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /*
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan * Wait for Packets sent up to be freed
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan for (qid = 0; qid < dev->rx_rings; qid++) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan pcnt = oce_rx_pending(dev, dev->rq[qid], DEFAULT_DRAIN_TIME);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (pcnt != 0) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan "%d Pending Buffers Detach failed", pcnt);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (DDI_FAILURE);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_unconfigure(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_detach */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_quiesce(dev_info_t *dip)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = DDI_SUCCESS;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_dev *dev = ddi_get_driver_private(dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->suspended) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_chip_di(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_reset_fun(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_suspend(dev_info_t *dip)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_dev *dev = ddi_get_driver_private(dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Suspend the card */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->suspended = B_TRUE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* stop the adapter */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev->state & STATE_MAC_STARTED) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_stop(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_unsetup_adapter(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->state &= ~STATE_MAC_STARTED;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_suspend */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic int
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_resume(dev_info_t *dip)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_dev *dev;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the dev pointer from dip */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev = ddi_get_driver_private(dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (!dev->suspended) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (!(dev->state & STATE_MAC_STARTED)) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_setup_adapter(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan mutex_exit(&dev->dev_lock);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = oce_start(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->suspended = B_FALSE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->state |= STATE_MAC_STARTED;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ret);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_resume */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_init_locks(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* initialize locks */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_init(&dev->dev_lock, NULL, MUTEX_DRIVER,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_INTR_PRI(dev->intr_pri));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_init(&dev->bmbx_lock, NULL, MUTEX_DRIVER,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_INTR_PRI(dev->intr_pri));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_init_locks */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_destroy_locks(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_destroy(&dev->dev_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_destroy(&dev->bmbx_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_destroy_locks */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_unconfigure(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t state = dev->attach_state;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (state & ATTACH_MAC_REG) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) mac_unregister(dev->mac_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (state & ATTACH_STAT_INIT) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_stat_fini(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (state & ATTACH_SETUP_ADAP) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_unsetup_adapter(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (state & ATTACH_SETUP_TXRX) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_fini_txrx(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (state & ATTACH_HW_INIT) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_hw_fini(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (state & ATTACH_LOCK_INIT) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_destroy_locks(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (state & ATTACH_SETUP_INTR) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan (void) oce_teardown_intr(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (state & ATTACH_PCI_INIT) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_pci_fini(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if (state & ATTACH_PCI_CFG) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore pci_config_teardown(&dev->pci_cfg_handle);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (state & ATTACH_FM_INIT) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_fm_fini(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (state & ATTACH_DEV_INIT) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_set_driver_private(dev->dip, NULL);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_dev_list[dev->dev_list_index] = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(dev, sizeof (struct oce_dev));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_unconfigure */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_get_params(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t log_level;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint16_t mod_mask;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint16_t severity;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /*
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan * Allowed values for the driver parameters. If all values in a range
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan * is allowed, the the array has only one value.
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t fc_values[] = {OCE_FC_NONE, OCE_FC_TX, OCE_FC_RX,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_DEFAULT_FLOW_CONTROL, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t mtu_values[] = {OCE_MIN_MTU, OCE_MAX_MTU, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t tx_rs_values[] = {SIZE_256, SIZE_512, SIZE_1K, SIZE_2K, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t tx_bcl_values[] = {SIZE_128, SIZE_256, SIZE_512, SIZE_1K,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_2K, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t rx_bcl_values[] = {SIZE_128, SIZE_256, SIZE_512, SIZE_1K,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_2K, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t rq_fs_values[] = {SIZE_2K, SIZE_4K, SIZE_8K, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t rq_mb_values[] = {SIZE_2K, SIZE_4K, SIZE_8K, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t lso_capable_values[] = {0, 1, END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t fm_caps_values[] = {DDI_FM_NOT_CAPABLE, OCE_FM_CAPABILITY,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t tx_rt_values[] = {END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t rx_ppi_values[] = {END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t rx_rings_values[] = {END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t tx_rings_values[] = {END};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t log_level_values[] = {END};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* non tunables */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->rx_ring_size = OCE_DEFAULT_RX_RING_SIZE;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* configurable parameters */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->flow_control = oce_get_prop(dev, (char *)flow_control, OCE_FC_NONE,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_DEFAULT_FLOW_CONTROL, OCE_DEFAULT_FLOW_CONTROL, fc_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->mtu = oce_get_prop(dev, (char *)mtu_prop_name, OCE_MIN_MTU,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_MAX_MTU, OCE_MIN_MTU, mtu_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->tx_ring_size = oce_get_prop(dev, (char *)tx_ring_size_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_256, SIZE_2K, OCE_DEFAULT_TX_RING_SIZE, tx_rs_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->tx_bcopy_limit = oce_get_prop(dev, (char *)tx_bcopy_limit_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_128, SIZE_2K, OCE_DEFAULT_TX_BCOPY_LIMIT, tx_bcl_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->rx_bcopy_limit = oce_get_prop(dev, (char *)rx_bcopy_limit_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_128, SIZE_2K, OCE_DEFAULT_RX_BCOPY_LIMIT, rx_bcl_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->rq_frag_size = oce_get_prop(dev, (char *)rx_frag_size_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_2K, SIZE_8K, OCE_RQ_BUF_SIZE, rq_fs_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->rq_max_bufs = oce_get_prop(dev, (char *)rx_max_bufs_name, SIZE_2K,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan SIZE_8K, OCE_RQ_NUM_BUFFERS, rq_mb_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->lso_capable = oce_get_prop(dev, (char *)lso_capable_name, 0,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan 1, 1, lso_capable_values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->fm_caps = oce_get_prop(dev, (char *)fm_cap_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan DDI_FM_NOT_CAPABLE, OCE_FM_CAPABILITY, OCE_FM_CAPABILITY,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan fm_caps_values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->tx_reclaim_threshold = oce_get_prop(dev,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan (char *)tx_reclaim_threshold_name, 0, dev->tx_ring_size/2,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_DEFAULT_TX_RECLAIM_THRESHOLD, tx_rt_values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->rx_pkt_per_intr = oce_get_prop(dev, (char *)rx_pkt_per_intr_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan 0, dev->rx_ring_size/2, OCE_DEFAULT_RX_PKT_PER_INTR, rx_ppi_values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->rx_rings = oce_get_prop(dev, (char *)rx_rings_name,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore OCE_MIN_RQ, OCE_MAX_RQ, OCE_DEFAULT_RQS, rx_rings_values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->tx_rings = oce_get_prop(dev, (char *)tx_rings_name,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_DEFAULT_WQS, OCE_DEFAULT_WQS, OCE_DEFAULT_WQS, tx_rings_values);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan log_level = oce_get_prop(dev, (char *)log_level_name, 0,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_MAX_LOG_SETTINGS, OCE_DEFAULT_LOG_SETTINGS, log_level_values);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan severity = (uint16_t)(log_level & 0xffff);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mod_mask = (uint16_t)(log_level >> 16);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (mod_mask > MOD_ISR) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mod_mask = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (severity > CE_IGNORE) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan severity = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->mod_mask = mod_mask;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dev->severity = severity;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_get_params */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic int
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanoce_get_prop(struct oce_dev *dev, char *propname, int minval, int maxval,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int defval, uint32_t *values)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int value = 0;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int i = 0;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan value = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan DDI_PROP_DONTPASS, propname, defval);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (value > maxval)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan value = maxval;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (value < minval)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan value = minval;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan while (values[i] != 0xdeadface) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (values[i] == value) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan break;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan i++;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if ((i != 0) && (values[i] == 0xdeadface)) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan value = defval;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (value);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan}