3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER START
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The contents of this file are subject to the terms of the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Common Development and Distribution License (the "License").
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You may not use this file except in compliance with the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * or http://www.opensolaris.org/os/licensing.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * See the License for the specific language governing permissions
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * and limitations under the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * When distributing Covered Code, include this CDDL HEADER in each
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * If applicable, add the following below this CDDL HEADER, with the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * fields enclosed by brackets "[]" replaced with your own identifying
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * information: Portions Copyright [yyyy] [name of copyright owner]
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER END
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use is subject to license terms.
b97d6ca7333c353b6ca20c20c99fb1be8d32a8deMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hxge_impl.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hxge_vmac.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hxge_pfc.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hpi_pfc.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hxge_status_t hxge_get_mac_addr_properties(p_hxge_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_use_cfg_hydra_properties(p_hxge_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_use_cfg_dma_config(p_hxge_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_use_cfg_class_config(p_hxge_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_set_hw_dma_config(p_hxge_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_set_hw_class_config(p_hxge_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void hxge_ldgv_setup(p_hxge_ldg_t *ldgp, p_hxge_ldv_t *ldvp, uint8_t ldv,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t endldg, int *ngrps);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsextern uint16_t hxge_rcr_timeout;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsextern uint16_t hxge_rcr_threshold;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsextern uint32_t hxge_rbr_size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsextern uint32_t hxge_rcr_size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
b97d6ca7333c353b6ca20c20c99fb1be8d32a8deMilan Jurikextern uint_t hxge_rx_intr(caddr_t, caddr_t);
b97d6ca7333c353b6ca20c20c99fb1be8d32a8deMilan Jurikextern uint_t hxge_tx_intr(caddr_t, caddr_t);
b97d6ca7333c353b6ca20c20c99fb1be8d32a8deMilan Jurikextern uint_t hxge_vmac_intr(caddr_t, caddr_t);
b97d6ca7333c353b6ca20c20c99fb1be8d32a8deMilan Jurikextern uint_t hxge_syserr_intr(caddr_t, caddr_t);
b97d6ca7333c353b6ca20c20c99fb1be8d32a8deMilan Jurikextern uint_t hxge_pfc_intr(caddr_t, caddr_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Entry point to populate configuration parameters into the master hxge
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * data structure and to update the NDD parameter list.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_get_config_properties(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_status_t status = HXGE_OK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, VPD_CTL, " ==> hxge_get_config_properties"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep->hxge_hw_p == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " hxge_get_config_properties: common hardware not set"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->classifier.tcam_size = TCAM_HXGE_TCAM_MAX_ENTRY;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = hxge_get_mac_addr_properties(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (status != HXGE_OK) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " hxge_get_config_properties: mac addr properties failed"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, VPD_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " ==> hxge_get_config_properties: Hydra"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_use_cfg_hydra_properties(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, VPD_CTL, " <== hxge_get_config_properties"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_set_hw_vlan_class_config(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_param_t param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint_t vlan_cnt;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int *vlan_cfg_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_param_map_t *vmap;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs char *prop;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_class_pt_cfg_t p_class_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t good_cfg[32];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int good_count = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_mv_cfg_t *vlan_tbl;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " ==> hxge_set_hw_vlan_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_class_cfgp = (p_hxge_class_pt_cfg_t)&hxgep->class_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs param_arr = hxgep->param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[param_vlan_ids].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * uint32_t array, each array entry specifying a VLAN id
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i <= VLAN_ID_MAX; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_class_cfgp->vlan_tbl[i].flag = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_tbl = (hxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, hxgep->dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &vlan_cfg_val, &vlan_cnt) != DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < vlan_cnt; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vmap = (hxge_param_map_t *)&vlan_cfg_val[i];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((vmap->param_id) && (vmap->param_id <= VLAN_ID_MAX)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG2_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " hxge_vlan_config vlan id %d", vmap->param_id));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs good_cfg[good_count] = vlan_cfg_val[i];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (vlan_tbl[vmap->param_id].flag == 0)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs good_count++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_tbl[vmap->param_id].flag = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(vlan_cfg_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (good_count != vlan_cnt) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->dip, prop, (int *)good_cfg, good_count);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " <== hxge_set_hw_vlan_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read param_vlan_ids and param_implicit_vlan_id properties from either
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * hxge.conf or OBP. Update the soft properties. Populate these
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * properties into the hxge data structure.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_use_cfg_vlan_class_config(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint_t vlan_cnt;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int *vlan_cfg_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int status;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_param_t param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs char *prop;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t implicit_vlan_id = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int *int_prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint_t prop_len;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_param_t pa;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " ==> hxge_use_cfg_vlan_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs param_arr = hxgep->param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[param_vlan_ids].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, hxgep->dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &vlan_cfg_val, &vlan_cnt);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (status == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = ddi_prop_update_int_array(DDI_DEV_T_NONE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->dip, prop, vlan_cfg_val, vlan_cnt);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(vlan_cfg_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pa = &param_arr[param_implicit_vlan_id];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = pa->fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, hxgep->dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &int_prop_val, &prop_len) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs implicit_vlan_id = (uint32_t)*int_prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((implicit_vlan_id >= pa->minimum) ||
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (implicit_vlan_id <= pa->maximum)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = ddi_prop_update_int(DDI_DEV_T_NONE, hxgep->dip,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop, (int)implicit_vlan_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(int_prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_set_hw_vlan_class_config(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " <== hxge_use_cfg_vlan_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read in the configuration parameters from either hxge.conf or OBP and
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * populate the master data structure hxge.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use these parameters to update the soft properties and the ndd array.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_use_cfg_hydra_properties(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " ==> hxge_use_cfg_hydra_properties"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_use_cfg_dma_config(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_use_cfg_vlan_class_config(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_use_cfg_class_config(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read in the hardware (fcode) properties and use these properties
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * to update the ndd array.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_get_param_soft_properties(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " <== hxge_use_cfg_hydra_properties"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read param_accept_jumbo, param_rxdma_intr_time, and param_rxdma_intr_pkts
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * from either hxge.conf or OBP.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Update the soft properties.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Populate these properties into the hxge data structure for latter use.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_use_cfg_dma_config(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int tx_ndmas, rx_ndmas;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_dma_pt_cfg_t p_dma_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_hw_pt_cfg_t p_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs dev_info_t *dip;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_param_t param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs char *prop;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int *prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint_t prop_len;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " ==> hxge_use_cfg_dma_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs param_arr = hxgep->param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp = (p_hxge_dma_pt_cfg_t)&hxgep->pt_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp = (p_hxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs dip = hxgep->dip;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tx_ndmas = 4;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp->start_tdc = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp->max_tdcs = hxgep->max_tdcs = tx_ndmas;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->tdc_mask = (tx_ndmas - 1);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, "==> hxge_use_cfg_dma_config: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "p_cfgp 0x%llx max_tdcs %d hxgep->max_tdcs %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp, p_cfgp->max_tdcs, hxgep->max_tdcs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rx_ndmas = 4;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp->start_rdc = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp->max_rdcs = hxgep->max_rdcs = rx_ndmas;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp->start_ldg = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp->max_ldgs = HXGE_INT_MAX_LDG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, "==> hxge_use_default_dma_config: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "p_cfgp 0x%llx max_rdcs %d hxgep->max_rdcs %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp, p_cfgp->max_rdcs, hxgep->max_rdcs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, "==> hxge_use_cfg_dma_config: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "p_cfgp 0x%016llx start_ldg %d hxgep->max_ldgs %d ",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp, p_cfgp->start_ldg, p_cfgp->max_ldgs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * add code for individual rdc properties
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[param_accept_jumbo].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->dip, prop, prop_val, prop_len);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[param_rxdma_intr_time].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->dip, prop, prop_val, prop_len);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[param_rxdma_intr_pkts].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->dip, prop, prop_val, prop_len);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_set_hw_dma_config(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, "<== hxge_use_cfg_dma_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_use_cfg_class_config(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_set_hw_class_config(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_set_hw_dma_config(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_dma_pt_cfg_t p_dma_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_hw_pt_cfg_t p_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, "==> hxge_set_hw_dma_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp = (p_hxge_dma_pt_cfg_t)&hxgep->pt_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp = (p_hxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Transmit DMA Channels */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->ntdc = p_cfgp->max_tdcs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Receive DMA Channels */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->nrdc = p_cfgp->max_rdcs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp->rbr_size = hxge_rbr_size;
8ad8db65d4781f61f1fd519144f555e6045100e1Michael Speer if (hxge_rcr_size > HXGE_RCR_MAX)
8ad8db65d4781f61f1fd519144f555e6045100e1Michael Speer hxge_rcr_size = HXGE_RCR_MAX;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp->rcr_size = hxge_rcr_size;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " <== hxge_set_hw_dma_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsboolean_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_check_rxdma_port_member(p_hxge_t hxgep, uint8_t rdc)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_dma_pt_cfg_t p_dma_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_hw_pt_cfg_t p_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int status = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG2_CTL, "==> hxge_check_rxdma_port_member"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp = (p_hxge_dma_pt_cfg_t)&hxgep->pt_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp = (p_hxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Receive DMA Channels */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (rdc < p_cfgp->max_rdcs)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG2_CTL, " <== hxge_check_rxdma_port_member"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsboolean_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_check_txdma_port_member(p_hxge_t hxgep, uint8_t tdc)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_dma_pt_cfg_t p_dma_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_hw_pt_cfg_t p_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int status = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG2_CTL, "==> hxge_check_txdma_port_member"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp = (p_hxge_dma_pt_cfg_t)&hxgep->pt_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp = (p_hxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Receive DMA Channels */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tdc < p_cfgp->max_tdcs)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG2_CTL, " <== hxge_check_txdma_port_member"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read the L2 classes, L3 classes, and initial hash from either hxge.conf
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * or OBP. Populate these properties into the hxge data structure for latter
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * use. Note that we are not updating these soft properties.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_set_hw_class_config(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i, j;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_param_t param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int *int_prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t cfg_value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs char *prop;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_class_pt_cfg_t p_class_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int start_prop, end_prop;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint_t prop_cnt;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " ==> hxge_set_hw_class_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_class_cfgp = (p_hxge_class_pt_cfg_t)&hxgep->class_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs param_arr = hxgep->param_arr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * L2 class configuration. User configurable ether types
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs start_prop = param_class_cfg_ether_usr1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs end_prop = param_class_cfg_ether_usr2;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = start_prop; i <= end_prop; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[i].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, hxgep->dip,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs 0, prop, &int_prop_val, &prop_cnt) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg_value = (uint32_t)*int_prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(int_prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg_value = (uint32_t)param_arr[i].value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs j = (i - start_prop) + TCAM_CLASS_ETYPE_1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_class_cfgp->class_cfg[j] = cfg_value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use properties from either .conf or the NDD param array. Only bits
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * 2 and 3 are significant
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs start_prop = param_class_opt_ipv4_tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs end_prop = param_class_opt_ipv6_sctp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = start_prop; i <= end_prop; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[i].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, hxgep->dip,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs 0, prop, &int_prop_val, &prop_cnt) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg_value = (uint32_t)*int_prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(int_prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg_value = (uint32_t)param_arr[i].value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs j = (i - start_prop) + TCAM_CLASS_TCP_IPV4;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_class_cfgp->class_cfg[j] = cfg_value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs prop = param_arr[param_hash_init_value].fcode_name;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, hxgep->dip, 0, prop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs &int_prop_val, &prop_cnt) == DDI_PROP_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg_value = (uint32_t)*int_prop_val;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_prop_free(int_prop_val);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg_value = (uint32_t)param_arr[param_hash_init_value].value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_class_cfgp->init_hash = (uint32_t)cfg_value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, CFG_CTL, " <== hxge_set_hw_class_config"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Interrupts related interface functions.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_ldgv_init(p_hxge_t hxgep, int *navail_p, int *nrequired_p)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t ldv, i, maxldvs, maxldgs, start, end, nldvs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int ldg, endldg, ngrps;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t channel;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_dma_pt_cfg_t p_dma_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_hw_pt_cfg_t p_cfgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldgv_t ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldg_t ldgp, ptr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_status_t status = HXGE_OK;
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States peu_intr_mask_t parity_err_mask;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_ldgv_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (!*navail_p) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *nrequired_p = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_ldgv_init:no avail"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_dma_cfgp = (p_hxge_dma_pt_cfg_t)&hxgep->pt_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_cfgp = (p_hxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* each DMA channels */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs = p_cfgp->max_tdcs + p_cfgp->max_rdcs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* vmac */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* pfc */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* system error interrupts. */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs maxldvs = nldvs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs maxldgs = p_cfgp->max_ldgs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (!maxldvs || !maxldgs) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* No devices configured. */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL, "<== hxge_ldgv_init: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "no logical devices or groups configured."));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp = hxgep->ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgvp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp = KMEM_ZALLOC(sizeof (hxge_ldgv_t), KM_SLEEP);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->ldgvp = ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->maxldgs = maxldgs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->maxldvs = maxldvs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = ldgvp->ldgp =
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs KMEM_ZALLOC(sizeof (hxge_ldg_t) * maxldgs, KM_SLEEP);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp = ldgvp->ldvp =
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs KMEM_ZALLOC(sizeof (hxge_ldv_t) * maxldvs, KM_SLEEP);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->ndma_ldvs = p_cfgp->max_tdcs + p_cfgp->max_rdcs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->tmres = HXGE_TIMER_RESO;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_init: maxldvs %d maxldgs %d nldvs %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs maxldvs, maxldgs, nldvs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldg = p_cfgp->start_ldg;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr = ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < maxldgs; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->arm = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->vldg_index = i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->ldg_timer = HXGE_TIMER_LDG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->ldg = ldg++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->sys_intr_handler = hxge_intr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->nldvs = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr->hxgep = hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_init: maxldvs %d maxldgs %d ldg %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs maxldvs, maxldgs, ptr->ldg));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldv_init: timer %d", ptr->ldg_timer));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldg = p_cfgp->start_ldg;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (maxldgs > *navail_p) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ngrps = *navail_p;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ngrps = maxldgs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs endldg = ldg + ngrps;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Receive DMA channels.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs channel = p_cfgp->start_rdc;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs start = p_cfgp->start_rdc + HXGE_RDMA_LD_START;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs end = start + p_cfgp->max_rdcs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->nldvs = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp->ldvp = NULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *nrequired_p = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ptr = ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Start with RDC to configure logical devices for each group.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0, ldv = start; ldv < end; i++, ldv++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->is_rxdma = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv = ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * If non-seq needs to change the following code
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->channel = channel++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->vdma_index = i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_intr_handler = hxge_rx_intr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->use_timer = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->hxgep = hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_ldgv_setup(&ptr, &ldvp, ldv, endldg, nrequired_p);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Transmit DMA channels.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs channel = p_cfgp->start_tdc;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs start = p_cfgp->start_tdc + HXGE_TDMA_LD_START;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs end = start + p_cfgp->max_tdcs;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0, ldv = start; ldv < end; i++, ldv++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->is_txdma = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv = ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->channel = channel++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->vdma_index = i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_intr_handler = hxge_tx_intr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->use_timer = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->hxgep = hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_ldgv_setup(&ptr, &ldvp, ldv, endldg, nrequired_p);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * VMAC
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->is_vmac = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_intr_handler = hxge_vmac_intr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldv = HXGE_VMAC_LD;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv = ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->use_timer = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->hxgep = hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_ldgv_setup(&ptr, &ldvp, ldv, endldg, nrequired_p);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_init: nldvs %d navail %d nrequired %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs, *navail_p, *nrequired_p));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * PFC
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->is_pfc = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_intr_handler = hxge_pfc_intr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldv = HXGE_PFC_LD;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv = ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->use_timer = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->hxgep = hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_ldgv_setup(&ptr, &ldvp, ldv, endldg, nrequired_p);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_init: nldvs %d navail %d nrequired %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs, *navail_p, *nrequired_p));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * System error interrupts.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldv = HXGE_SYS_ERROR_LD;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv = ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->is_syserr = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_intr_handler = hxge_syserr_intr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->hxgep = hxgep;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->use_timer = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->ldvp_syserr = ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Reset PEU error mask to allow PEU error interrupts */
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States /*
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States * Keep the msix parity error mask here and remove it
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States * after ddi_intr_enable call to avoid a msix par err
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States */
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States parity_err_mask.value = 0;
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States parity_err_mask.bits.eic_msix_parerr_mask = 1;
e5d973912cb9a1626897da9ce2dca127ef476e54Qiyan Sun - Sun Microsystems - San Diego United States HXGE_REG_WR32(hxgep->hpi_handle, PEU_INTR_MASK, parity_err_mask.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Unmask the system interrupt states.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_fzc_sys_err_mask_set(hxgep, B_FALSE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_ldgv_setup(&ptr, &ldvp, ldv, endldg, nrequired_p);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp->ldg_intrs = *nrequired_p;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_init: nldvs %d navail %d nrequired %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs nldvs, *navail_p, *nrequired_p));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_ldgv_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_ldgv_uninit(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldgv_t ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_ldgv_uninit"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgvp = hxgep->ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgvp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_ldgv_uninit: no logical group configured."));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgvp->ldgp) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs KMEM_FREE(ldgvp->ldgp, sizeof (hxge_ldg_t) * ldgvp->maxldgs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgvp->ldvp) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs KMEM_FREE(ldgvp->ldvp, sizeof (hxge_ldv_t) * ldgvp->maxldvs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs KMEM_FREE(ldgvp, sizeof (hxge_ldgv_t));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->ldgvp = NULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_ldgv_uninit"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_intr_ldgv_init(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_status_t status = HXGE_OK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr_ldgv_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Configure the logical device group numbers, state vectors
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * and interrupt masks for each logical device.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = hxge_fzc_intr_init(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Configure logical device masks and timers.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs status = hxge_intr_mask_mgmt(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_intr_ldgv_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_intr_mask_mgmt(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldgv_t ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldg_t ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_handle_t handle;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i, j;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_status_t rs = HPI_SUCCESS;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "==> hxge_intr_mask_mgmt"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((ldgvp = hxgep->ldgvp) == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_intr_mask_mgmt: Null ldgvp"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs handle = HXGE_DEV_HPI_HANDLE(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = ldgvp->ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp = ldgvp->ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgp == NULL || ldvp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_intr_mask_mgmt: Null ldgp or ldvp"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt: # of intrs %d ", ldgvp->ldg_intrs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Initialize masks. */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt(Hydra): # intrs %d ", ldgvp->ldg_intrs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < ldgvp->ldg_intrs; i++, ldgp++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt(Hydra): # ldv %d in group %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp->nldvs, ldgp->ldg));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (j = 0; j < ldgp->nldvs; j++, ldvp++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt: set ldv # %d "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "for ldg %d", ldvp->ldv, ldgp->ldg));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs = hpi_intr_mask_set(handle, ldvp->ldv,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (rs != HPI_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_intr_mask_mgmt: set mask failed "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " rs 0x%x ldv %d mask 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs, ldvp->ldv, ldvp->ldv_ldf_masks));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR | rs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt: set mask OK "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " rs 0x%x ldv %d mask 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs, ldvp->ldv, ldvp->ldv_ldf_masks));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = ldgvp->ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Configure timer and arm bit */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < hxgep->ldgvp->ldg_intrs; i++, ldgp++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs = hpi_intr_ldg_mgmt_set(handle, ldgp->ldg,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp->arm, ldgp->ldg_timer);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (rs != HPI_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_intr_mask_mgmt: set timer failed "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " rs 0x%x dg %d timer 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs, ldgp->ldg, ldgp->ldg_timer));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR | rs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt: set timer OK "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " rs 0x%x ldg %d timer 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs, ldgp->ldg, ldgp->ldg_timer));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_fzc_intr_mask_mgmt"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_intr_mask_mgmt_set(p_hxge_t hxgep, boolean_t on)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldgv_t ldgvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldg_t ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_ldv_t ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_handle_t handle;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i, j;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hpi_status_t rs = HPI_SUCCESS;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set (%d)", on));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((ldgvp = hxgep->ldgvp) == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: Null ldgvp"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs handle = HXGE_DEV_HPI_HANDLE(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = ldgvp->ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp = ldgvp->ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ldgp == NULL || ldvp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_intr_mask_mgmt_set: Null ldgp or ldvp"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* set masks. */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < ldgvp->ldg_intrs; i++, ldgp++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: flag %d ldg %d"
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "set mask nldvs %d", on, ldgp->ldg, ldgp->nldvs));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (j = 0; j < ldgp->nldvs; j++, ldvp++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "for %d %d flag %d", i, j, on));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (on) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "ON mask off"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks = (uint8_t)LD_IM_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set:mask on"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs = hpi_intr_mask_set(handle, ldvp->ldv,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldvp->ldv_ldf_masks);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (rs != HPI_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "set mask failed rs 0x%x ldv %d mask 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs, ldvp->ldv, ldvp->ldv_ldf_masks));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR | rs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: flag %d"
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "set mask OK ldv %d mask 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs on, ldvp->ldv, ldvp->ldv_ldf_masks));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp = ldgvp->ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* set the arm bit */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < hxgep->ldgvp->ldg_intrs; i++, ldgp++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (on && !ldgp->arm) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp->arm = B_TRUE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else if (!on && ldgp->arm) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp->arm = B_FALSE;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs = hpi_intr_ldg_mgmt_set(handle, ldgp->ldg,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldgp->arm, ldgp->ldg_timer);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (rs != HPI_SUCCESS) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_ERROR_MSG((hxgep, HXGE_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "<== hxge_intr_mask_mgmt_set: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "set timer failed rs 0x%x ldg %d timer 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rs, ldgp->ldg, ldgp->ldg_timer));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_ERROR | rs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_intr_mask_mgmt_set: OK (flag %d) "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "set timer ldg %d timer 0x%x",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs on, ldgp->ldg, ldgp->ldg_timer));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, INT_CTL, "<== hxge_intr_mask_mgmt_set"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * For Big Endian systems, the mac address will be from OBP. For Little
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Endian (x64) systems, it will be retrieved from the card since it cannot
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * be programmed into PXE.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * This function also populates the MMAC parameters.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hxge_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_get_mac_addr_properties(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_get_mac_addr_properties "));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hxge_pfc_mac_addrs_get(hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->ouraddr = hxgep->factaddr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "<== hxge_get_mac_addr_properties "));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HXGE_OK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_ldgv_setup(p_hxge_ldg_t *ldgp, p_hxge_ldv_t *ldvp, uint8_t ldv,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t endldg, int *ngrps)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL, "==> hxge_ldgv_setup"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Assign the group number for each device. */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldvp)->ldg_assigned = (*ldgp)->ldg;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldvp)->ldgp = *ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldvp)->ldv = ldv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_setup: ldv %d endldg %d ldg %d, ldvp $%p",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldv, endldg, (*ldgp)->ldg, (*ldgp)->ldvp));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldgp)->nldvs++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((*ldgp)->ldg == (endldg - 1)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if ((*ldgp)->ldvp == NULL) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldgp)->ldvp = *ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *ngrps += 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_setup: ngrps %d", *ngrps));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_setup: ldvp $%p ngrps %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *ldvp, *ngrps));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ++*ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldgp)->ldvp = *ldvp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *ngrps += 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL, "==> hxge_ldgv_setup(done): "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "ldv %d endldg %d ldg %d, ldvp $%p",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ldv, endldg, (*ldgp)->ldg, (*ldgp)->ldvp));
2bc987325e3ded1865bff043128661815c4690b9Richard Lowe ++*ldvp;
2bc987325e3ded1865bff043128661815c4690b9Richard Lowe ++*ldgp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "==> hxge_ldgv_setup: new ngrps %d", *ngrps));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL, "==> hxge_ldgv_setup: "
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "ldg %d nldvs %d ldv %d ldvp $%p endldg %d ngrps %d",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (*ldgp)->ldg, (*ldgp)->nldvs, ldv, ldvp, endldg, *ngrps));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((NULL, INT_CTL, "<== hxge_ldgv_setup"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}