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 */
93833965647072e8fb234b6f0cd4060544c6dc4ajing xiong ERI-SUN
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 */
93833965647072e8fb234b6f0cd4060544c6dc4ajing xiong ERI-SUN
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
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 "nic_cmn.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "unm_nic_ioctl.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "nic_phan_reg.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastruct crb_addr_pair {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China long addr, data;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China};
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define MAX_CRB_XFORM 60
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define ADDR_ERROR ((unsigned long)0xffffffff)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define crb_addr_transform(name) \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_xform[UNM_HW_PX_MAP_CRB_##name] = \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_HW_CRB_HUB_AGT_ADR_##name << 20
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic unsigned int crb_addr_xform[MAX_CRB_XFORM];
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinacrb_addr_transform_setup(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(XDMA);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(TIMR);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SRE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQN3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQN2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQN1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQN0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQS3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQS2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQS1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SQS0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX7);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX6);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(RPMX0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(ROMUSB);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SN);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(QMN);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(QMS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGNI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGND);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGN3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGN2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGN1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGN0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGSI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGSD);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGS3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGS2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGS1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PGS0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(PH);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(NIU);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(I2Q);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(EG);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(MN);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(MS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(CAS2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(CAS1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(CAS0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(CAM);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(C2C1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(C2C0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(SMB);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(OCM0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Used only in P3 just define it for P2 also.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform(I2C0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/*
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * decode_crb_addr(0 - utility to translate from internal Phantom CRB address
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * to external PCI CRB address.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic unsigned long
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinadecode_crb_addr(unsigned long addr)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unsigned long base_addr, offset, pci_base;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China crb_addr_transform_setup();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_base = ADDR_ERROR;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China base_addr = addr & 0xfff00000;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offset = addr & 0x000fffff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < MAX_CRB_XFORM; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (crb_addr_xform[i] == base_addr) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pci_base = i << 20;
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 if (pci_base == ADDR_ERROR) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (pci_base);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (pci_base + offset);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic long rom_max_timeout = 100;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic long rom_lock_timeout = 10000;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinarom_lock(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t done = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China long timeout = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China while (!done) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* acquire semaphore2 from PCI HW block */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_read_w0(adapter, UNM_PCIE_REG(PCIE_SEM2_LOCK), &done);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (done == 1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (timeout >= rom_lock_timeout) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d rom_lock timed out %d %ld\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, done, timeout);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China timeout++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROM_LOCK_ID, ROM_LOCK_DRIVER);
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 void
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinarom_unlock(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t val;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* release semaphore2 */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_read_w0(adapter, UNM_PCIE_REG(PCIE_SEM2_UNLOCK), &val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinawait_rom_done(unm_adapter *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China long timeout = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China long done = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China while (done == 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_read(adapter, UNM_ROMUSB_GLB_STATUS, &done);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China done &= 2;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China timeout++;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (timeout >= rom_max_timeout) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "Timeout reached waiting for rom done");
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 Chinado_rom_fast_read(unm_adapter *adapter, int addr, int *valp)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROMUSB_ROM_ADDRESS, addr);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROMUSB_ROM_ABYTE_CNT, 3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China drv_usecwait(100); /* prevent bursting on CRB */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROMUSB_ROM_INSTR_OPCODE, 0xb);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (wait_rom_done(adapter) != DDI_SUCCESS) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Error waiting for rom done\n");
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 // reset abyte_cnt and dummy_byte_cnt
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROMUSB_ROM_ABYTE_CNT, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China drv_usecwait(100); /* prevent bursting on CRB */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_write(adapter, UNM_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_reg_read(adapter, UNM_ROMUSB_ROM_RDATA, valp);
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 Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinarom_fast_read(struct unm_adapter_s *adapter, int addr, int *valp)
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 if (rom_lock(adapter) != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s(%d)rom_lock failed\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China __FUNCTION__, __LINE__);
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 ret = do_rom_fast_read(adapter, addr, valp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ret != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s do_rom_fast_read returned: %d\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China __FUNCTION__, __LINE__);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rom_unlock(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 Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinapinit_from_rom(struct unm_adapter_s *adapter, int verbose)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int addr, val, status, i, init_delay = 0, n;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China struct crb_addr_pair *buf;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unsigned long off;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unsigned int offset;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China status = unm_nic_get_board_info(adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (status)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: pinit_from_rom: Error getting brdinfo\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_ROMUSB_GLB_SW_RESET, 0xffffffff, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (verbose) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int val;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, 0x4008, &val) == 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "P2 ROM board type: 0x%08x\n", val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Could not read board type\n");
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, 0x400c, &val) == 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ROM board num: 0x%08x\n", val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Could not read board number\n");
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, 0x4010, &val) == 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ROM chip num: 0x%08x\n", val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China else
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Could not read chip number\n");
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 if (rom_fast_read(adapter, 0, &n) != 0 ||
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (unsigned int)n != 0xcafecafe ||
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rom_fast_read(adapter, 4, &n) != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: ERROR Reading crb_init area: "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "n: %08x\n", unm_nic_driver_name, n);
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 offset = n & 0xffffU;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China n = (n >> 16) & 0xffffU;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, 0, &n) != 0 ||
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China !(n & 0x80000000)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: ERROR Reading crb_init area: "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "n: %08x\n", unm_nic_driver_name, n);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (-1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offset = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China n &= ~0x80000000;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (n >= 1024) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: %s:n=0x%x Card flash not initialized\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, __FUNCTION__, n);
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 if (verbose)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: %d CRB init values found in ROM.\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, n);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China buf = kmem_zalloc(n * sizeof (struct crb_addr_pair), KM_SLEEP);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (buf == NULL) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: pinit_from_rom: Unable to get memory\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name);
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 for (i = 0; i < n; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China kmem_free(buf, n * sizeof (struct crb_addr_pair));
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 buf[i].addr = addr;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China buf[i].data = val;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (verbose)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: PCI: 0x%08x == 0x%08x\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (unsigned int)decode_crb_addr(
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (unsigned long)addr), val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < n; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China off = decode_crb_addr((unsigned long)buf[i].addr) +
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_PCI_CRBSPACE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* skipping cold reboot MAGIC */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == UNM_CAM_RAM(0x1fc)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
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 /* do not reset PCI */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == (ROMUSB_GLB + 0xbc)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == (ROMUSB_GLB + 0xc8)) /* core clock */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == (ROMUSB_GLB + 0x24)) /* MN clock */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == (ROMUSB_GLB + 0x1c)) /* MS clock */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == (UNM_CRB_PEG_NET_1 + 0x18)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China buf[i].data = 0x1020;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* skip the function enable register */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == UNM_PCIE_REG(PCIE_SETUP_FUNCTION)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == UNM_PCIE_REG(PCIE_SETUP_FUNCTION2)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((off & 0x0ff00000) == UNM_CRB_SMB) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
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 if (off == ADDR_ERROR) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: Err: Unknown addr: 0x%08lx\n",
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, buf[i].addr);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China continue;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* After writing this register, HW needs time for CRB */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* to quiet down (else crb_window returns 0xffffffff) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (off == UNM_ROMUSB_GLB_SW_RESET) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China init_delay = 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 /* hold xdma in reset also */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China buf[i].data = 0x8000ff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, off, &buf[i].data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (init_delay == 1) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nx_msleep(1000); /* Sleep 1000 msecs */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China init_delay = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China nx_msleep(1); /* Sleep 1 msec */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China kmem_free(buf, n * sizeof (struct crb_addr_pair));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // disable_peg_cache_all
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // unreset_net_cache
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China val = UNM_CRB_READ_VAL_ADAPTER(UNM_ROMUSB_GLB_SW_RESET,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_ROMUSB_GLB_SW_RESET,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (val & 0xffffff0f), adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // p2dn replyCount
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_D+0xec, 0x1e, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // disable_peg_cache 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_D+0x4c, 8, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // disable_peg_cache 1
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_I+0x4c, 8, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // peg_clr_all
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // peg_clr 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_0+0x8, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_0+0xc, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // peg_clr 1
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_1+0x8, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_1+0xc, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // peg_clr 2
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_2+0x8, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_2+0xc, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China // peg_clr 3
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_3+0x8, 0, adapter);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_CRB_WRITELIT_ADAPTER(UNM_CRB_PEG_NET_3+0xc, 0, adapter);
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 Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaphantom_init(struct unm_adapter_s *adapter, int pegtune_val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China u32 val = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int retries = 120;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (!pegtune_val) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China do {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China val = adapter->unm_nic_pci_read_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China CRB_CMDPEG_STATE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((val == PHAN_INITIALIZE_COMPLETE) ||
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (val == PHAN_INITIALIZE_ACK))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* 500 msec wait */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China drv_usecwait(500000);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } while (--retries > 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (!retries) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China val = adapter->unm_nic_pci_read_normalize(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_ROMUSB_GLB_PEGTUNE_DONE);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "WARNING: Initial boot wait loop"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "failed...state:%d\n", val);
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 return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaint
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinaload_from_flash(struct unm_adapter_s *adapter)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China{
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int i;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China long data, size = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China long flashaddr = BOOTLD_START, memaddr = BOOTLD_START;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size = (IMAGE_START - BOOTLD_START)/4;
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 data = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_ROMUSB_GLB_CAS_RST,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for (i = 0; i < size; i++) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, flashaddr, (int *)&data) != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Error in rom_fast_read: "
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China "Will skip loading flash image\n");
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->unm_nic_pci_mem_write(adapter, memaddr, &data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China flashaddr += 4;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China memaddr += 4;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China drv_usecwait(100);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_READ_LOCK(&adapter->adapter_lock);
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 data = 0x80001d;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_ROMUSB_GLB_SW_RESET,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China } else {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data = 0x3fff;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_ROMUSB_GLB_CHIP_CLK_CTRL, &data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_ROMUSB_GLB_CAS_RST,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China &data, 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China }
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China UNM_READ_UNLOCK(&adapter->adapter_lock);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China}