678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * CDDL HEADER START
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * The contents of this file are subject to the terms of the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Common Development and Distribution License (the "License").
678453a8ed49104d8adad58f3ba591bdc39883e8speer * You may not use this file except in compliance with the License.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
678453a8ed49104d8adad58f3ba591bdc39883e8speer * or http://www.opensolaris.org/os/licensing.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * See the License for the specific language governing permissions
678453a8ed49104d8adad58f3ba591bdc39883e8speer * and limitations under the License.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * When distributing Covered Code, include this CDDL HEADER in each
678453a8ed49104d8adad58f3ba591bdc39883e8speer * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * If applicable, add the following below this CDDL HEADER, with the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * fields enclosed by brackets "[]" replaced with your own identifying
678453a8ed49104d8adad58f3ba591bdc39883e8speer * information: Portions Copyright [yyyy] [name of copyright owner]
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * CDDL HEADER END
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Use is subject to license terms.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio.c
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This file manages the virtualization resources for Neptune
678453a8ed49104d8adad58f3ba591bdc39883e8speer * devices. That is, it implements a hybrid I/O (HIO) approach in the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Solaris kernel, whereby a guest domain on an LDOMs server may
678453a8ed49104d8adad58f3ba591bdc39883e8speer * request & use hardware resources from the service domain.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_provider.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer#include <sys/nxge/nxge_impl.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer#include <sys/nxge/nxge_fzc.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer#include <sys/nxge/nxge_rxdma.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer#include <sys/nxge/nxge_txdma.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer#include <sys/nxge/nxge_hio.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * External prototypes
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerextern npi_status_t npi_rxdma_dump_rdc_table(npi_handle_t, uint8_t);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* The following function may be found in nxge_main.c */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengextern int nxge_m_mmac_remove(void *arg, int slot);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengextern int nxge_m_mmac_add_g(void *arg, const uint8_t *maddr, int rdctbl,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng boolean_t usetbl);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextern int nxge_rx_ring_start(mac_ring_driver_t rdriver, uint64_t mr_gen_num);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* The following function may be found in nxge_[t|r]xdma.c */
678453a8ed49104d8adad58f3ba591bdc39883e8speerextern npi_status_t nxge_txdma_channel_disable(nxge_t *, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speerextern nxge_status_t nxge_disable_rxdma_channel(nxge_t *, uint16_t);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Local prototypes
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic void nxge_grp_dc_append(nxge_t *, nxge_grp_t *, nxge_hio_dc_t *);
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic nxge_hio_dc_t *nxge_grp_dc_unlink(nxge_t *, nxge_grp_t *, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic void nxge_grp_dc_map(nxge_grp_t *group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These functions are used by both service & guest domains to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * decide whether they're running in an LDOMs/XEN environment
678453a8ed49104d8adad58f3ba591bdc39883e8speer * or not. If so, then the Hybrid I/O (HIO) module is initialized.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_get_environs
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Figure out if we are in a guest domain or not.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_get_environs(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer char *string;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * In the beginning, assume that we are running sans LDOMs/XEN.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->environs = SOLARIS_DOMAIN;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Are we a hybrid I/O (HIO) guest domain driver?
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if ((ddi_prop_lookup_string(DDI_DEV_T_ANY, nxge->dip,
678453a8ed49104d8adad58f3ba591bdc39883e8speer DDI_PROP_DONTPASS | DDI_PROP_NOTPROM,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "niutype", &string)) == DDI_PROP_SUCCESS) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (strcmp(string, "n2niu") == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->environs = SOLARIS_GUEST_DOMAIN;
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* So we can allocate properly-aligned memory. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->niu_type = N2_NIU;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Hybrid IO-capable guest domain"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer ddi_prop_free(string);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer#if !defined(sun4v)
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_init
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the HIO module of the NXGE driver.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This is the non-hybrid I/O version of this function.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speernxge_hio_init(nxge_t *nxge)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int i;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer if (nhd == NULL) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd = KMEM_ZALLOC(sizeof (*nhd), KM_SLEEP);
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_INIT(&nhd->lock, NULL, MUTEX_DRIVER, NULL);
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer nhd->type = NXGE_HIO_TYPE_SERVICE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->nxge_hw_p->hio = (uintptr_t)nhd;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize share and ring group structures.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDCS; i++)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tdc_is_shared[i] = B_FALSE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDC_GROUPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].ghandle = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].nxgep = nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].type = MAC_RING_TYPE_TX;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].gindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].sindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].ghandle = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].nxgep = nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].type = MAC_RING_TYPE_RX;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].gindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].sindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].started = B_FALSE;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer nxge->rx_hio_groups[i].port_default_grp = B_FALSE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].rdctbl = -1;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].n_mac_addrs = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd->hio.ldoms = B_FALSE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_OK);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer#endif
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speernxge_hio_uninit(nxge_t *nxge)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer ASSERT(nxge->nxge_hw_p->ndevs == 0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speer if (nhd != NULL) {
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speer MUTEX_DESTROY(&nhd->lock);
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speer KMEM_FREE(nhd, sizeof (*nhd));
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speer nxge->nxge_hw_p->hio = 0;
9d5b8bc52bffb83a81625224a3b60481b39a6ba9Michael Speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_dci_map
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Map a DMA channel index to a channel number.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * instance The instance number of the driver.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type The type of channel this is: Tx or Rx.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * index The index to convert to a channel number
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This function is called by nxge_ndd.c:nxge_param_set_port_rdc()
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_dci_map(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer vpc_type_t type,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int index)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer int dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (type) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer case VP_BOUND_TX:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->tx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer case VP_BOUND_RX:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->rx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (dc = 0; dc < NXGE_MAX_TDCS; dc++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if ((1 << dc) & set->owned.map) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (index == 0)
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (dc);
678453a8ed49104d8adad58f3ba591bdc39883e8speer else
678453a8ed49104d8adad58f3ba591bdc39883e8speer index--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-1);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are the general-purpose DMA channel group functions. That is,
678453a8ed49104d8adad58f3ba591bdc39883e8speer * these functions are used to manage groups of TDCs or RDCs in an HIO
678453a8ed49104d8adad58f3ba591bdc39883e8speer * environment.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * But is also expected that in the future they will be able to manage
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Crossbow groups.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer/*
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * nxge_grp_cleanup(p_nxge_t nxge)
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer *
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Remove all outstanding groups.
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer *
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Arguments:
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * nxge
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer */
651ce697a6d22736732dbe71681b0e026d33e467Michael Speervoid
651ce697a6d22736732dbe71681b0e026d33e467Michael Speernxge_grp_cleanup(p_nxge_t nxge)
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer{
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer nxge_grp_set_t *set;
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer int i;
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer MUTEX_ENTER(&nxge->group_lock);
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer /*
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Find RX groups that need to be cleaned up.
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer */
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer set = &nxge->rx_set;
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer for (i = 0; i < NXGE_LOGICAL_GROUP_MAX; i++) {
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer if (set->group[i] != NULL) {
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer KMEM_FREE(set->group[i], sizeof (nxge_grp_t));
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer set->group[i] = NULL;
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer }
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer }
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer /*
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Find TX groups that need to be cleaned up.
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer */
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer set = &nxge->tx_set;
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer for (i = 0; i < NXGE_LOGICAL_GROUP_MAX; i++) {
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer if (set->group[i] != NULL) {
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer KMEM_FREE(set->group[i], sizeof (nxge_grp_t));
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer set->group[i] = NULL;
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer }
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer }
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer MUTEX_EXIT(&nxge->group_lock);
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer}
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_add
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Add a group to an instance of NXGE.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type Tx or Rx
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitanxge_grp_t *
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_add(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_type_t type)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer int i;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = KMEM_ZALLOC(sizeof (*group), KM_SLEEP);
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->nxge = nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (type) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer case NXGE_TRANSMIT_GROUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer case EXT_TRANSMIT_GROUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->tx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer default:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->rx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->type = type;
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->active = B_TRUE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->sequence = set->sequence++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Find an empty slot for this logical group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_LOGICAL_GROUP_MAX; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (set->group[i] == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->index = i;
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->group[i] = group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_SET(set->lg.map, i);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->lg.count++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_add: %cgroup = %d.%d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == NXGE_TRANSMIT_GROUP ? 't' : 'r',
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->mac.portnum, group->sequence));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita return (group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_remove(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_grp_t *group) /* The group to remove. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer vpc_type_t type;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (group == NULL)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (group->type) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer case NXGE_TRANSMIT_GROUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer case EXT_TRANSMIT_GROUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->tx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer default:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->rx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (set->group[group->index] != group) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->group[group->index] = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_RESET(set->lg.map, group->index);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->lg.count--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* While inside the mutex, deactivate <group>. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->active = B_FALSE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_remove(%c.%d.%d) called",
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->type == NXGE_TRANSMIT_GROUP ? 't' : 'r',
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->mac.portnum, group->sequence));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Now, remove any DCs which are still active. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (group->type) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer default:
678453a8ed49104d8adad58f3ba591bdc39883e8speer type = VP_BOUND_TX;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer case NXGE_RECEIVE_GROUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer case EXT_RECEIVE_GROUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer type = VP_BOUND_RX;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (group->dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_dc_remove(nxge, type, group->dc->channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer KMEM_FREE(group, sizeof (*group));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer * nxge_grp_dc_add
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Add a DMA channel to a VR/Group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The channel to add.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_dc_add(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_grp_t *group, /* The group to add <channel> to. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer vpc_type_t type, /* Rx or Tx */
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel) /* A physical/logical channel number */
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set;
1d36aa9e69a7104197e5d02717082acf58af358aspeer nxge_status_t status = NXGE_OK;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int error = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_grp_dc_add"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group == 0)
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (type) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer case VP_BOUND_TX:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->tx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (channel > NXGE_MAX_TDCS) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add: TDC = %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_ERROR);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer case VP_BOUND_RX:
678453a8ed49104d8adad58f3ba591bdc39883e8speer set = &nxge->rx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (channel > NXGE_MAX_RDCS) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add: RDC = %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_ERROR);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer default:
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_grp_dc_add: unknown type channel(%d)", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add: %cgroup = %d.%d.%d, channel = %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == VP_BOUND_TX ? 't' : 'r',
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->mac.portnum, group->sequence, group->count, channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (group->active != B_TRUE) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* We may be in the process of removing this group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_ERROR);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (!(dc = nxge_grp_dc_find(nxge, type, channel))) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add(%d): DC FIND failed", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_ERROR);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (dc->group) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* This channel is already in use! */
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add(%d): channel already in group", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_ERROR);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->next = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->page = channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->channel = (nxge_channel_t)channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->type = type;
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (type == VP_BOUND_RX) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->init = nxge_init_rxdma_channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->uninit = nxge_uninit_rxdma_channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->init = nxge_init_txdma_channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->uninit = nxge_uninit_txdma_channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita dc->group = group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (isLDOMguest(nxge)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer error = nxge_hio_ldsv_add(nxge, dc);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (error != 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MUTEX_EXIT(&nhd->lock);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (NXGE_ERROR);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_SET(set->owned.map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->owned.count++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
1d36aa9e69a7104197e5d02717082acf58af358aspeer if ((status = (*dc->init)(nxge, channel)) != NXGE_OK) {
1d36aa9e69a7104197e5d02717082acf58af358aspeer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
1d36aa9e69a7104197e5d02717082acf58af358aspeer "nxge_grp_dc_add(%d): channel init failed", channel));
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer MUTEX_ENTER(&nhd->lock);
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer (void) memset(dc, 0, sizeof (*dc));
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_DC_RESET(set->owned.map, channel);
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer set->owned.count--;
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer MUTEX_EXIT(&nhd->lock);
5d613f0d2c6d6330c3d39e34d0ead4ed22c9192fspeer return (NXGE_ERROR);
1d36aa9e69a7104197e5d02717082acf58af358aspeer }
1d36aa9e69a7104197e5d02717082acf58af358aspeer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_dc_append(nxge, group, dc);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
330cd344428055700fc03c465aa794ab0344c63dMichael Speer if (type == VP_BOUND_TX) {
330cd344428055700fc03c465aa794ab0344c63dMichael Speer MUTEX_ENTER(&nhd->lock);
330cd344428055700fc03c465aa794ab0344c63dMichael Speer nxge->tdc_is_shared[channel] = B_FALSE;
330cd344428055700fc03c465aa794ab0344c63dMichael Speer MUTEX_EXIT(&nhd->lock);
330cd344428055700fc03c465aa794ab0344c63dMichael Speer }
330cd344428055700fc03c465aa794ab0344c63dMichael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_grp_dc_add"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
1d36aa9e69a7104197e5d02717082acf58af358aspeer return ((int)status);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_dc_remove(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer vpc_type_t type,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc_uninit_t uninit;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_grp_dc_remove"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer if ((dc = nxge_grp_dc_find(nxge, type, channel)) == 0)
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer goto nxge_grp_dc_remove_exit;
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer if ((dc->group == NULL) && (dc->next == 0) &&
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer (dc->channel == 0) && (dc->page == 0) && (dc->type == 0)) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer goto nxge_grp_dc_remove_exit;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (nxge_grp_t *)dc->group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (isLDOMguest(nxge)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) nxge_hio_intr_remove(nxge, type, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "DC remove: group = %d.%d.%d, %cdc %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->mac.portnum, group->sequence, group->count,
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == VP_BOUND_TX ? 't' : 'r', dc->channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
1d36aa9e69a7104197e5d02717082acf58af358aspeer set = dc->type == VP_BOUND_TX ? &nxge->tx_set : &nxge->rx_set;
1d36aa9e69a7104197e5d02717082acf58af358aspeer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Remove the DC from its group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_grp_dc_unlink(nxge, group, channel) != dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_grp_dc_remove(%d) failed", channel));
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer goto nxge_grp_dc_remove_exit;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer uninit = dc->uninit;
678453a8ed49104d8adad58f3ba591bdc39883e8speer channel = dc->channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_RESET(set->owned.map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->owned.count--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) memset(dc, 0, sizeof (*dc));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer (*uninit)(nxge, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speernxge_grp_dc_remove_exit:
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_grp_dc_remove"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_dc_t *
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_dc_find(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer vpc_type_t type, /* Rx or Tx */
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *current;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer current = (type == VP_BOUND_TX) ? &nhd->tdc[0] : &nhd->rdc[0];
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (!isLDOMguest(nxge)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (&current[channel]);
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* We're in a guest domain. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer int i, limit = (type == VP_BOUND_TX) ?
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_MAX_TDCS : NXGE_MAX_RDCS;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < limit; i++, current++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (current->channel == channel) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (current->vr && current->vr->nxge ==
678453a8ed49104d8adad58f3ba591bdc39883e8speer (uintptr_t)nxge) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (current);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_dc_append
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Append a DMA channel to a group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group to append to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * dc The DMA channel to append
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_dc_append(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (group->dc == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->dc = dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *current = group->dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer do {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (current->next == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer current->next = dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer current = current->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer } while (current);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_SET(group->map, dc->channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_dc_map(group);
1d36aa9e69a7104197e5d02717082acf58af358aspeer group->count++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_dc_unlink
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unlink a DMA channel fromits linked list (group).
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group (linked list) to unlink from
678453a8ed49104d8adad58f3ba591bdc39883e8speer * dc The DMA channel to append
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_dc_t *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_grp_dc_unlink(
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_t *nxge,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_grp_t *group,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *current, *previous;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
330cd344428055700fc03c465aa794ab0344c63dMichael Speer if (group == NULL) {
330cd344428055700fc03c465aa794ab0344c63dMichael Speer MUTEX_EXIT(&nxge->group_lock);
330cd344428055700fc03c465aa794ab0344c63dMichael Speer return (0);
330cd344428055700fc03c465aa794ab0344c63dMichael Speer }
330cd344428055700fc03c465aa794ab0344c63dMichael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if ((current = group->dc) == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer previous = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer do {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (current->channel == channel) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (previous)
678453a8ed49104d8adad58f3ba591bdc39883e8speer previous->next = current->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer else
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->dc = current->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer previous = current;
678453a8ed49104d8adad58f3ba591bdc39883e8speer current = current->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer } while (current);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (current == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "DC unlink: DC %d not found", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
678453a8ed49104d8adad58f3ba591bdc39883e8speer current->next = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer current->group = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng NXGE_DC_RESET(group->map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->count--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_dc_map(group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (current);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_dc_map
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Map a linked list to an array of channel numbers.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group to remap.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * It is expected that the caller will hold the correct mutex.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_grp_dc_map(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_channel_t *legend;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) memset(group->legend, 0, sizeof (group->legend));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer legend = group->legend;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = group->dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer *legend = dc->channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer legend++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = dc->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are HIO debugging functions.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_delay
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Delay <seconds> number of seconds.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group to append to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * dc The DMA channel to append
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This is a developer-only function.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_delay(
678453a8ed49104d8adad58f3ba591bdc39883e8speer int seconds)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer delay(drv_usectohz(seconds * 1000000));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic dmc_reg_name_t rx_names[] = {
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RXDMA_CFIG1", 0 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RXDMA_CFIG2", 8 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RBR_CFIG_A", 0x10 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RBR_CFIG_B", 0x18 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RBR_KICK", 0x20 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RBR_STAT", 0x28 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RBR_HDH", 0x30 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RBR_HDL", 0x38 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RCRCFIG_A", 0x40 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RCRCFIG_B", 0x48 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RCRSTAT_A", 0x50 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RCRSTAT_B", 0x58 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RCRSTAT_C", 0x60 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RX_DMA_ENT_MSK", 0x68 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RX_DMA_CTL_STAT", 0x70 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RCR_FLSH", 0x78 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RXMISC", 0x90 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RX_DMA_CTL_STAT_DBG", 0x98 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { 0, -1 }
678453a8ed49104d8adad58f3ba591bdc39883e8speer};
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic dmc_reg_name_t tx_names[] = {
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_RNG_CFIG", 0 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_RNG_HDL", 0x10 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_RNG_KICK", 0x18 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_ENT_MASK", 0x20 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_CS", 0x28 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "TxDMA_MBH", 0x30 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "TxDMA_MBL", 0x38 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "TxDMA_PRE_ST", 0x40 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_RNG_ERR_LOGH", 0x48 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_RNG_ERR_LOGL", 0x50 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "TDMC_INTR_DBG", 0x60 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_CS_DBG", 0x68 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { 0, -1 }
678453a8ed49104d8adad58f3ba591bdc39883e8speer};
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_xx2str
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Translate a register address into a string.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * offset The address of the register to translate.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are developer-only function.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerconst char *
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_rx2str(
678453a8ed49104d8adad58f3ba591bdc39883e8speer int offset)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer dmc_reg_name_t *reg = &rx_names[0];
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer offset &= DMA_CSR_MASK;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (reg->name) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (offset == reg->offset)
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (reg->name);
678453a8ed49104d8adad58f3ba591bdc39883e8speer reg++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speerconst char *
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_tx2str(
678453a8ed49104d8adad58f3ba591bdc39883e8speer int offset)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer dmc_reg_name_t *reg = &tx_names[0];
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer offset &= DMA_CSR_MASK;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (reg->name) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (offset == reg->offset)
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (reg->name);
678453a8ed49104d8adad58f3ba591bdc39883e8speer reg++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_ddi_perror
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Map a DDI error number to a string.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ddi_error The DDI error number to map.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerconst char *
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_ddi_perror(
678453a8ed49104d8adad58f3ba591bdc39883e8speer int ddi_error)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (ddi_error) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_SUCCESS:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_SUCCESS");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_FAILURE:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_FAILURE");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_NOT_WELL_FORMED:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_NOT_WELL_FORMED");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_EAGAIN:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EAGAIN");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_EINVAL:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EINVAL");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_ENOTSUP:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ENOTSUP");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_EPENDING:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EPENDING");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_ENOMEM:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ENOMEM");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_EBUSY:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EBUSY");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_ETRANSPORT:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ETRANSPORT");
678453a8ed49104d8adad58f3ba591bdc39883e8speer case DDI_ECONTEXT:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ECONTEXT");
678453a8ed49104d8adad58f3ba591bdc39883e8speer default:
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("Unknown error");
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are Sun4v HIO function definitions
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer#if defined(sun4v)
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Local prototypes
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitastatic nxge_hio_vr_t *nxge_hio_vr_share(nxge_t *);
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitastatic void nxge_hio_unshare(nxge_hio_vr_t *);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int nxge_hio_addres(nxge_hio_vr_t *, mac_ring_type_t, uint64_t *);
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitastatic void nxge_hio_remres(nxge_hio_vr_t *, mac_ring_type_t, res_map_t);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void nxge_hio_tdc_unshare(nxge_t *nxge, int dev_grpid, int channel);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void nxge_hio_rdc_unshare(nxge_t *nxge, int dev_grpid, int channel);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int nxge_hio_dc_share(nxge_t *, nxge_hio_vr_t *, mac_ring_type_t, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic void nxge_hio_dc_unshare(nxge_t *, nxge_hio_vr_t *,
678453a8ed49104d8adad58f3ba591bdc39883e8speer mac_ring_type_t, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_init
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the HIO module of the NXGE driver.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speernxge_hio_init(nxge_t *nxge)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd;
678453a8ed49104d8adad58f3ba591bdc39883e8speer int i, region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nhd == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd = KMEM_ZALLOC(sizeof (*nhd), KM_SLEEP);
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_INIT(&nhd->lock, NULL, MUTEX_DRIVER, NULL);
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer if (isLDOMguest(nxge))
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer nhd->type = NXGE_HIO_TYPE_GUEST;
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer else
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer nhd->type = NXGE_HIO_TYPE_SERVICE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->nxge_hw_p->hio = (uintptr_t)nhd;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
22c0d73a5c6cb7149517b8e67999a551350b6698speer if ((nxge->environs == SOLARIS_DOMAIN) &&
22c0d73a5c6cb7149517b8e67999a551350b6698speer (nxge->niu_type == N2_NIU)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge->niu_hsvc_available == B_TRUE) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer hsvc_info_t *niu_hsvc = &nxge->niu_hsvc;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /*
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Versions supported now are:
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * - major number >= 1 (NIU_MAJOR_VER).
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((niu_hsvc->hsvc_major >= NIU_MAJOR_VER) ||
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (niu_hsvc->hsvc_major == 1 &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu niu_hsvc->hsvc_minor == 1)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->environs = SOLARIS_SERVICE_DOMAIN;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_init: hypervisor services "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "version %d.%d",
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu niu_hsvc->hsvc_major,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu niu_hsvc->hsvc_minor));
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize share and ring group structures.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDC_GROUPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].ghandle = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].nxgep = nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].type = MAC_RING_TYPE_TX;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].gindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->tx_hio_groups[i].sindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].ghandle = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].nxgep = nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].type = MAC_RING_TYPE_RX;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].gindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].sindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].started = B_FALSE;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer nxge->rx_hio_groups[i].port_default_grp = B_FALSE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].rdctbl = -1;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->rx_hio_groups[i].n_mac_addrs = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (!isLDOMs(nxge)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd->hio.ldoms = B_FALSE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_OK);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd->hio.ldoms = B_TRUE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Fill in what we can.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (region = 0; region < NXGE_VR_SR_MAX; region++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd->vr[region].region = region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nhd->vrs = NXGE_VR_SR_MAX - 2;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize the share stuctures.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
330cd344428055700fc03c465aa794ab0344c63dMichael Speer for (i = 0; i < NXGE_MAX_TDCS; i++)
330cd344428055700fc03c465aa794ab0344c63dMichael Speer nxge->tdc_is_shared[i] = B_FALSE;
330cd344428055700fc03c465aa794ab0344c63dMichael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_VR_SR_MAX; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->shares[i].nxgep = nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->shares[i].index = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->shares[i].vrp = NULL;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->shares[i].tmap = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->shares[i].rmap = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->shares[i].rxgroup = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->shares[i].active = B_FALSE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Fill in the HV HIO function pointers. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_hv_init(nxge);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (isLDOMservice(nxge)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Hybrid IO-capable service domain"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_OK);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#endif /* defined(sun4v) */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_group_mac_add(nxge_t *nxge, nxge_ring_group_t *g,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng const uint8_t *macaddr)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int rv;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_rdc_grp_t *group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize the NXGE RDC table data structure.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = &nxge->pt_config.rdc_grps[g->rdctbl];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!group->flag) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->port = NXGE_GET_PORT_NUM(nxge->function_num);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->config_method = RDC_TABLE_ENTRY_METHOD_REP;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->flag = B_TRUE; /* This group has been configured. */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Add the MAC address.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_m_mmac_add_g((void *)nxge, macaddr,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng g->rdctbl, B_TRUE)) != 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (rv);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng g->n_mac_addrs++;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speerstatic int
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speernxge_hio_set_unicst(void *arg, const uint8_t *macaddr)
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer{
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer p_nxge_t nxgep = (p_nxge_t)arg;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer struct ether_addr addrp;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer bcopy(macaddr, (uint8_t *)&addrp, ETHERADDRL);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer if (nxge_set_mac_addr(nxgep, &addrp)) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer "<== nxge_m_unicst: set unitcast failed"));
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (EINVAL);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer }
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer nxgep->primary = B_TRUE;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (0);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer}
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer/*ARGSUSED*/
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speerstatic int
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speernxge_hio_clear_unicst(p_nxge_t nxgep, const uint8_t *mac_addr)
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer{
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer nxgep->primary = B_FALSE;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (0);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer}
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic int
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_add_mac(void *arg, const uint8_t *mac_addr)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxge_ring_group_t *group = (nxge_ring_group_t *)arg;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna p_nxge_t nxge = group->nxgep;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna int rv;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxge_hio_vr_t *vr; /* The Virtualization Region */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ASSERT(group->type == MAC_RING_TYPE_RX);
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna ASSERT(group->nxgep != NULL);
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (isLDOMguest(group->nxgep))
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(nxge->genlock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer if (!nxge->primary && group->port_default_grp) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer rv = nxge_hio_set_unicst((void *)nxge, mac_addr);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer mutex_exit(nxge->genlock);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (rv);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer }
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * If the group is associated with a VR, then only one
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * address may be assigned to the group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr = (nxge_hio_vr_t *)nxge->shares[group->sindex].vrp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((vr != NULL) && (group->n_mac_addrs)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (ENOSPC);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Program the mac address for the group.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if ((rv = nxge_hio_group_mac_add(nxge, group, mac_addr)) != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (rv);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengfind_mac_slot(nxge_mmac_t *mmac_info, const uint8_t *mac_addr)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int i;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i <= mmac_info->num_mmac; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (memcmp(mmac_info->mac_pool[i].addr, mac_addr,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ETHERADDRL) == 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (i);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic int
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_rem_mac(void *arg, const uint8_t *mac_addr)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)arg;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer struct ether_addr addrp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng p_nxge_t nxge = group->nxgep;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_mmac_t *mmac_info;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int rv, slot;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ASSERT(group->type == MAC_RING_TYPE_RX);
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna ASSERT(group->nxgep != NULL);
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (isLDOMguest(group->nxgep))
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mmac_info = &nxge->nxge_mmac_info;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng slot = find_mac_slot(mmac_info, mac_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (slot < 0) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer if (group->port_default_grp && nxge->primary) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer bcopy(mac_addr, (uint8_t *)&addrp, ETHERADDRL);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer if (ether_cmp(&addrp, &nxge->ouraddr) == 0) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer rv = nxge_hio_clear_unicst(nxge, mac_addr);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer mutex_exit(nxge->genlock);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (rv);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer } else {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer mutex_exit(nxge->genlock);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (EINVAL);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer }
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer } else {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer mutex_exit(nxge->genlock);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer return (EINVAL);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Remove the mac address for the group
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_m_mmac_remove(nxge, slot)) != 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (rv);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->n_mac_addrs--;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(nxge->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_group_start(mac_group_driver_t gdriver)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)gdriver;
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer nxge_rdc_grp_t *rdc_grp_p;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int rdctbl;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int dev_gindex;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ASSERT(group->type == MAC_RING_TYPE_RX);
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna ASSERT(group->nxgep != NULL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ASSERT(group->nxgep->nxge_mac_state == NXGE_MAC_STARTED);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->nxgep->nxge_mac_state != NXGE_MAC_STARTED)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (ENXIO);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(group->nxgep->genlock);
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (isLDOMguest(group->nxgep))
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna goto nxge_hio_group_start_exit;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dev_gindex = group->nxgep->pt_config.hw_config.def_mac_rxdma_grpid +
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->gindex;
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer rdc_grp_p = &group->nxgep->pt_config.rdc_grps[dev_gindex];
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Get an rdc table for this group.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Group ID is given by the caller, and that's the group it needs
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * to bind to. The default group is already bound when the driver
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * was attached.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For Group 0, it's RDC table was allocated at attach time
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * no need to allocate a new table.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->gindex != 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rdctbl = nxge_fzc_rdc_tbl_bind(group->nxgep,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dev_gindex, B_TRUE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (rdctbl < 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(group->nxgep->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (rdctbl);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng } else {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rdctbl = group->nxgep->pt_config.hw_config.def_mac_rxdma_grpid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->rdctbl = rdctbl;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer (void) nxge_init_fzc_rdc_tbl(group->nxgep, rdc_grp_p, rdctbl);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatnanxge_hio_group_start_exit:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->started = B_TRUE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(group->nxgep->genlock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_group_stop(mac_group_driver_t gdriver)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)gdriver;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ASSERT(group->type == MAC_RING_TYPE_RX);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(group->nxgep->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->started = B_FALSE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (isLDOMguest(group->nxgep))
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna goto nxge_hio_group_stop_exit;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Unbind the RDC table previously bound for this group.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Since RDC table for group 0 was allocated at attach
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * time, no need to unbind the table here.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->gindex != 0)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) nxge_fzc_rdc_tbl_unbind(group->nxgep, group->rdctbl);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatnanxge_hio_group_stop_exit:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(group->nxgep->genlock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_group_get(void *arg, mac_ring_type_t type, int groupid,
678453a8ed49104d8adad58f3ba591bdc39883e8speer mac_group_info_t *infop, mac_group_handle_t ghdl)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng p_nxge_t nxgep = (p_nxge_t)arg;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int dev_gindex;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer switch (type) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer case MAC_RING_TYPE_RX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = &nxgep->rx_hio_groups[groupid];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->nxgep = nxgep;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->ghandle = ghdl;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->gindex = groupid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->sindex = 0; /* not yet bound to a share */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (!isLDOMguest(nxgep)) {
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna dev_gindex =
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxgep->pt_config.hw_config.def_mac_rxdma_grpid +
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna groupid;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (nxgep->pt_config.hw_config.def_mac_rxdma_grpid ==
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna dev_gindex)
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna group->port_default_grp = B_TRUE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna infop->mgi_count =
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxgep->pt_config.rdc_grps[dev_gindex].max_rdcs;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna } else {
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna infop->mgi_count = NXGE_HIO_SHARE_MAX_CHANNELS;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna }
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_driver = (mac_group_driver_t)group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_start = nxge_hio_group_start;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_stop = nxge_hio_group_stop;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_addmac = nxge_hio_add_mac;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_remmac = nxge_hio_rem_mac;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer case MAC_RING_TYPE_TX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * 'groupid' for TX should be incremented by one since
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * the default group (groupid 0) is not known by the MAC layer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = &nxgep->tx_hio_groups[groupid + 1];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->nxgep = nxgep;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->ghandle = ghdl;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->gindex = groupid + 1;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->sindex = 0; /* not yet bound to a share */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_driver = (mac_group_driver_t)group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_start = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_stop = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_addmac = NULL; /* not needed */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_remmac = NULL; /* not needed */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* no rings associated with group initially */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng infop->mgi_count = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#if defined(sun4v)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_share_assign(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer uint64_t cookie,
678453a8ed49104d8adad58f3ba591bdc39883e8speer res_map_t *tmap,
678453a8ed49104d8adad58f3ba591bdc39883e8speer res_map_t *rmap,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_vr_t *vr)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer uint64_t slot, hv_rv;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxhv_vr_fp_t *fp;
678453a8ed49104d8adad58f3ba591bdc39883e8speer int i;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu uint64_t major;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Ask the Hypervisor to set up the VR for us
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer fp = &nhd->hio.vr;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu major = nxge->niu_hsvc.hsvc_major;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu switch (major) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu case NIU_MAJOR_VER: /* 1 */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((hv_rv = (*fp->assign)(vr->region, cookie, &vr->cookie))) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu NXGE_ERROR_MSG((nxge, HIO_CTL,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_share_assign: major %d "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "vr->assign() returned %d", major, hv_rv));
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu nxge_hio_unshare(vr);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-EIO);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu break;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu case NIU_MAJOR_VER_2: /* 2 */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu default:
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((hv_rv = (*fp->cfgh_assign)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (nxge->niu_cfg_hdl, vr->region, cookie, &vr->cookie))) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu NXGE_ERROR_MSG((nxge, HIO_CTL,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_share_assign: major %d "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "vr->assign() returned %d", major, hv_rv));
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu nxge_hio_unshare(vr);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-EIO);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu NXGE_DEBUG_MSG((nxge, HIO_CTL,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_share_assign: major %d "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "vr->assign() success", major));
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * For each shared TDC, ask the HV to find us an empty slot.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = vr->tx_group.dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_MAX_TDCS; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxhv_dc_fp_t *tx = &nhd->hio.tx;
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer hv_rv = (*tx->assign)
678453a8ed49104d8adad58f3ba591bdc39883e8speer (vr->cookie, dc->channel, &slot);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_assign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "tx->assign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->cookie, dc->channel, hv_rv));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->cookie = vr->cookie;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->page = (vp_channel_t)slot;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Inform the caller about the slot chosen. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer (*tmap) |= 1 << slot;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = dc->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * For each shared RDC, ask the HV to find us an empty slot.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = vr->rx_group.dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_MAX_RDCS; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxhv_dc_fp_t *rx = &nhd->hio.rx;
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer hv_rv = (*rx->assign)
678453a8ed49104d8adad58f3ba591bdc39883e8speer (vr->cookie, dc->channel, &slot);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_assign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "rx->assign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->cookie, dc->channel, hv_rv));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->cookie = vr->cookie;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->page = (vp_channel_t)slot;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Inform the caller about the slot chosen. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer (*rmap) |= 1 << slot;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = dc->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Chengvoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_share_unassign(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_vr_t *vr)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge = (nxge_t *)vr->nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxhv_vr_fp_t *fp;
678453a8ed49104d8adad58f3ba591bdc39883e8speer uint64_t hv_rv;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = vr->tx_group.dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxhv_dc_fp_t *tx = &nhd->hio.tx;
678453a8ed49104d8adad58f3ba591bdc39883e8speer hv_rv = (*tx->unassign)(vr->cookie, dc->page);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_unassign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "tx->unassign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->cookie, dc->page, hv_rv));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = dc->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = vr->rx_group.dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxhv_dc_fp_t *rx = &nhd->hio.rx;
678453a8ed49104d8adad58f3ba591bdc39883e8speer hv_rv = (*rx->unassign)(vr->cookie, dc->page);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_unassign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "rx->unassign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->cookie, dc->page, hv_rv));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = dc->next;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer fp = &nhd->hio.vr;
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (fp->unassign) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer hv_rv = (*fp->unassign)(vr->cookie);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_unassign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "vr->assign(%x) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->cookie, hv_rv));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_alloc(void *arg, mac_share_handle_t *shandle)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng p_nxge_t nxge = (p_nxge_t)arg;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr; /* The Virtualization Region */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nhd->hio.vr.assign == 0 || nhd->hio.tx.assign == 0 ||
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd->hio.rx.assign == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, HIO_CTL, "HV assign function(s) NULL"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Get a VR.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita if ((vr = nxge_hio_vr_share(nxge)) == 0)
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (EAGAIN);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp = &nxge->shares[vr->region];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->nxgep = nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->index = vr->region;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->vrp = (void *)vr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->tmap = shp->rmap = 0; /* to be assigned by ms_sbind */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rxgroup = 0; /* to be assigned by ms_sadd */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->active = B_FALSE; /* not bound yet */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *shandle = (mac_share_handle_t)shp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_share"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengvoid
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_free(mac_share_handle_t shandle)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Clear internal handle state.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr = shp->vrp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->vrp = (void *)NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->index = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->tmap = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rmap = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rxgroup = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->active = B_FALSE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Free VR resource.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_unshare(vr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengvoid
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_query(mac_share_handle_t shandle, mac_ring_type_t type,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_ring_handle_t *rings, uint_t *n_rings)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_t *nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_handle_t *rh;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uint32_t offset;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge = shp->nxgep;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (type) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_RING_TYPE_RX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rh = nxge->rx_ring_handles;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng offset = nxge->pt_config.hw_config.start_rdc;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_RING_TYPE_TX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rh = nxge->tx_ring_handles;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng offset = nxge->pt_config.hw_config.tdc.start;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * In version 1.0, we may only give a VR 2 RDCs/TDCs. Not only that,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * but the HV has statically assigned the channels like so:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR0: RDC0 & RDC1
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR1: RDC2 & RDC3, etc.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * The TDCs are assigned in exactly the same way.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (rings != NULL) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rings[0] = rh[(shp->index * 2) - offset].ring_handle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rings[1] = rh[(shp->index * 2 + 1) - offset].ring_handle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (n_rings != NULL) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *n_rings = 2;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengint
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_add_group(mac_share_handle_t shandle,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_group_driver_t ghandle)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_t *nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *rg = (nxge_ring_group_t *)ghandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr; /* The Virtualization Region */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_grp_t *group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int i;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (rg->sindex != 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* the group is already bound to a share */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (EALREADY);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux /*
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * If we are adding a group 0 to a share, this
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * is not correct.
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux */
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux ASSERT(rg->gindex != 0);
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge = rg->nxgep;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr = shp->vrp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (rg->type) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_RING_TYPE_RX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Make sure that the group has the right rings associated
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * for the share. In version 1.0, we may only give a VR
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * 2 RDCs. Not only that, but the HV has statically
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * assigned the channels like so:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR0: RDC0 & RDC1
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR1: RDC2 & RDC3, etc.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = nxge->rx_set.group[rg->gindex];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->count > 2) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* a share can have at most 2 rings */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (EINVAL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_RDCS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->map & (1 << i)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((i != shp->index * 2) &&
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (i != (shp->index * 2 + 1))) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * A group with invalid rings was
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * attempted to bind to this share
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (EINVAL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rg->sindex = vr->region;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr->rdc_tbl = rg->rdctbl;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rxgroup = vr->rdc_tbl;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_RING_TYPE_TX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Make sure that the group has the right rings associated
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * for the share. In version 1.0, we may only give a VR
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * 2 TDCs. Not only that, but the HV has statically
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * assigned the channels like so:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR0: TDC0 & TDC1
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR1: TDC2 & TDC3, etc.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = nxge->tx_set.group[rg->gindex];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->count > 2) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* a share can have at most 2 rings */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (EINVAL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDCS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->map & (1 << i)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((i != shp->index * 2) &&
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (i != (shp->index * 2 + 1))) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * A group with invalid rings was
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * attempted to bind to this share
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (EINVAL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr->tdc_tbl = nxge->pt_config.hw_config.def_mac_txdma_grpid +
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rg->gindex;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rg->sindex = vr->region;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengint
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_rem_group(mac_share_handle_t shandle,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_group_driver_t ghandle)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)ghandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr; /* The Virtualization Region */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int rv = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr = shp->vrp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (group->type) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_RING_TYPE_RX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->sindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr->rdc_tbl = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rxgroup = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_RING_TYPE_TX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->sindex = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr->tdc_tbl = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (rv);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengint
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_bind(mac_share_handle_t shandle, uint64_t cookie,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uint64_t *rcookie)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_t *nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uint64_t rmap, tmap, hv_rmap, hv_tmap;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int rv;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(shp != NULL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(shp->nxgep != NULL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(shp->vrp != NULL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge = shp->nxgep;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr = (nxge_hio_vr_t *)shp->vrp;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Add resources to the share.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For each DMA channel associated with the VR, bind its resources
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * to the VR.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer tmap = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rv = nxge_hio_addres(vr, MAC_RING_TYPE_TX, &tmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (rv != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (rv);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer rmap = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rv = nxge_hio_addres(vr, MAC_RING_TYPE_RX, &rmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (rv != 0) {
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(vr, MAC_RING_TYPE_TX, tmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (rv);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Ask the Hypervisor to set up the VR and allocate slots for
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * each rings associated with the VR.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng hv_tmap = hv_rmap = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_hio_share_assign(nxge, cookie,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng &hv_tmap, &hv_rmap, vr))) {
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(vr, MAC_RING_TYPE_TX, tmap);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_remres(vr, MAC_RING_TYPE_RX, rmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (rv);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer shp->active = B_TRUE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->tmap = hv_tmap;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rmap = hv_rmap;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* high 32 bits are cfg_hdl and low 32 bits are HV cookie */
678453a8ed49104d8adad58f3ba591bdc39883e8speer *rcookie = (((uint64_t)nxge->niu_cfg_hdl) << 32) | vr->cookie;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_unbind(mac_share_handle_t shandle)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * First, unassign the VR (take it back),
678453a8ed49104d8adad58f3ba591bdc39883e8speer * so we can enable interrupts again.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_share_unassign(shp->vrp);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Free Ring Resources for TX and RX
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(shp->vrp, MAC_RING_TYPE_TX, shp->tmap);
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(shp->vrp, MAC_RING_TYPE_RX, shp->rmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_vr_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Find an unused Virtualization Region (VR).
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitanxge_hio_vr_t *
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_vr_share(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_vr_t *vr;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer int first, limit, region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_vr_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita if (nhd->vrs == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Find an empty virtual region (VR). */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge->function_num == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer // FUNC0_VIR0 'belongs' to NIU port 0.
678453a8ed49104d8adad58f3ba591bdc39883e8speer first = FUNC0_VIR1;
678453a8ed49104d8adad58f3ba591bdc39883e8speer limit = FUNC2_VIR0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else if (nxge->function_num == 1) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer // FUNC2_VIR0 'belongs' to NIU port 1.
678453a8ed49104d8adad58f3ba591bdc39883e8speer first = FUNC2_VIR1;
678453a8ed49104d8adad58f3ba591bdc39883e8speer limit = FUNC_VIR_MAX;
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
678453a8ed49104d8adad58f3ba591bdc39883e8speer cmn_err(CE_WARN,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Shares not supported on function(%d) at this time.\n",
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->function_num);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (region = first; region < limit; region++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nhd->vr[region].nxge == 0)
678453a8ed49104d8adad58f3ba591bdc39883e8speer break;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (region == limit) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr = &nhd->vr[region];
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->nxge = (uintptr_t)nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->region = (uintptr_t)region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nhd->vrs--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_vr_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita return (vr);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_unshare(
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_vr_t *vr)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge = (nxge_t *)vr->nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr_region_t region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (!nxge) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "vr->nxge is NULL"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This function is no longer called, but I will keep it
678453a8ed49104d8adad58f3ba591bdc39883e8speer * here in case we want to revisit this topic in the future.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_hostinfo_uninit(nxge, vr);
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * XXX: This is done by ms_sremove?
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * (void) nxge_fzc_rdc_tbl_unbind(nxge, vr->rdc_tbl);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer region = vr->region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) memset(vr, 0, sizeof (*vr));
678453a8ed49104d8adad58f3ba591bdc39883e8speer vr->region = region;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nhd->vrs++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speernxge_hio_addres(nxge_hio_vr_t *vr, mac_ring_type_t type, uint64_t *map)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer nxge_t *nxge;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_grp_t *group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int groupid;
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer int i, rv = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int max_dcs;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(vr != NULL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(vr->nxge != NULL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer nxge = (nxge_t *)vr->nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_addres"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For each ring associated with the group, add the resources
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * to the group and bind.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng max_dcs = (type == MAC_RING_TYPE_TX) ? NXGE_MAX_TDCS : NXGE_MAX_RDCS;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (type == MAC_RING_TYPE_TX) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* set->group is an array of group indexed by a port group id */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng groupid = vr->tdc_tbl -
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->pt_config.hw_config.def_mac_txdma_grpid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = nxge->tx_set.group[groupid];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng } else {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* set->group is an array of group indexed by a port group id */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng groupid = vr->rdc_tbl -
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge->pt_config.hw_config.def_mac_rxdma_grpid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = nxge->rx_set.group[groupid];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ASSERT(group != NULL);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->map == 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng NXGE_DEBUG_MSG((nxge, HIO_CTL, "There is no rings associated "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "with this VR"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (EINVAL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < max_dcs; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->map & (1 << i)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_hio_dc_share(nxge, vr, type, i)) < 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (*map == 0) /* Couldn't get even one DC. */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-rv);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng else
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *map |= (1 << i);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer if ((*map == 0) || (rv != 0)) {
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer NXGE_DEBUG_MSG((nxge, HIO_CTL,
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer "<== nxge_hio_addres: rv(%x)", rv));
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer return (EIO);
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_addres"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_remres(
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_vr_t *vr,
678453a8ed49104d8adad58f3ba591bdc39883e8speer mac_ring_type_t type,
678453a8ed49104d8adad58f3ba591bdc39883e8speer res_map_t res_map)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge = (nxge_t *)vr->nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (!nxge) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_remres: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "vr->nxge is NULL"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_remres(%lx)", res_map));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For each ring bound to the group, remove the DMA resources
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * from the group and unbind.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (type == MAC_RING_TYPE_TX ? &vr->tx_group : &vr->rx_group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer while (group->dc) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc = group->dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_RESET(res_map, dc->page);
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_unshare(nxge, vr, type, dc->channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (res_map) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_remres: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "res_map %lx", res_map));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_remres"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_tdc_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Share an unused TDC channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * A.7.3 Reconfigure Tx DMA channel
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Disable TxDMA A.9.6.10
678453a8ed49104d8adad58f3ba591bdc39883e8speer * [Rebind TxDMA channel to Port A.9.6.7]
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * We don't have to Rebind the TDC to the port - it always already bound.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Soft Reset TxDMA A.9.6.2
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This procedure will be executed by nxge_init_txdma_channel() in the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * guest domain:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Re-initialize TxDMA A.9.6.8
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure TxDMA
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable TxDMA A.9.6.9
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_tdc_share(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
330cd344428055700fc03c465aa794ab0344c63dMichael Speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set = &nxge->tx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer tx_ring_t *ring;
22c0d73a5c6cb7149517b8e67999a551350b6698speer int count;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_tdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Wait until this channel is idle.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer ring = nxge->tx_rings->rings[channel];
48056c53c7a3d65cab2626a67418401d97b58c1aMichael Speer ASSERT(ring != NULL);
22c0d73a5c6cb7149517b8e67999a551350b6698speer
22c0d73a5c6cb7149517b8e67999a551350b6698speer (void) atomic_swap_32(&ring->tx_ring_offline, NXGE_TX_RING_OFFLINING);
6895688e5f0e768b4c49108ae73903afa1bd1997speer if (ring->tx_ring_busy) {
6895688e5f0e768b4c49108ae73903afa1bd1997speer /*
6895688e5f0e768b4c49108ae73903afa1bd1997speer * Wait for 30 seconds.
6895688e5f0e768b4c49108ae73903afa1bd1997speer */
6895688e5f0e768b4c49108ae73903afa1bd1997speer for (count = 30 * 1000; count; count--) {
6895688e5f0e768b4c49108ae73903afa1bd1997speer if (ring->tx_ring_offline & NXGE_TX_RING_OFFLINED) {
6895688e5f0e768b4c49108ae73903afa1bd1997speer break;
6895688e5f0e768b4c49108ae73903afa1bd1997speer }
22c0d73a5c6cb7149517b8e67999a551350b6698speer
6895688e5f0e768b4c49108ae73903afa1bd1997speer drv_usecwait(1000);
6895688e5f0e768b4c49108ae73903afa1bd1997speer }
22c0d73a5c6cb7149517b8e67999a551350b6698speer
6895688e5f0e768b4c49108ae73903afa1bd1997speer if (count == 0) {
6895688e5f0e768b4c49108ae73903afa1bd1997speer (void) atomic_swap_32(&ring->tx_ring_offline,
6895688e5f0e768b4c49108ae73903afa1bd1997speer NXGE_TX_RING_ONLINE);
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_tdc_share: "
6895688e5f0e768b4c49108ae73903afa1bd1997speer "Tx ring %d was always BUSY", channel));
6895688e5f0e768b4c49108ae73903afa1bd1997speer return (-EIO);
6895688e5f0e768b4c49108ae73903afa1bd1997speer }
6895688e5f0e768b4c49108ae73903afa1bd1997speer } else {
22c0d73a5c6cb7149517b8e67999a551350b6698speer (void) atomic_swap_32(&ring->tx_ring_offline,
6895688e5f0e768b4c49108ae73903afa1bd1997speer NXGE_TX_RING_OFFLINED);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
330cd344428055700fc03c465aa794ab0344c63dMichael Speer MUTEX_ENTER(&nhd->lock);
330cd344428055700fc03c465aa794ab0344c63dMichael Speer nxge->tdc_is_shared[channel] = B_TRUE;
330cd344428055700fc03c465aa794ab0344c63dMichael Speer MUTEX_EXIT(&nhd->lock);
330cd344428055700fc03c465aa794ab0344c63dMichael Speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_remove(nxge, VP_BOUND_TX, channel) != NXGE_OK) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_tdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to remove interrupt for TxDMA channel %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer channel));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-EINVAL);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Disable TxDMA A.9.6.10 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) nxge_txdma_channel_disable(nxge, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* The SD is sharing this channel. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_SET(set->shared.map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->shared.count++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
1d36aa9e69a7104197e5d02717082acf58af358aspeer /* Soft Reset TxDMA A.9.6.2 */
1d36aa9e69a7104197e5d02717082acf58af358aspeer nxge_grp_dc_remove(nxge, VP_BOUND_TX, channel);
1d36aa9e69a7104197e5d02717082acf58af358aspeer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the DC-specific FZC control registers.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * -----------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_init_fzc_tdc(nxge, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_tdc_share: FZC TDC failed: %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_tdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_rdc_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Share an unused RDC channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This is the latest version of the procedure to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure an Rx DMA channel:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * A.6.3 Reconfigure Rx DMA channel
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Stop RxMAC A.9.2.6
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Drain IPP Port A.9.3.6
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Stop and reset RxDMA A.9.5.3
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This procedure will be executed by nxge_init_rxdma_channel() in the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * guest domain:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize RxDMA A.9.5.4
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure RxDMA
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxDMA A.9.5.5
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * We will do this here, since the RDC is a canalis non grata:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxMAC A.9.2.10
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_rdc_share(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_vr_t *vr,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set = &nxge->rx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_rdc_grp_t *rdc_grp;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_rdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Disable interrupts. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_remove(nxge, VP_BOUND_RX, channel) != NXGE_OK) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to remove interrupt for RxDMA channel %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (NXGE_ERROR);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop RxMAC = A.9.2.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_rx_mac_disable(nxge) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to disable RxMAC"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Drain IPP Port = A.9.3.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) nxge_ipp_drain(nxge);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop and reset RxDMA = A.9.5.3 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer // De-assert EN: RXDMA_CFIG1[31] = 0 (DMC+00000 )
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_disable_rxdma_channel(nxge, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to disable RxDMA channel %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* The SD is sharing this channel. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_SET(set->shared.map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->shared.count++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
1d36aa9e69a7104197e5d02717082acf58af358aspeer // Assert RST: RXDMA_CFIG1[30] = 1
1d36aa9e69a7104197e5d02717082acf58af358aspeer nxge_grp_dc_remove(nxge, VP_BOUND_RX, channel);
1d36aa9e69a7104197e5d02717082acf58af358aspeer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * The guest domain will reconfigure the RDC later.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * But in the meantime, we must re-enable the Rx MAC so
678453a8ed49104d8adad58f3ba591bdc39883e8speer * that we can start receiving packets again on the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * remaining RDCs:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxMAC = A.9.2.10
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_rx_mac_enable(nxge) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_rdc_share: Rx MAC still disabled"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the DC-specific FZC control registers.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * -----------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_init_fzc_rdc(nxge, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_rdc_share: RZC RDC failed: %ld", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer * Update the RDC group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer rdc_grp = &nxge->pt_config.rdc_grps[vr->rdc_tbl];
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_SET(rdc_grp->map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_rdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_dc_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Share a DMA channel with a guest domain.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * vr The VR that <channel> will belong to.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type Tx or Rx.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * channel Channel to share
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speerint
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_dc_share(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_vr_t *vr,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_ring_type_t type,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer int slot;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_dc_share(%cdc %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == MAC_RING_TYPE_TX ? 't' : 'r', channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* -------------------------------------------------- */
678453a8ed49104d8adad58f3ba591bdc39883e8speer slot = (type == MAC_RING_TYPE_TX) ?
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_tdc_share(nxge, channel) :
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_rdc_share(nxge, vr, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (slot < 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (type == MAC_RING_TYPE_RX) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_rdc_unshare(nxge, vr->rdc_tbl, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_tdc_unshare(nxge, vr->tdc_tbl, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (slot);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Tag this channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * --------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = type == MAC_RING_TYPE_TX ? &nhd->tdc[channel] : &nhd->rdc[channel];
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->vr = vr;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->channel = (nxge_channel_t)channel;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nhd->lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * vr->[t|r]x_group is used by the service domain to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * keep track of its shared DMA channels.
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_ENTER(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (type == MAC_RING_TYPE_TX ? &vr->tx_group : &vr->rx_group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita dc->group = group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Initialize <group>, if necessary */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (group->count == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->nxge = nxge;
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->type = (type == MAC_RING_TYPE_TX) ?
678453a8ed49104d8adad58f3ba591bdc39883e8speer VP_BOUND_TX : VP_BOUND_RX;
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->sequence = nhd->sequence++;
678453a8ed49104d8adad58f3ba591bdc39883e8speer group->active = B_TRUE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer MUTEX_EXIT(&nxge->group_lock);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, HIO_CTL,
678453a8ed49104d8adad58f3ba591bdc39883e8speer "DC share: %cDC %d was assigned to slot %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == MAC_RING_TYPE_TX ? 'T' : 'R', channel, slot));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_dc_append(nxge, group, dc);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_dc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_tdc_unshare
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unshare a TDC.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The channel to unshare (add again).
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_tdc_unshare(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int dev_grpid,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_set_t *set = &nxge->tx_set;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_grp_t *group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int grpid;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_tdc_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_RESET(set->shared.map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->shared.count--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng grpid = dev_grpid - nxge->pt_config.hw_config.def_mac_txdma_grpid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = set->group[grpid];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita if ((nxge_grp_dc_add(nxge, group, VP_BOUND_TX, channel))) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_tdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to initialize TxDMA channel %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Re-add this interrupt. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_add(nxge, VP_BOUND_TX, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_tdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to add interrupt for TxDMA channel %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_tdc_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_rdc_unshare
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unshare an RDC: add it to the SD's RDC groups (tables).
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The channel to unshare (add again).
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_rdc_unshare(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int dev_grpid,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_grp_set_t *set = &nxge->rx_set;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_grp_t *group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int grpid;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int i;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_rdc_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop RxMAC = A.9.2.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_rx_mac_disable(nxge) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to disable RxMAC"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Drain IPP Port = A.9.3.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) nxge_ipp_drain(nxge);
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop and reset RxDMA = A.9.5.3 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer // De-assert EN: RXDMA_CFIG1[31] = 0 (DMC+00000 )
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_disable_rxdma_channel(nxge, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to disable RxDMA channel %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DC_RESET(set->shared.map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer set->shared.count--;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng grpid = dev_grpid - nxge->pt_config.hw_config.def_mac_rxdma_grpid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group = set->group[grpid];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Assert RST: RXDMA_CFIG1[30] = 1
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize RxDMA A.9.5.4
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure RxDMA
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxDMA A.9.5.5
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita if ((nxge_grp_dc_add(nxge, group, VP_BOUND_RX, channel))) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Be sure to re-enable the RX MAC. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_rx_mac_enable(nxge) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "nxge_hio_rdc_share: Rx MAC still disabled"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to initialize RxDMA channel %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxMAC = A.9.2.10
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_rx_mac_enable(nxge) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "nxge_hio_rdc_share: Rx MAC still disabled"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Re-add this interrupt. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_add(nxge, VP_BOUND_RX, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_rdc_unshare: Failed to add interrupt for "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "RxDMA CHANNEL %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_rdc_unshare"));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < NXGE_MAX_RDCS; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (nxge->rx_ring_handles[i].channel == channel) {
9f26b864f51e1fcd02cc7c4f6f34034d7c80df85Venugopal Iyer (void) nxge_rx_ring_start(
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (mac_ring_driver_t)&nxge->rx_ring_handles[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer nxge->rx_ring_handles[i].ring_gen_num);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer/*
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_dc_unshare
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unshare (reuse) a DMA channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge
678453a8ed49104d8adad58f3ba591bdc39883e8speer * vr The VR that <channel> belongs to.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type Tx or Rx.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The DMA channel to reuse.
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Notes:
678453a8ed49104d8adad58f3ba591bdc39883e8speer *
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Context:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer */
678453a8ed49104d8adad58f3ba591bdc39883e8speervoid
678453a8ed49104d8adad58f3ba591bdc39883e8speernxge_hio_dc_unshare(
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_t *nxge,
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_vr_t *vr,
678453a8ed49104d8adad58f3ba591bdc39883e8speer mac_ring_type_t type,
678453a8ed49104d8adad58f3ba591bdc39883e8speer int channel)
678453a8ed49104d8adad58f3ba591bdc39883e8speer{
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_grp_t *group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_dc_t *dc;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_dc_unshare(%cdc %d)",
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == MAC_RING_TYPE_TX ? 't' : 'r', channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Unlink the channel from its group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* -------------------------------------------------- */
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (type == MAC_RING_TYPE_TX) ? &vr->tx_group : &vr->rx_group;
1d36aa9e69a7104197e5d02717082acf58af358aspeer NXGE_DC_RESET(group->map, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if ((dc = nxge_grp_dc_unlink(nxge, group, channel)) == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL,
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_dc_unshare(%d) failed", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return;
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->vr = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc->cookie = 0;
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (type == MAC_RING_TYPE_RX) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_rdc_unshare(nxge, vr->rdc_tbl, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer } else {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_tdc_unshare(nxge, vr->tdc_tbl, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer }
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_dc_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer}
678453a8ed49104d8adad58f3ba591bdc39883e8speer
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux/*
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * nxge_hio_rxdma_bind_intr():
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux *
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * For the guest domain driver, need to bind the interrupt group
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * and state to the rx_rcr_ring_t.
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux */
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Drouxint
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Drouxnxge_hio_rxdma_bind_intr(nxge_t *nxge, rx_rcr_ring_t *ring, int channel)
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux{
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux nxge_hio_dc_t *dc;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux nxge_ldgv_t *control;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux nxge_ldg_t *group;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux nxge_ldv_t *device;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux /*
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * Find the DMA channel.
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux */
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux if (!(dc = nxge_grp_dc_find(nxge, VP_BOUND_RX, channel))) {
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux return (NXGE_ERROR);
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux }
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux /*
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * Get the control structure.
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux */
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux control = nxge->ldgvp;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux if (control == NULL) {
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux return (NXGE_ERROR);
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux }
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux group = &control->ldgp[dc->ldg.vector];
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux device = &control->ldvp[dc->ldg.ldsv];
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux MUTEX_ENTER(&ring->lock);
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux ring->ldgp = group;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux ring->ldvp = device;
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux MUTEX_EXIT(&ring->lock);
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux return (NXGE_OK);
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux}
678453a8ed49104d8adad58f3ba591bdc39883e8speer#endif /* if defined(sun4v) */