9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * CDDL HEADER START
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * and limitations under the License.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * CDDL HEADER END
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Copyright 2008 NetXen, Inc. All rights reserved.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Use is subject to license terms.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/*
93833965647072e8fb234b6f0cd4060544c6dc4ajing xiong ERI-SUN * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Use is subject to license terms.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/types.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/conf.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/debug.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/stropts.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/stream.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/strlog.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/kmem.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/stat.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/kstat.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/vtrace.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/dlpi.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/strsun.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/ethernet.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/modctl.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/errno.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/dditypes.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/ddi.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/sunddi.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/sysmacros.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/pci.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <sys/ddi_intr.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "unm_nic.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "unm_nic_hw.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "unm_brdcfg.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "nic_cmn.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "nic_phan_reg.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "unm_nic_ioctl.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "nx_hw_pci_regs.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinachar ident[] = "Netxen nic driver v" UNM_NIC_VERSIONID;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinachar unm_nic_driver_name[] = "ntxn";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaint verbmsg = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char txbcopythreshold_propname[] = "tx_bcopy_threshold";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char rxbcopythreshold_propname[] = "rx_bcopy_threshold";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char rxringsize_propname[] = "rx_ring_size";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char jumborxringsize_propname[] = "jumbo_rx_ring_size";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char txringsize_propname[] = "tx_ring_size";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char defaultmtu_propname[] = "default_mtu";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic char dmesg_propname[] = "verbose_driver";
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define STRUCT_COPY(a, b) bcopy(&(b), &(a), sizeof (a))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaextern int unm_register_mac(unm_adapter *adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaextern void unm_fini_kstats(unm_adapter* adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaextern void unm_nic_remove(unm_adapter *adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaextern int unm_nic_suspend(unm_adapter *);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaextern uint_t unm_intr(caddr_t, caddr_t);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* Data access requirements. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic struct ddi_device_acc_attr unm_dev_attr = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_STRUCTURE_LE_ACC,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic struct ddi_device_acc_attr unm_buf_attr = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_NEVERSWAP_ACC,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic ddi_dma_attr_t unm_dma_attr_desc = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr_version */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0, /* dma_attr_addr_lo */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffffffull, /* dma_attr_addr_hi */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0x000fffffull, /* dma_attr_count_max */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 4096, /* dma_attr_align */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0x000fffffull, /* dma_attr_burstsizes */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 4, /* dma_attr_minxfer */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0x003fffffull, /* dma_attr_maxxfer */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffffffull, /* dma_attr_seg */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_sgllen */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_granular */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0 /* dma_attr_flags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic ddi_dma_attr_t unm_dma_attr_rxbuf = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr_version */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0, /* dma_attr_addr_lo */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0x7ffffffffULL, /* dma_attr_addr_hi */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_count_max */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 4096, /* dma_attr_align */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xfff8ull, /* dma_attr_burstsizes */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_minxfer */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffffffull, /* dma_attr_maxxfer */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_seg */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_sgllen */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_granular */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0 /* dma_attr_flags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic ddi_dma_attr_t unm_dma_attr_cmddesc = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr_version */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0, /* dma_attr_addr_lo */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0x7ffffffffULL, /* dma_attr_addr_hi */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_count_max */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_align */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xfff8ull, /* dma_attr_burstsizes */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_minxfer */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffff0ull, /* dma_attr_maxxfer */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_seg */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 16, /* dma_attr_sgllen */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_granular */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0 /* dma_attr_flags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic struct nx_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinacheck_hw_init(struct unm_adapter_s *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China u32 val;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, UNM_CAM_RAM(0x1fc), &val, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (val == 0x55555555) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* This is the first boot after power up */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, UNM_ROMUSB_GLB_SW_RESET,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &val, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (val != 0x80000f)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = -1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Start P2 boot loader */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_pci_write_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CAM_RAM(0x1fc), UNM_BDINFO_MAGIC);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_pci_write_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_ROMUSB_GLB_PEGTUNE_DONE, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_get_flash_block(unm_adapter *adapter, int base, int size, uint32_t *buf)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i, addr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t *ptr32;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China addr = base;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ptr32 = buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < size / sizeof (uint32_t); i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, addr, (int *)ptr32) == -1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ptr32++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China addr += sizeof (uint32_t);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((char *)buf + size > (char *)ptr32) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int local;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, addr, &local) == -1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) memcpy(ptr32, &local,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (uintptr_t)((char *)buf + size) - (uintptr_t)(char *)ptr32);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaget_flash_mac_addr(struct unm_adapter_s *adapter, u64 mac[])
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t *pmac = (uint32_t *)&mac[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t temp, crbaddr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint16_t *pmac16 = (uint16_t *)pmac;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // FOR P3, read from CAM RAM
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int pci_func = adapter->ahw.pci_func;
93833965647072e8fb234b6f0cd4060544c6dc4ajing xiong ERI-SUN pmac16 += (4 * pci_func);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crbaddr = CRB_MAC_BLOCK_START + (4 * ((pci_func/2) * 3)) +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (4 * (pci_func & 1));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, crbaddr, &temp, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (pci_func & 1) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp >> 16);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, crbaddr+4,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &temp, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp & 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp >> 16);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16 = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp & 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp >> 16);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, crbaddr+4,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &temp, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp & 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *pmac16 = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (unm_get_flash_block(adapter, USER_START +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offsetof(unm_user_info_t, mac_addr), FLASH_NUM_PORTS * sizeof (U64),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pmac) == -1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (*mac == ~0ULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (unm_get_flash_block(adapter, USER_START_OLD +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offsetof(unm_old_user_info_t, mac_addr),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China FLASH_NUM_PORTS * sizeof (U64), pmac) == -1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (*mac == ~0ULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_initialize_dummy_dma(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t hi, lo, temp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (unm_pci_alloc_consistent(adapter, UNM_HOST_DUMMY_DMA_SIZE,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (caddr_t *)&adapter->dummy_dma.addr, &cookie,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &adapter->dummy_dma.dma_handle,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &adapter->dummy_dma.acc_handle) != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Unable to alloc dummy dma buf\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_ENOMEM);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->dummy_dma.phys_addr = cookie.dmac_laddress;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China hi = (adapter->dummy_dma.phys_addr >> 32) & 0xffffffff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China lo = adapter->dummy_dma.phys_addr & 0xffffffff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_READ_LOCK(&adapter->adapter_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_HOST_DUMMY_BUF_ADDR_HI,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &hi, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_HOST_DUMMY_BUF_ADDR_LO,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &lo, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China temp = DUMMY_BUF_INIT;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_HOST_DUMMY_BUF,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &temp, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_READ_UNLOCK(&adapter->adapter_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinavoid
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_free_dummy_dma(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->dummy_dma.addr) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_pci_free_consistent(&adapter->dummy_dma.dma_handle,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &adapter->dummy_dma.acc_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->dummy_dma.addr = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_pci_cfg_init(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China hardware_context *hwcontext;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_acc_handle_t pci_cfg_hdl;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int *reg_options;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dev_info_t *dip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint_t noptions;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint16_t vendor_id, pci_cmd_word;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint8_t base_class, sub_class, prog_class;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t pexsizes;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China struct nx_legacy_intr_set *legacy_intrp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China hwcontext = &adapter->ahw;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_cfg_hdl = adapter->pci_cfg_handle;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dip = adapter->dip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China vendor_id = pci_config_get16(pci_cfg_hdl, PCI_CONF_VENID);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (vendor_id != 0x4040) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: vendor id %x not 0x4040\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, vendor_id);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_prop_lookup_int_array(DDI_DEV_T_ANY,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dip, 0, "reg", &reg_options, &noptions);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_PROP_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Could not determine reg property\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China hwcontext->pci_func = (reg_options[0] >> 8) & 0x7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_prop_free(reg_options);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China base_class = pci_config_get8(pci_cfg_hdl, PCI_CONF_BASCLASS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China sub_class = pci_config_get8(pci_cfg_hdl, PCI_CONF_SUBCLASS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China prog_class = pci_config_get8(pci_cfg_hdl, PCI_CONF_PROGCLASS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Need this check so that MEZZ card mgmt interface ntxn0 could fail
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * attach & return and proceed to next interfaces ntxn1 and ntxn2
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((base_class != 0x02) || (sub_class != 0) || (prog_class != 0)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Base/sub/prog class problem %d/%d/%d\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, base_class, sub_class,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China prog_class);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China hwcontext->revision_id = pci_config_get8(pci_cfg_hdl, PCI_CONF_REVID);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Refuse to work with dubious P3 cards.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((hwcontext->revision_id >= NX_P3_A0) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (hwcontext->revision_id < NX_P3_B1)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: NetXen chip revs between 0x%x-0x%x "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "is unsupported\n", adapter->name, adapter->instance,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_P3_A0, NX_P3_B0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Save error reporting settings; clear [19:16] error status bits.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Set max read request [14:12] to 0 for 128 bytes. Set max payload
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * size[7:5] to 0 for for 128 bytes.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(hwcontext->revision_id)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pexsizes = pci_config_get32(pci_cfg_hdl, 0xd8);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pexsizes &= 7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pexsizes |= 0xF0000;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_config_put32(pci_cfg_hdl, 0xd8, pexsizes);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_cmd_word = pci_config_get16(pci_cfg_hdl, PCI_CONF_COMM);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_cmd_word |= (PCI_COMM_INTX_DISABLE | PCI_COMM_SERR_ENABLE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_config_put16(pci_cfg_hdl, PCI_CONF_COMM, pci_cmd_word);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (hwcontext->revision_id >= NX_P3_B0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China legacy_intrp = &legacy_intr[hwcontext->pci_func];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China legacy_intrp = &legacy_intr[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.int_vec_bit = legacy_intrp->int_vec_bit;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.tgt_status_reg = legacy_intrp->tgt_status_reg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.tgt_mask_reg = legacy_intrp->tgt_mask_reg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.pci_int_reg = legacy_intrp->pci_int_reg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNstatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_free_tx_dmahdl(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_dmah_node_t *nodep;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_enter(&adapter->tx_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep = &adapter->tx_dma_hdls[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount + EXTRA_HANDLES; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (nodep->dmahdl != NULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_dma_free_handle(&nodep->dmahdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep->dmahdl = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep->next = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->dmahdl_pool = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->freehdls = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_exit(&adapter->tx_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_alloc_tx_dmahdl(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_dmah_node_t *nodep = &adapter->tx_dma_hdls[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_enter(&adapter->tx_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount + EXTRA_HANDLES; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(adapter->dip, &unm_dma_attr_cmddesc,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_DMA_DONTWAIT, NULL, &nodep->dmahdl) != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_exit(&adapter->tx_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto alloc_hdl_fail;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (i > 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep->next = nodep - 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->dmahdl_pool = nodep - 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->freehdls = i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_exit(&adapter->tx_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaalloc_hdl_fail:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_tx_dmahdl(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed transmit ring dma handle allocation\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_free_dma_mem(dma_area_t *dma_p)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (dma_p->dma_hdl != NULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (dma_p->ncookies) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(dma_p->dma_hdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p->ncookies = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (dma_p->acc_hdl != NULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_dma_mem_free(&dma_p->acc_hdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p->acc_hdl = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (dma_p->dma_hdl != NULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_dma_free_handle(&dma_p->dma_hdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p->dma_hdl = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_alloc_dma_mem(unm_adapter *adapter, int size, uint_t dma_flag,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_dma_attr_t *dma_attr_p, dma_area_t *dma_p)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China caddr_t vaddr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size_t actual_size;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_dma_alloc_handle(adapter->dip,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_attr_p, DDI_DMA_DONTWAIT,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NULL, &dma_p->dma_hdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed ddi_dma_alloc_handle\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto dma_mem_fail;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_dma_mem_alloc(dma_p->dma_hdl,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size, &adapter->gc_attr_desc,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_flag & (DDI_DMA_STREAMING | DDI_DMA_CONSISTENT),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_DMA_DONTWAIT, NULL, &vaddr, &actual_size,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &dma_p->acc_hdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_dma_mem_alloc() failed\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto dma_mem_fail;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (actual_size < size) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_dma_mem_alloc() allocated small\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto dma_mem_fail;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_dma_addr_bind_handle(dma_p->dma_hdl,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NULL, vaddr, size, dma_flag, DDI_DMA_DONTWAIT,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NULL, &cookie, &dma_p->ncookies);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_DMA_MAPPED || dma_p->ncookies != 1) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_dma_addr_bind_handle() failed, "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "%d, %d\n", adapter->name, adapter->instance, ret,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p->ncookies);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto dma_mem_fail;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p->dma_addr = cookie.dmac_laddress;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p->vaddr = vaddr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) memset(vaddr, 0, size);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinadma_mem_fail:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_p);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNstatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_free_tx_buffers(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_area_t *dma_p;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China struct unm_cmd_buffer *cmd_buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_dmah_node_t *nodep;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmd_buf = &adapter->cmd_buf_arr[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p = &cmd_buf->dma_area;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_p);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep = cmd_buf->head;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China while (nodep != NULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(nodep->dmahdl);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodep = nodep->next;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (cmd_buf->msg != NULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China freemsg(cmd_buf->msg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmd_buf++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->freecmds = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_alloc_tx_buffers(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i, ret, size, allocated = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_area_t *dma_p;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China struct unm_cmd_buffer *cmd_buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmd_buf = &adapter->cmd_buf_arr[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size = adapter->maxmtu;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p = &cmd_buf->dma_area;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = unm_alloc_dma_mem(adapter, size,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_DMA_WRITE | DDI_DMA_STREAMING,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &unm_dma_attr_rxbuf, dma_p);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto alloc_tx_buffer_fail;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China allocated++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmd_buf++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->freecmds = adapter->MaxTxDescCount;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaalloc_tx_buffer_fail:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmd_buf = &adapter->cmd_buf_arr[0];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < allocated; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_p = &cmd_buf->dma_area;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_p);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmd_buf++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed transmit ring memory allocation\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Called by freemsg() to "free" the resource.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_rx_buffer_recycle(char *arg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_rx_buffer_t *rx_buffer = (unm_rx_buffer_t *)(uintptr_t)arg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_adapter *adapter = rx_buffer->adapter;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_rcv_desc_ctx_t *rcv_desc = rx_buffer->rcv_desc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->mp = desballoc(rx_buffer->dma_info.vaddr,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size, 0, &rx_buffer->rx_recycle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rx_buffer->mp == NULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->stats.desballocfailed++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_enter(rcv_desc->recycle_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->next = rcv_desc->recycle_list;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->recycle_list = rx_buffer;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_recycle++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_exit(rcv_desc->recycle_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNstatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_destroy_rx_ring(unm_rcv_desc_ctx_t *rcv_desc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t i, total_buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_rx_buffer_t *buf_pool;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China total_buf = rcv_desc->rx_buf_total;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China buf_pool = rcv_desc->rx_buf_pool;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < total_buf; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (buf_pool->mp != NULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China freemsg(buf_pool->mp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(&buf_pool->dma_info);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China buf_pool++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China kmem_free(rcv_desc->rx_buf_pool, sizeof (unm_rx_buffer_t) * total_buf);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->pool_list = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->recycle_list = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_free = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_destroy(rcv_desc->pool_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_destroy(rcv_desc->recycle_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_create_rx_ring(unm_adapter *adapter, unm_rcv_desc_ctx_t *rcv_desc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i, ret, allocate = 0, sreoff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t total_buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_area_t *dma_info;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_rx_buffer_t *rx_buffer;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China sreoff = adapter->ahw.cut_through ? 0 : IP_ALIGNMENT_BYTES;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* temporarily set the total rx buffers two times of MaxRxDescCount */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China total_buf = rcv_desc->rx_buf_total = rcv_desc->MaxRxDescCount * 2;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool = kmem_zalloc(sizeof (unm_rx_buffer_t) *
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China total_buf, KM_SLEEP);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer = rcv_desc->rx_buf_pool;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < total_buf; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_info = &rx_buffer->dma_info;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = unm_alloc_dma_mem(adapter, rcv_desc->buf_size,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_DMA_READ | DDI_DMA_STREAMING,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &unm_dma_attr_rxbuf, dma_info);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto alloc_mem_failed;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China allocate++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_info->vaddr = (void *) ((char *)dma_info->vaddr +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China sreoff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_info->dma_addr += sreoff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->rx_recycle.free_func =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_rx_buffer_recycle;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->rx_recycle.free_arg = (caddr_t)rx_buffer;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->next = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->mp = desballoc(dma_info->vaddr,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size, 0, &rx_buffer->rx_recycle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rx_buffer->mp == NULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->stats.desballocfailed++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->rcv_desc = rcv_desc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer->adapter = adapter;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < (total_buf - 1); i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool[i].next = &rcv_desc->rx_buf_pool[i + 1];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->pool_list = rcv_desc->rx_buf_pool;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->recycle_list = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_free = total_buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_init(rcv_desc->pool_lock, NULL,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri)));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_init(rcv_desc->recycle_lock, NULL,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri)));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaalloc_mem_failed:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_buffer = rcv_desc->rx_buf_pool;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < allocate; i++, rx_buffer++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dma_info = &rx_buffer->dma_info;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rx_buffer->mp != NULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China freemsg(rx_buffer->mp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_info);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China kmem_free(rcv_desc->rx_buf_pool, sizeof (unm_rx_buffer_t) * total_buf);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed receive ring resource allocation\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_check_options(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN int i, ring, tx_desc, rx_desc, rx_jdesc, maxrx;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_recv_context_t *recv_ctx;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_rcv_desc_ctx_t *rcv_desc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint8_t revid = adapter->ahw.revision_id;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dev_info_t *dip = adapter->dip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN /*
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN * Reduce number of regular rcv desc to half on x86.
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN */
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN maxrx = MAX_RCV_DESCRIPTORS;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN#if !defined(_LP64)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN maxrx /= 2;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN#endif /* !_LP64 */
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China verbmsg = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dmesg_propname, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->tx_bcopy_threshold = ddi_prop_get_int(DDI_DEV_T_ANY,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dip, DDI_PROP_DONTPASS, txbcopythreshold_propname,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_TX_BCOPY_THRESHOLD);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->rx_bcopy_threshold = ddi_prop_get_int(DDI_DEV_T_ANY,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dip, DDI_PROP_DONTPASS, rxbcopythreshold_propname,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_RX_BCOPY_THRESHOLD);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tx_desc = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China txringsize_propname, MAX_CMD_DESCRIPTORS_HOST);
de710d24d2fae4468e64da999e1d952a247f142cJosef 'Jeff' Sipek if (tx_desc >= 256 && tx_desc <= MAX_CMD_DESCRIPTORS && ISP2(tx_desc)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxTxDescCount = tx_desc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: TxRingSize defaulting to %d, since "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ".conf value is not 2 power aligned in range 256 - %d\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, MAX_CMD_DESCRIPTORS_HOST,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China MAX_CMD_DESCRIPTORS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxTxDescCount = MAX_CMD_DESCRIPTORS_HOST;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_desc = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN rxringsize_propname, maxrx);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rx_desc >= NX_MIN_DRIVER_RDS_SIZE &&
de710d24d2fae4468e64da999e1d952a247f142cJosef 'Jeff' Sipek rx_desc <= NX_MAX_SUPPORTED_RDS_SIZE && ISP2(rx_desc)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxRxDescCount = rx_desc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: RxRingSize defaulting to %d, since "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ".conf value is not 2 power aligned in range %d - %d\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, MAX_RCV_DESCRIPTORS,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_MIN_DRIVER_RDS_SIZE, NX_MAX_SUPPORTED_RDS_SIZE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxRxDescCount = MAX_RCV_DESCRIPTORS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rx_jdesc = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China jumborxringsize_propname, MAX_JUMBO_RCV_DESCRIPTORS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rx_jdesc >= NX_MIN_DRIVER_RDS_SIZE &&
de710d24d2fae4468e64da999e1d952a247f142cJosef 'Jeff' Sipek rx_jdesc <= NX_MAX_SUPPORTED_JUMBO_RDS_SIZE && ISP2(rx_jdesc)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxJumboRxDescCount = rx_jdesc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: JumboRingSize defaulting to %d, since "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ".conf value is not 2 power aligned in range %d - %d\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, MAX_JUMBO_RCV_DESCRIPTORS,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_MIN_DRIVER_RDS_SIZE, NX_MAX_SUPPORTED_JUMBO_RDS_SIZE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxJumboRxDescCount = MAX_JUMBO_RCV_DESCRIPTORS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN /*
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN * Solaris does not use LRO, but older firmware needs to have a
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN * couple of descriptors for initialization.
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN */
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN adapter->MaxLroRxDescCount = (adapter->fw_major < 4) ? 2 : 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->mtu = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China DDI_PROP_DONTPASS, defaultmtu_propname, MTU_SIZE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->mtu < MTU_SIZE) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Raising mtu to %d\n", MTU_SIZE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->mtu = MTU_SIZE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->maxmtu = NX_IS_REVISION_P2(revid) ? P2_MAX_MTU : P3_MAX_MTU;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->mtu > adapter->maxmtu) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Lowering mtu to %d\n", adapter->maxmtu);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->mtu = adapter->maxmtu;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN adapter->maxmtu = adapter->mtu + NX_MAX_ETHERHDR;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN /*
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN * If we are not expecting to receive jumbo frames, save memory and
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN * do not allocate.
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN */
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (adapter->mtu <= MTU_SIZE)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN adapter->MaxJumboRxDescCount = NX_MIN_DRIVER_RDS_SIZE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < MAX_RCV_CTX; ++i) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China recv_ctx = &adapter->recv_ctx[i];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (ring = 0; ring < adapter->max_rds_rings; ring++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc = &recv_ctx->rcv_desc[ring];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch (RCV_DESC_TYPE(ring)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case RCV_DESC_NORMAL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->MaxRxDescCount =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxRxDescCount;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->ahw.cut_through) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_CT_DEFAULT_RX_BUF_LEN;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = rcv_desc->dma_size;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_RX_NORMAL_BUF_MAX_LEN;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China IP_ALIGNMENT_BYTES;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case RCV_DESC_JUMBO:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->MaxRxDescCount =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxJumboRxDescCount;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->ahw.cut_through) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_P3_RX_JUMBO_BUF_MAX_LEN;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(revid))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_P2_RX_JUMBO_BUF_MAX_LEN;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NX_P3_RX_JUMBO_BUF_MAX_LEN;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China IP_ALIGNMENT_BYTES;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case RCV_RING_LRO:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->MaxRxDescCount =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->MaxLroRxDescCount;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = MAX_RX_LRO_BUFFER_LENGTH;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = RX_LRO_DMA_MAP_LEN;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China default:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinavector128M(unm_adapter *aptr)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_change_crbwindow = &unm_nic_pci_change_crbwindow_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_crb_writelit_adapter = &unm_crb_writelit_adapter_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_wx = &unm_nic_hw_write_wx_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_wx = &unm_nic_hw_read_wx_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_ioctl = &unm_nic_hw_write_ioctl_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_ioctl = &unm_nic_hw_read_ioctl_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_write = &unm_nic_pci_mem_write_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_read = &unm_nic_pci_mem_read_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_immediate = &unm_nic_pci_write_immediate_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_immediate = &unm_nic_pci_read_immediate_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_normalize = &unm_nic_pci_write_normalize_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_normalize = &unm_nic_pci_read_normalize_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_set_window = &unm_nic_pci_set_window_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_clear_statistics = &unm_nic_clear_statistics_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_fill_statistics = &unm_nic_fill_statistics_128M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinavector2M(unm_adapter *aptr)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_change_crbwindow = &unm_nic_pci_change_crbwindow_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_crb_writelit_adapter = &unm_crb_writelit_adapter_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_wx = &unm_nic_hw_write_wx_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_wx = &unm_nic_hw_read_wx_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_ioctl = &unm_nic_hw_write_wx_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_ioctl = &unm_nic_hw_read_wx_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_write = &unm_nic_pci_mem_write_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_read = &unm_nic_pci_mem_read_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_immediate = &unm_nic_pci_write_immediate_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_immediate = &unm_nic_pci_read_immediate_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_normalize = &unm_nic_pci_write_normalize_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_normalize = &unm_nic_pci_read_normalize_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_set_window = &unm_nic_pci_set_window_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_clear_statistics = &unm_nic_clear_statistics_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China aptr->unm_nic_fill_statistics = &unm_nic_fill_statistics_2M;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_pci_map_setup(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China caddr_t reg_base, db_base;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China caddr_t mem_ptr0, mem_ptr1 = NULL, mem_ptr2 = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unsigned long pci_len0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unsigned long first_page_group_start, first_page_group_end;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China off_t regsize, dbsize = UNM_DB_MAPSIZE_BYTES;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dev_info_t *dip = adapter->dip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.qdr_sn_window = adapter->ahw.ddr_mn_window = -1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* map register space */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_dev_regsize(dip, 1, &regsize);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: failed to read reg size for bar0\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_regs_map_setup(dip, 1, &reg_base, 0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China regsize, &unm_dev_attr, &adapter->regs_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: failed to map registers\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mem_ptr0 = reg_base;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (regsize == UNM_PCI_128MB_SIZE) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_len0 = FIRST_PAGE_GROUP_SIZE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mem_ptr1 = mem_ptr0 + SECOND_PAGE_GROUP_START;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mem_ptr2 = mem_ptr0 + THIRD_PAGE_GROUP_START;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_page_group_start = FIRST_PAGE_GROUP_START;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_page_group_end = FIRST_PAGE_GROUP_END;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China vector128M(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else if (regsize == UNM_PCI_32MB_SIZE) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_len0 = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mem_ptr1 = mem_ptr0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mem_ptr2 = mem_ptr0 +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (THIRD_PAGE_GROUP_START - SECOND_PAGE_GROUP_START);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_page_group_start = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_page_group_end = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China vector128M(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else if (regsize == UNM_PCI_2MB_SIZE) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_len0 = UNM_PCI_2MB_SIZE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_page_group_start = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_page_group_end = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.ddr_mn_window = adapter->ahw.qdr_sn_window = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.mn_win_crb = 0x100000 + PCIX_MN_WINDOW +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (adapter->ahw.pci_func * 0x20);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->ahw.pci_func < 4)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (adapter->ahw.pci_func * 0x20);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China 0xA0 + ((adapter->ahw.pci_func - 4) * 0x10);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China vector2M(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: invalid pci regs map size %ld\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, regsize);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&adapter->regs_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_base0 = (unsigned long)mem_ptr0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_len0 = pci_len0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_base1 = (unsigned long)mem_ptr1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_len1 = SECOND_PAGE_GROUP_SIZE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_base2 = (unsigned long)mem_ptr2;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_len2 = THIRD_PAGE_GROUP_SIZE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.crb_base =
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China PCI_OFFSET_SECOND_RANGE(adapter, UNM_PCI_CRBSPACE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.first_page_group_start = first_page_group_start;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.first_page_group_end = first_page_group_end;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* map doorbell */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_regs_map_setup(dip, 2, &db_base, 0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China dbsize, &unm_dev_attr, &adapter->db_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: failed to map doorbell\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&adapter->regs_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.db_base = (unsigned long)db_base;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.db_len = dbsize;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_initialize_intr(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int type, count, avail, actual;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_supported_types(adapter->dip, &type);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_intr_get_supported_types() "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "failed\n", adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China type = DDI_INTR_TYPE_MSI;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_nintrs(adapter->dip, type, &count);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((ret == DDI_SUCCESS) && (count > 0))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto found_msi;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China type = DDI_INTR_TYPE_FIXED;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_nintrs(adapter->dip, type, &count);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((ret != DDI_SUCCESS) || (count == 0)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "ddi_intr_get_nintrs() failure ret=%d\n", ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinafound_msi:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->intr_type = type;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->flags &= ~(UNM_NIC_MSI_ENABLED | UNM_NIC_MSIX_ENABLED);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (type == DDI_INTR_TYPE_MSI)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->flags |= UNM_NIC_MSI_ENABLED;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Get number of available interrupts */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_navail(adapter->dip, type, &avail);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((ret != DDI_SUCCESS) || (avail == 0)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ddi_intr_get_navail() failure, ret=%d\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_alloc(adapter->dip, &adapter->intr_handle,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China type, 0, 1, &actual, DDI_INTR_ALLOC_NORMAL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((ret != DDI_SUCCESS) || (actual == 0)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ddi_intr_alloc() failure: %d\n", ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_pri(adapter->intr_handle, &adapter->intr_pri);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ddi_intr_get_pri() failure: %d\n", ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Call ddi_intr_add_handler() */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ddi_intr_add_handler(adapter->intr_handle, unm_intr,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (caddr_t)adapter, NULL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_intr_add_handler() failure\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_intr_free(adapter->intr_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Add softintr if required */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinavoid
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunm_destroy_intr(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* disable interrupt */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->intr_type == DDI_INTR_TYPE_MSI)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_intr_block_disable(&adapter->intr_handle, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_intr_disable(adapter->intr_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_intr_remove_handler(adapter->intr_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (void) ddi_intr_free(adapter->intr_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Remove the software intr handler */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinanetxen_set_port_mode(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China static int wol_port_mode = UNM_PORT_MODE_AUTO_NEG_1G;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China static int port_mode = UNM_PORT_MODE_AUTO_NEG;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int btype = adapter->ahw.boardcfg.board_type, data = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (btype == UNM_BRDTYPE_P3_HMEZ || btype == UNM_BRDTYPE_P3_XG_LOM) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data = port_mode; /* set to port_mode normally */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((port_mode != UNM_PORT_MODE_802_3_AP) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (port_mode != UNM_PORT_MODE_XG) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (port_mode != UNM_PORT_MODE_AUTO_NEG_1G) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (port_mode != UNM_PORT_MODE_AUTO_NEG_XG))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data = UNM_PORT_MODE_AUTO_NEG;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_PORT_MODE_ADDR,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((wol_port_mode != UNM_PORT_MODE_802_3_AP) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (wol_port_mode != UNM_PORT_MODE_XG) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (wol_port_mode != UNM_PORT_MODE_AUTO_NEG_1G) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (wol_port_mode != UNM_PORT_MODE_AUTO_NEG_XG))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China wol_port_mode = UNM_PORT_MODE_AUTO_NEG;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_WOL_PORT_MODE,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &wol_port_mode, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinanetxen_pcie_strap_init(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_acc_handle_t pcihdl = adapter->pci_cfg_handle;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China u32 chicken, control, c8c9value = 0xF1000;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, UNM_PCIE_REG(PCIE_CHICKEN3),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &chicken, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China chicken &= 0xFCFFFFFF; /* clear chicken3 25:24 */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China control = pci_config_get32(pcihdl, 0xD0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((control & 0x000F0000) != 0x00020000) /* is it gen1? */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China chicken |= 0x01000000;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_PCIE_REG(PCIE_CHICKEN3),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &chicken, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China control = pci_config_get32(pcihdl, 0xC8);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China control = pci_config_get32(pcihdl, 0xC8);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_config_put32(pcihdl, 0xC8, c8c9value);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinanetxen_read_mac_addr(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN u64 mac_addr[8 + 1];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unsigned char *p;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (get_flash_mac_addr(adapter, mac_addr) != 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China p = (unsigned char *)&mac_addr[adapter->ahw.pci_func];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China p = (unsigned char *)&mac_addr[adapter->portnum];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < 6; i++)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->mac_addr[i] = p[5 - i];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (unm_nic_macaddr_set(adapter, adapter->mac_addr) != 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunmattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_adapter *adapter;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i, first_driver = 0;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN int ret, temp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch (cmd) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case DDI_ATTACH:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case DDI_RESUME:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case DDI_PM_RESUME:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China default:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter = kmem_zalloc(sizeof (unm_adapter), KM_SLEEP);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->dip = dip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_set_driver_private(dip, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->instance = ddi_get_instance(dip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name = ddi_driver_name(dip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = pci_config_setup(dip, &adapter->pci_cfg_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: pci_config_setup failed\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_setup_err;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = unm_pci_cfg_init(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_err;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = unm_pci_map_setup(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_err;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (unm_initialize_intr(adapter) != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_unmap_regs;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rw_init(&adapter->adapter_lock, NULL,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China RW_DRIVER, DDI_INTR_PRI(adapter->intr_pri));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_init(&adapter->tx_lock, NULL,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri)));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mutex_init(&adapter->lock, NULL,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri)));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->portnum = (int8_t)adapter->ahw.pci_func;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Set the CRB window to invalid. If any register in window 0 is
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * accessed it should set window to 0 and then reset it to 1.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->curr_window = 255;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->fw_major = adapter->unm_nic_pci_read_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_FW_VERSION_MAJOR);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->fw_major < 4)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->max_rds_rings = 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->max_rds_rings = 2;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China STRUCT_COPY(adapter->gc_dma_attr_desc, unm_dma_attr_desc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China STRUCT_COPY(adapter->gc_attr_desc, unm_buf_attr);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = unm_nic_get_board_info(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: error reading board config\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Mezz cards have PCI function 0, 2, 3 enabled */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch (adapter->ahw.boardcfg.board_type) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case UNM_BRDTYPE_P2_SB31_10G_IMEZ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case UNM_BRDTYPE_P2_SB31_10G_HMEZ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->ahw.pci_func >= 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->portnum = adapter->ahw.pci_func - 2;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China default:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China temp = UNM_CRB_READ_VAL_ADAPTER(UNM_MIU_MN_CONTROL, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.cut_through = NX_IS_SYSTEM_CUT_THROUGH(temp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->ahw.pci_func == 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_driver = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->portnum == 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China first_driver = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_check_options(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (first_driver) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int first_boot = adapter->unm_nic_pci_read_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CAM_RAM(0x1fc));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (check_hw_init(adapter) != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Error in HW init sequence\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China netxen_set_port_mode(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (first_boot != 0x55555555) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China temp = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_CMDPEG_STATE,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &temp, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (pinit_from_rom(adapter, 0) != 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China drv_usecwait(500);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = load_from_flash(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret = unm_initialize_dummy_dma(adapter))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Tell the hardware our version number.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China i = (_UNM_NIC_MAJOR << 16) |
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ((_UNM_NIC_MINOR << 8)) | (_UNM_NIC_SUBVERSION);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_DRIVER_VERSION,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &i, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Unlock the HW, prompting the boot sequence */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((first_boot == 0x55555555) &&
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (NX_IS_REVISION_P2(adapter->ahw.revision_id)))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_pci_write_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_ROMUSB_GLB_PEGTUNE_DONE, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Handshake with the card before we register the devices. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (phantom_init(adapter, 0) != DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China netxen_pcie_strap_init(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * See if the firmware gave us a virtual-physical port mapping.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->physical_port = adapter->portnum;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China i = adapter->unm_nic_pci_read_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China CRB_V2P(adapter->portnum));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (i != 0x55555555)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->physical_port = (uint16_t)i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->ahw.linkup = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (receive_peg_ready(adapter)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = -EIO;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN goto free_dummy_dma;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (netxen_read_mac_addr(adapter))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed to read MAC addr\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_flash_print(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (verbmsg != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch (adapter->ahw.board_type) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case UNM_NIC_GBE:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_NOTE, "%s: QUAD GbE port %d initialized\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, adapter->portnum);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case UNM_NIC_XGBE:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_NOTE, "%s: XGbE port %d initialized\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, adapter->portnum);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = unm_register_mac(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_NOTE, "%s%d: Mac registration error\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN goto free_dummy_dma;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNfree_dummy_dma:
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (first_driver)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_free_dummy_dma(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaattach_destroy_intr:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_destroy_intr(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaattach_unmap_regs:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&(adapter->regs_handle));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&(adapter->db_handle));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaattach_err:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_config_teardown(&adapter->pci_cfg_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaattach_setup_err:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China kmem_free(adapter, sizeof (unm_adapter));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaunmdetach(dev_info_t *dip, ddi_detach_cmd_t cmd)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_adapter *adapter = (unm_adapter *)ddi_get_driver_private(dip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter == NULL)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch (cmd) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case DDI_DETACH:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_fini_kstats(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->kstats[0] = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (adapter->pci_cfg_handle != NULL)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN pci_config_teardown(&adapter->pci_cfg_handle);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nd_cleanup(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_remove(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case DDI_SUSPEND:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (unm_nic_suspend(adapter));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China default:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNint
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNcreate_rxtx_rings(unm_adapter *adapter)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN{
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_recv_context_t *recv_ctx;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_rcv_desc_ctx_t *rcv_desc;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN int i, ring;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN adapter->cmd_buf_arr = (struct unm_cmd_buffer *)kmem_zalloc(
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN sizeof (struct unm_cmd_buffer) * adapter->MaxTxDescCount,
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN KM_SLEEP);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN for (i = 0; i < MAX_RCV_CTX; ++i) {
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN recv_ctx = &adapter->recv_ctx[i];
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN for (ring = 0; ring < adapter->max_rds_rings; ring++) {
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN rcv_desc = &recv_ctx->rcv_desc[ring];
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (unm_create_rx_ring(adapter, rcv_desc) !=
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN DDI_SUCCESS)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN goto attach_free_cmdbufs;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN }
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN }
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (unm_alloc_tx_dmahdl(adapter) != DDI_SUCCESS)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN goto attach_free_cmdbufs;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (unm_alloc_tx_buffers(adapter) != DDI_SUCCESS)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN goto attach_free_tx_dmahdl;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN return (DDI_SUCCESS);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNattach_free_tx_buffers:
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_free_tx_buffers(adapter);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNattach_free_tx_dmahdl:
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_free_tx_dmahdl(adapter);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNattach_free_cmdbufs:
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN kmem_free(adapter->cmd_buf_arr, sizeof (struct unm_cmd_buffer) *
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN adapter->MaxTxDescCount);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN for (i = 0; i < MAX_RCV_CTX; ++i) {
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN recv_ctx = &adapter->recv_ctx[i];
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN for (ring = 0; ring < adapter->max_rds_rings; ring++) {
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN rcv_desc = &recv_ctx->rcv_desc[ring];
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (rcv_desc->rx_buf_pool != NULL)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_destroy_rx_ring(rcv_desc);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN }
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN }
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN return (DDI_FAILURE);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN}
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNvoid
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUNdestroy_rxtx_rings(unm_adapter *adapter)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN{
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_recv_context_t *recv_ctx;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_rcv_desc_ctx_t *rcv_desc;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN int ctx, ring;
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_free_tx_buffers(adapter);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_free_tx_dmahdl(adapter);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN recv_ctx = &adapter->recv_ctx[ctx];
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN for (ring = 0; ring < adapter->max_rds_rings; ring++) {
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN rcv_desc = &recv_ctx->rcv_desc[ring];
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (rcv_desc->rx_buf_pool != NULL)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN unm_destroy_rx_ring(rcv_desc);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN }
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN }
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN if (adapter->cmd_buf_arr != NULL)
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN kmem_free(adapter->cmd_buf_arr,
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN sizeof (struct unm_cmd_buffer) * adapter->MaxTxDescCount);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN}
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef SOLARIS11
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing ChinaDDI_DEFINE_STREAM_OPS(unm_ops, nulldev, nulldev, unmattach, unmdetach,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodev, NULL, D_MP, NULL, NULL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing ChinaDDI_DEFINE_STREAM_OPS(unm_ops, nulldev, nulldev, unmattach, unmdetach,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nodev, NULL, D_MP, NULL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic struct modldrv modldrv = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &mod_driverops, /* Type of module. This one is a driver */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ident,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &unm_ops, /* driver ops */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic struct modlinkage modlinkage = {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China MODREV_1,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (&modldrv),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China NULL
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China_init(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_ops.devo_cb_ops->cb_str = NULL;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mac_init_ops(&unm_ops, "ntxn");
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = mod_install(&modlinkage);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mac_fini_ops(&unm_ops);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ntxn: mod_install failed\n");
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China_fini(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ret;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = mod_remove(&modlinkage);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret == DDI_SUCCESS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mac_fini_ops(&unm_ops);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (ret);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China_info(struct modinfo *modinfop)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (mod_info(&modlinkage, modinfop));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}