Mercurial > illumos > illumos-gate
changeset 3174:95c3e05e2071
6470022 OPL scfd driver should be moved into the closed source tree
author | jimand |
---|---|
date | Mon, 27 Nov 2006 11:55:12 -0800 |
parents | bf81e386aeef |
children | 5903f61aa150 |
files | usr/src/cmd/oplhpd/scf_notify.c usr/src/lib/cfgadm_plugins/scsi/SUNW,SPARC-Enterprise/common/opl_dev_led.c usr/src/uts/sun4u/opl/Makefile usr/src/uts/sun4u/opl/Makefile.files usr/src/uts/sun4u/opl/Makefile.opl usr/src/uts/sun4u/opl/Makefile.opl.shared usr/src/uts/sun4u/opl/Makefile.rules usr/src/uts/sun4u/opl/Makefile.targ usr/src/uts/sun4u/opl/Makefile.targ.shared usr/src/uts/sun4u/opl/io/scfd/scf_os_interface.c usr/src/uts/sun4u/opl/io/scfd/scfconf.c usr/src/uts/sun4u/opl/io/scfd/scfd.conf usr/src/uts/sun4u/opl/io/scfd/scfdebug.c usr/src/uts/sun4u/opl/io/scfd/scfdscp.c usr/src/uts/sun4u/opl/io/scfd/scfhandler.c usr/src/uts/sun4u/opl/io/scfd/scfinit.c usr/src/uts/sun4u/opl/io/scfd/scfiomp.c usr/src/uts/sun4u/opl/io/scfd/scfkstat.c usr/src/uts/sun4u/opl/io/scfd/scfops.c usr/src/uts/sun4u/opl/io/scfd/scfostoescf.c usr/src/uts/sun4u/opl/io/scfd/scfparam.c usr/src/uts/sun4u/opl/io/scfd/scfreg.c usr/src/uts/sun4u/opl/io/scfd/scfsnap.c usr/src/uts/sun4u/opl/io/scfd/scftimer.c usr/src/uts/sun4u/opl/io/scfd/scftrace.c usr/src/uts/sun4u/opl/scfd/Makefile usr/src/uts/sun4u/opl/sys/Makefile usr/src/uts/sun4u/opl/sys/scfd/iomp_drv.h usr/src/uts/sun4u/opl/sys/scfd/opcio.h usr/src/uts/sun4u/opl/sys/scfd/opcioif.h usr/src/uts/sun4u/opl/sys/scfd/scfdebug.h usr/src/uts/sun4u/opl/sys/scfd/scfdscp.h usr/src/uts/sun4u/opl/sys/scfd/scfio32.h usr/src/uts/sun4u/opl/sys/scfd/scfkstat.h usr/src/uts/sun4u/opl/sys/scfd/scfparam.h usr/src/uts/sun4u/opl/sys/scfd/scfreg.h usr/src/uts/sun4u/opl/sys/scfd/scfsnap.h usr/src/uts/sun4u/opl/sys/scfd/scfstate.h usr/src/uts/sun4u/opl/sys/scfd/scfsys.h usr/src/uts/sun4u/opl/sys/scfd/scftimer.h usr/src/uts/sun4u/opl/sys/scfd/scftrace.h |
diffstat | 41 files changed, 386 insertions(+), 25725 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/oplhpd/scf_notify.c Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/cmd/oplhpd/scf_notify.c Mon Nov 27 11:55:12 2006 -0800 @@ -41,7 +41,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/sysevent/dr.h> -#include <sys/scfd/opcio.h> +#include <sys/scfd/opcioif.h> /* Macros */
--- a/usr/src/lib/cfgadm_plugins/scsi/SUNW,SPARC-Enterprise/common/opl_dev_led.c Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/lib/cfgadm_plugins/scsi/SUNW,SPARC-Enterprise/common/opl_dev_led.c Mon Nov 27 11:55:12 2006 -0800 @@ -31,7 +31,7 @@ #include <strings.h> #include <libgen.h> #include <cfga_scsi.h> -#include <sys/scfd/opcio.h> +#include <sys/scfd/opcioif.h> #define SCF_DRV "/devices/pseudo/scfd@200:rasctl"
--- a/usr/src/uts/sun4u/opl/Makefile Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/uts/sun4u/opl/Makefile Mon Nov 27 11:55:12 2006 -0800 @@ -61,13 +61,13 @@ .KEEP_STATE: def all clean clobber clean.lint: genassym unix .WAIT \ - $(OPL_CPU_KMODS) $(OPL_KMODS) + $(OPL_CPU_KMODS) $(OPL_KMODS) $(CLOSED_OPL_KMODS) -modlist: unix $(OPL_CPU_KMODS) $(OPL_KMODS) +modlist: unix $(OPL_CPU_KMODS) $(OPL_KMODS) $(CLOSED_OPL_KMODS) lintlib: unix -modlintlib: $(OPL_KMODS) +modlintlib: $(OPL_KMODS) $(CLOSED_OPL_KMODS) IMPLEMENTED_PLATFORM = SUNW,SPARC-Enterprise @@ -89,11 +89,14 @@ $(USR_OPL_LIB_DIR) \ $(OPL_CRYPTO_LINKS) \ genassym unix .WAIT $(OPL_CPU_KMODS) $(OPL_KMODS) \ - $(OPLMSU_OPTION) + $(CLOSED_OPL_KMODS) $(OPLMSU_OPTION) genassym unix $(OPL_KMODS) $(OPL_CPU_KMODS): FRC @cd $@; pwd; $(MAKE) $(TARGET) +$(CLOSED_OPL_KMODS): FRC + cd $(CLOSED)/uts/sun4u/opl/$@; pwd; $(MAKE) $(NO_STATE) $(TARGET) + $(OPL_CRYPTO_LINKS): $(ROOT_OPL_CRYPTO_DIR_64) -$(RM) $(ROOT_OPL_CRYPTO_DIR_64)/$@ $(SYMLINK) $(ROOT_US3_CRYPTO_LINK)/$@ $(ROOT_OPL_CRYPTO_DIR_64)/$@ @@ -118,6 +121,7 @@ LINT_LIBS = $(LINT_LIB) \ -L$(OPL_LINT_LIB_DIR) \ -L$(LINT_LIB_DIR) $(LINT_KMODS:%=-l%) \ + $(CLOSED_LINT_KMODS:%=-l%) \ -L$(SPARC_LIB_DIR) $(SPARC_LINTS:%=-l%) lint.platmod: modlintlib
--- a/usr/src/uts/sun4u/opl/Makefile.files Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/uts/sun4u/opl/Makefile.files Mon Nov 27 11:55:12 2006 -0800 @@ -37,10 +37,6 @@ PCICMU_OBJS = pcicmu.o pcmu_cb.o pcmu_counters.o pcmu_ecc.o \ pcmu_ib.o pcmu_intr.o pcmu_pbm.o pcmu_util.o OPL_PANEL_OBJS = oplpanel.o -SCFD_OBJS = scfconf.o scfdscp.o scfiomp.o scfostoescf.o \ - scfsnap.o scfhandler.o scfkstat.o scfparam.o \ - scftimer.o scfdebug.o scfinit.o scfops.o \ - scfreg.o scftrace.o scf_os_interface.o DRMACH_OBJS = drmach.o drmach_asm.o dr_util.o drmach_err.o DRMACH_DEPS += drmach_asm.o OPLMSU_OBJS = oplmsu.o oplmsu_cmn_func.o oplmsu_ioctl_lrp.o oplmsu_ioctl_uwp.o
--- a/usr/src/uts/sun4u/opl/Makefile.opl Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/uts/sun4u/opl/Makefile.opl Mon Nov 27 11:55:12 2006 -0800 @@ -1,4 +1,3 @@ -# # CDDL HEADER START # # The contents of this file are subject to the terms of the @@ -18,169 +17,12 @@ # # CDDL HEADER END # -# # Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # -# Global definitions for sun4u opl implementation specific modules. -# -# uts/sun4u/opl/Makefile.opl -# - -# -# Define directories. -# -# -# -ROOT_OPL_DIR = $(ROOT_PLAT_DIR)/SUNW,SPARC-Enterprise -ROOT_OPL_MOD_DIR = $(ROOT_OPL_DIR)/kernel -ROOT_OPL_KERN_DIR_32 = $(ROOT_OPL_MOD_DIR) -ROOT_OPL_KERN_DIR_64 = $(ROOT_OPL_MOD_DIR)/$(SUBDIR64) -ROOT_OPL_MISC_DIR_32 = $(ROOT_OPL_MOD_DIR)/misc -ROOT_OPL_MISC_DIR_64 = $(ROOT_OPL_MOD_DIR)/misc/$(SUBDIR64) -ROOT_OPL_DRV_DIR_32 = $(ROOT_OPL_MOD_DIR)/drv -ROOT_OPL_DRV_DIR_64 = $(ROOT_OPL_MOD_DIR)/drv/$(SUBDIR64) -ROOT_OPL_CPU_DIR_32 = $(ROOT_OPL_MOD_DIR)/cpu -ROOT_OPL_CPU_DIR_64 = $(ROOT_OPL_MOD_DIR)/cpu/$(SUBDIR64) -ROOT_OPL_CRYPTO_DIR_32 = $(ROOT_OPL_MOD_DIR)/crypto -ROOT_OPL_CRYPTO_DIR_64 = $(ROOT_OPL_MOD_DIR)/crypto/$(SUBDIR64) - -ROOT_OPL_KERN_DIR = $(ROOT_OPL_KERN_DIR_$(CLASS)) -ROOT_OPL_MISC_DIR = $(ROOT_OPL_MISC_DIR_$(CLASS)) -ROOT_OPL_DRV_DIR = $(ROOT_OPL_DRV_DIR_$(CLASS)) -ROOT_OPL_CPU_DIR = $(ROOT_OPL_CPU_DIR_$(CLASS)) -ROOT_OPL_CRYPTO_DIR = $(ROOT_OPL_CRYPTO_DIR_$(CLASS)) - -ROOT_PLAT_MOD_DIRS += $(ROOT_OPL_MOD_DIR) -ROOT_PLAT_MISC_DIRS_32 += $(ROOT_OPL_MISC_DIR_32) - -USR_OPL_DIR = $(USR_PLAT_DIR)/SUNW,SPARC-Enterprise -USR_OPL_LIB_DIR = $(USR_OPL_DIR)/lib -USR_OPL_SBIN_DIR = $(USR_OPL_DIR)/sbin -USR_OPL_SBIN_EEPROM = $(USR_OPL_SBIN_DIR)/eeprom -USR_OPL_SBIN_PRTDIAG = $(USR_OPL_SBIN_DIR)/prtdiag -USR_OPL_SBIN_TRAPSTAT = $(USR_OPL_SBIN_DIR)/trapstat -USR_OPL_SBIN_FRUADM = $(USR_OPL_SBIN_DIR)/fruadm -USR_OPL_INC_DIR = $(USR_OPL_DIR)/include -USR_OPL_ISYS_DIR = $(USR_OPL_INC_DIR)/sys - -OPL_LINT_LIB_DIR = $(UTSBASE)/$(PLATFORM)/opl/lint-libs/$(OBJS_DIR) -OPLMSU_OPTION = options - -# -# Define modules. -# -OPL_KMODS = platmod -OPL_KMODS += dm2s -OPL_KMODS += oplkmdrv -OPL_KMODS += pcicmu -OPL_KMODS += oplpanel -OPL_KMODS += scfd -OPL_KMODS += dr .WAIT drmach -OPL_KMODS += oplmsu -OPL_KMODS += mc-opl - -# -# CPU modules. -# -OPL_CPU_KMODS += olympus_c - -# Links to OPL crypto modules -# -OPL_CRYPTO_LINKS = aes -# -# Include the makefiles which define build rule templates, the -# collection of files per module, and a few specific flags. Note -# that order is significant, just as with an include path. The -# first build rule template which matches the files name will be -# used. By including these in order from most machine dependent -# to most machine independent, we allow a machine dependent file -# to be used in preference over a machine independent version -# (Such as a machine specific optimization, which preserves the -# interfaces.) -# -include $(UTSBASE)/sun4u/ngdr/Makefile.files -include $(UTSBASE)/sun4u/opl/Makefile.files - -# -# Include common rules. -# -include $(UTSBASE)/sun4u/Makefile.sun4u - -# -# Everybody needs to know how to build modstubs.o and to locate unix.o -# -UNIX_DIR = $(UTSBASE)/$(PLATFORM)/opl/unix -MODSTUBS_DIR = $(UNIX_DIR) -DSF_DIR = $(UTSBASE)/$(PLATFORM)/opl/genassym -LINTS_DIR = $(OBJS_DIR) -LINT_LIB_DIR = $(UTSBASE)/$(PLATFORM)/opl/lint-libs/$(OBJS_DIR) - -UNIX_O = $(UNIX_DIR)/$(OBJS_DIR)/unix.o - -LINT_LIB = $(LINT_LIB_DIR)/llib-lunix.ln - -# -# Define the actual specific platforms -# -MACHINE_DEFS = -D$(PLATFORM) -D_MACHDEP -DSFMMU -DMP -MACHINE_DEFS += -D_CPU_SIGNATURE +UTSTREE=$(UTSBASE) -# -# Maximum CPUID = 01111 11 01 1 = 0x1FB (507) -# Maximum CHIPID = 1 01111 11 00 0 = 0x5F8 (1528) -# -MACHINE_DEFS += -DNCPU=508 -MACHINE_DEFS += -DMAX_CPU_CHIPID=1529 -MACHINE_DEFS += -DMAX_UPA=256 -MACHINE_DEFS += -DIGN_SIZE=8 -MACHINE_DEFS += -DMAX_MEM_NODES=16 -# -# UTSB_PHYS will enable user TSB physical access for TL>0 -# -MACHINE_DEFS += -DUTSB_PHYS -MACHINE_DEFS += -D_OPL -MACHINE_DEFS += -DOLYMPUS_SHARED_FTLB -MACHINE_DEFS += -D_CMP_NO_ERROR_STEERING -D_HW_MEMSCRUB_SUPPORT -MACHINE_DEFS += -DDO_CORELEVEL_LOADBAL -MACHINE_DEFS += -DITLB_32M_256M_SUPPORT -# -# OLYMPUS C cross-call erratas. -# - revision A can only deliver one xcall at a time. -# - revision B can dispatch xcalls to 31 (IDSR_BN_SETS) CPUs at a time, -# but it can not send more xcalls until all the pending xcalls are -# dispatched. In other words, all previous 31 xcall slots must be -# in non-busy state before further xcalls can be issued. -MACHINE_DEFS += -DOLYMPUS_C_REV_A_ERRATA_XCALL -MACHINE_DEFS += -DOLYMPUS_C_REV_B_ERRATA_XCALL -# -# OLYMPUS C Spurious interrupts -# - When an UE is detected in a interrupt packet, -# Olympus-C takes an interrupt_vector_trap (TT=0x60) while -# ASI_INTR_RECIEVE.BUSY is set to zero to indicate the existence -# of the error. Software will see this as a spurious interrupt since -# the interrupt busy bit is set to zero. SW will still need to -# explicitly clear the interrupt busy bit to reset the HW state. -# Failure to do so will result in the processor continuously taking -# an interrupt vector trap when PSTATE.IE is reset to one. -# Note that UE in interrupt packet is reported to the SP and handled -# accordingly. For the domain, the system should panic as it is not -# recoverable. -MACHINE_DEFS += -DCLEAR_INTR_BUSYBIT_ON_SPURIOUS - -# -# For now, disable these lint checks; maintainers should endeavor -# to investigate and remove these for maximum lint coverage. -# Please do not carry these forward to new Makefiles. -# -LINTTAGS += -erroff=E_SUSPICIOUS_COMPARISON -LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN -LINTTAGS += -erroff=E_SUPPRESSION_DIRECTIVE_UNUSED -LINTTAGS += -erroff=E_STATIC_UNUSED -LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW -LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV - -.KEEP_STATE: +include $(UTSBASE)/sun4u/opl/Makefile.opl.shared
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/sun4u/opl/Makefile.opl.shared Mon Nov 27 11:55:12 2006 -0800 @@ -0,0 +1,190 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "%Z%%M% %I% %E% SMI" +# +# Global definitions for sun4u opl implementation specific modules. +# +# uts/sun4u/opl/Makefile.opl +# + +# +# Define directories. +# +# +# +ROOT_OPL_DIR = $(ROOT_PLAT_DIR)/SUNW,SPARC-Enterprise +ROOT_OPL_MOD_DIR = $(ROOT_OPL_DIR)/kernel +ROOT_OPL_KERN_DIR_32 = $(ROOT_OPL_MOD_DIR) +ROOT_OPL_KERN_DIR_64 = $(ROOT_OPL_MOD_DIR)/$(SUBDIR64) +ROOT_OPL_MISC_DIR_32 = $(ROOT_OPL_MOD_DIR)/misc +ROOT_OPL_MISC_DIR_64 = $(ROOT_OPL_MOD_DIR)/misc/$(SUBDIR64) +ROOT_OPL_DRV_DIR_32 = $(ROOT_OPL_MOD_DIR)/drv +ROOT_OPL_DRV_DIR_64 = $(ROOT_OPL_MOD_DIR)/drv/$(SUBDIR64) +ROOT_OPL_CPU_DIR_32 = $(ROOT_OPL_MOD_DIR)/cpu +ROOT_OPL_CPU_DIR_64 = $(ROOT_OPL_MOD_DIR)/cpu/$(SUBDIR64) +ROOT_OPL_CRYPTO_DIR_32 = $(ROOT_OPL_MOD_DIR)/crypto +ROOT_OPL_CRYPTO_DIR_64 = $(ROOT_OPL_MOD_DIR)/crypto/$(SUBDIR64) + +ROOT_OPL_KERN_DIR = $(ROOT_OPL_KERN_DIR_$(CLASS)) +ROOT_OPL_MISC_DIR = $(ROOT_OPL_MISC_DIR_$(CLASS)) +ROOT_OPL_DRV_DIR = $(ROOT_OPL_DRV_DIR_$(CLASS)) +ROOT_OPL_CPU_DIR = $(ROOT_OPL_CPU_DIR_$(CLASS)) +ROOT_OPL_CRYPTO_DIR = $(ROOT_OPL_CRYPTO_DIR_$(CLASS)) + +ROOT_PLAT_MOD_DIRS += $(ROOT_OPL_MOD_DIR) +ROOT_PLAT_MISC_DIRS_32 += $(ROOT_OPL_MISC_DIR_32) + +USR_OPL_DIR = $(USR_PLAT_DIR)/SUNW,SPARC-Enterprise +USR_OPL_LIB_DIR = $(USR_OPL_DIR)/lib +USR_OPL_SBIN_DIR = $(USR_OPL_DIR)/sbin +USR_OPL_SBIN_EEPROM = $(USR_OPL_SBIN_DIR)/eeprom +USR_OPL_SBIN_PRTDIAG = $(USR_OPL_SBIN_DIR)/prtdiag +USR_OPL_SBIN_TRAPSTAT = $(USR_OPL_SBIN_DIR)/trapstat +USR_OPL_SBIN_FRUADM = $(USR_OPL_SBIN_DIR)/fruadm +USR_OPL_INC_DIR = $(USR_OPL_DIR)/include +USR_OPL_ISYS_DIR = $(USR_OPL_INC_DIR)/sys + +OPL_LINT_LIB_DIR = $(UTSBASE)/$(PLATFORM)/opl/lint-libs/$(OBJS_DIR) +OPLMSU_OPTION = options + +# +# Define modules. +# +OPL_KMODS = platmod +OPL_KMODS += dm2s +OPL_KMODS += oplkmdrv +OPL_KMODS += pcicmu +OPL_KMODS += oplpanel +OPL_KMODS += dr .WAIT drmach +OPL_KMODS += oplmsu +OPL_KMODS += mc-opl + +# +# CPU modules. +# +OPL_CPU_KMODS += olympus_c + +# Links to OPL crypto modules +# +OPL_CRYPTO_LINKS = aes + +# +# Include the makefiles which define build rule templates, the +# collection of files per module, and a few specific flags. Note +# that order is significant, just as with an include path. The +# first build rule template which matches the files name will be +# used. By including these in order from most machine dependent +# to most machine independent, we allow a machine dependent file +# to be used in preference over a machine independent version +# (Such as a machine specific optimization, which preserves the +# interfaces.) +# +include $(UTSBASE)/sun4u/ngdr/Makefile.files +include $(UTSTREE)/sun4u/opl/Makefile.files + +# +# Include common rules. +# +include $(UTSTREE)/sun4u/Makefile.sun4u + +# +# Define closed modules (must come after Makefile.sun4u for CLOSED_BUILD). +# +$(CLOSED_BUILD)CLOSED_OPL_KMODS = scfd + +# +# Everybody needs to know how to build modstubs.o and to locate unix.o +# +UNIX_DIR = $(UTSBASE)/$(PLATFORM)/opl/unix +MODSTUBS_DIR = $(UNIX_DIR) +DSF_DIR = $(UTSBASE)/$(PLATFORM)/opl/genassym +LINTS_DIR = $(OBJS_DIR) +LINT_LIB_DIR = $(UTSBASE)/$(PLATFORM)/opl/lint-libs/$(OBJS_DIR) + +UNIX_O = $(UNIX_DIR)/$(OBJS_DIR)/unix.o + +LINT_LIB = $(LINT_LIB_DIR)/llib-lunix.ln + +# +# Define the actual specific platforms +# +MACHINE_DEFS = -D$(PLATFORM) -D_MACHDEP -DSFMMU -DMP +MACHINE_DEFS += -D_CPU_SIGNATURE + +# +# Maximum CPUID = 01111 11 01 1 = 0x1FB (507) +# Maximum CHIPID = 1 01111 11 00 0 = 0x5F8 (1528) +# +MACHINE_DEFS += -DNCPU=508 +MACHINE_DEFS += -DMAX_CPU_CHIPID=1529 +MACHINE_DEFS += -DMAX_UPA=256 +MACHINE_DEFS += -DIGN_SIZE=8 +MACHINE_DEFS += -DMAX_MEM_NODES=16 +# +# UTSB_PHYS will enable user TSB physical access for TL>0 +# +MACHINE_DEFS += -DUTSB_PHYS +MACHINE_DEFS += -D_OPL +MACHINE_DEFS += -DOLYMPUS_SHARED_FTLB +MACHINE_DEFS += -D_CMP_NO_ERROR_STEERING -D_HW_MEMSCRUB_SUPPORT +MACHINE_DEFS += -DDO_CORELEVEL_LOADBAL +MACHINE_DEFS += -DITLB_32M_256M_SUPPORT +# +# OLYMPUS C cross-call erratas. +# - revision A can only deliver one xcall at a time. +# - revision B can dispatch xcalls to 31 (IDSR_BN_SETS) CPUs at a time, +# but it can not send more xcalls until all the pending xcalls are +# dispatched. In other words, all previous 31 xcall slots must be +# in non-busy state before further xcalls can be issued. +MACHINE_DEFS += -DOLYMPUS_C_REV_A_ERRATA_XCALL +MACHINE_DEFS += -DOLYMPUS_C_REV_B_ERRATA_XCALL +# +# OLYMPUS C Spurious interrupts +# - When an UE is detected in a interrupt packet, +# Olympus-C takes an interrupt_vector_trap (TT=0x60) while +# ASI_INTR_RECIEVE.BUSY is set to zero to indicate the existence +# of the error. Software will see this as a spurious interrupt since +# the interrupt busy bit is set to zero. SW will still need to +# explicitly clear the interrupt busy bit to reset the HW state. +# Failure to do so will result in the processor continuously taking +# an interrupt vector trap when PSTATE.IE is reset to one. +# Note that UE in interrupt packet is reported to the SP and handled +# accordingly. For the domain, the system should panic as it is not +# recoverable. +MACHINE_DEFS += -DCLEAR_INTR_BUSYBIT_ON_SPURIOUS + +# +# For now, disable these lint checks; maintainers should endeavor +# to investigate and remove these for maximum lint coverage. +# Please do not carry these forward to new Makefiles. +# +LINTTAGS += -erroff=E_SUSPICIOUS_COMPARISON +LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN +LINTTAGS += -erroff=E_SUPPRESSION_DIRECTIVE_UNUSED +LINTTAGS += -erroff=E_STATIC_UNUSED +LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW +LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV + +.KEEP_STATE:
--- a/usr/src/uts/sun4u/opl/Makefile.rules Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/uts/sun4u/opl/Makefile.rules Mon Nov 27 11:55:12 2006 -0800 @@ -27,8 +27,6 @@ # This Makefile defines the build rules for the directory # uts/sun4u/opl and its children. # -# uts/sun4u/opl/Makefile.rules -# # # Section 1a: C object build rules @@ -91,10 +89,6 @@ $(COMPILE.c) -o $@ $< $(CTFCONVERT_O) -$(OBJS_DIR)/%.o: $(UTSBASE)/sun4u/opl/io/scfd/%.c - $(COMPILE.c) -o $@ $< - $(CTFCONVERT_O) - $(OBJS_DIR)/%.o: $(UTSBASE)/sun4u/opl/io/oplmsu/%.c $(COMPILE.c) -o $@ $< $(CTFCONVERT_O) @@ -138,9 +132,6 @@ $(LINTS_DIR)/%.ln: $(UTSBASE)/sun4u/opl/io/oplpanel/%.c @($(LHEAD) $(LINT.c) $< $(LTAIL)) -$(LINTS_DIR)/%.ln: $(UTSBASE)/sun4u/opl/io/scfd/%.c - @($(LHEAD) $(LINT.c) $< $(LTAIL)) - $(LINTS_DIR)/%.ln: $(UTSBASE)/sun4u/opl/io/oplmsu/%.c @($(LHEAD) $(LINT.c) $< $(LTAIL))
--- a/usr/src/uts/sun4u/opl/Makefile.targ Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/uts/sun4u/opl/Makefile.targ Mon Nov 27 11:55:12 2006 -0800 @@ -1,4 +1,3 @@ -# # CDDL HEADER START # # The contents of this file are subject to the terms of the @@ -18,93 +17,12 @@ # # CDDL HEADER END # -# # Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # -# Common targets for sun4u opl implementation specific modules. -# -# uts/sun4u/opl/Makefile.targ -# - -.KEEP_STATE: - -# -# Rules for implementation subdirectories. -# -$(ROOT_OPL_DIR): $(ROOT_PLAT_DIR) - -$(INS.dir.root.sys) - -$(ROOT_OPL_MOD_DIR): $(ROOT_OPL_DIR) - -$(INS.dir.root.sys) - -$(ROOT_OPL_DRV_DIR_32): $(ROOT_OPL_MOD_DIR) - -$(INS.dir.root.sys) - -$(ROOT_OPL_DRV_DIR_64): $(ROOT_OPL_DRV_DIR_32) - -$(INS.dir.root.sys) - -$(ROOT_OPL_CPU_DIR_32): $(ROOT_OPL_MOD_DIR) - -$(INS.dir.root.sys) - -$(ROOT_OPL_CPU_DIR_64): $(ROOT_OPL_CPU_DIR_32) - -$(INS.dir.root.sys) - -$(ROOT_OPL_MISC_DIR_32): $(ROOT_OPL_MOD_DIR) - -$(INS.dir.root.sys) - -$(ROOT_OPL_MISC_DIR_64): $(ROOT_OPL_MISC_DIR_32) - -$(INS.dir.root.sys) - -$(ROOT_OPL_CRYPTO_DIR_32): $(ROOT_OPL_MOD_DIR) - -$(INS.dir.root.sys) - -$(ROOT_OPL_CRYPTO_DIR_64): $(ROOT_OPL_CRYPTO_DIR_32) - -$(INS.dir.root.sys) -$(USR_OPL_DIR): $(USR_PLAT_DIR) - -$(INS.dir.root.sys) - -$(USR_OPL_INC_DIR): $(USR_OPL_DIR) $(USR_PSM_INCL_DIR) - $(INS.slink4) - -$(USR_OPL_SBIN_DIR): $(USR_OPL_DIR) $(USR_PSM_SBIN_DIR) - $(INS.dir.root.bin) - -$(USR_OPL_SBIN_EEPROM): $(USR_OPL_SBIN_DIR) - $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/eeprom $@ $(CHOWNLINK) $(CHGRPLINK) - -$(USR_OPL_SBIN_PRTDIAG): $(USR_OPL_SBIN_DIR) - $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/prtdiag $@ $(CHOWNLINK) $(CHGRPLINK) - -$(USR_OPL_SBIN_TRAPSTAT): $(USR_OPL_SBIN_DIR) - $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/trapstat $@ $(CHOWNLINK) $(CHGRPLINK) - -$(USR_OPL_SBIN_FRUADM): $(USR_OPL_SBIN_DIR) - $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/fruadm $@ $(CHOWNLINK) $(CHGRPLINK) +UTSTREE=$(UTSBASE) -$(USR_OPL_LIB_DIR): $(USR_OPL_DIR) $(USR_PSM_LIB_DIR) - -$(INS.dir.root.bin) - -$(USR_OPL_ISYS_DIR): $(USR_OPL_INC_DIR) - $(INS.dir.root.bin) - -$(ROOT_OPL_KERN_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_KERN_DIR) FRC - $(INS.file) - -$(ROOT_OPL_DRV_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_DRV_DIR) FRC - $(INS.file) - -$(ROOT_OPL_CPU_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_CPU_DIR) FRC - $(INS.file) - -$(ROOT_OPL_MISC_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_MISC_DIR) FRC - $(INS.file) - -# -# Include common targets. -# -include $(UTSBASE)/sun4u/opl/Makefile.rules -include $(UTSBASE)/sun4u/Makefile.targ +include $(UTSBASE)/sun4u/opl/Makefile.targ.shared
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/sun4u/opl/Makefile.targ.shared Mon Nov 27 11:55:12 2006 -0800 @@ -0,0 +1,110 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "%Z%%M% %I% %E% SMI" +# +# Common targets for sun4u opl implementation specific modules. +# +# uts/sun4u/opl/Makefile.targ +# + +.KEEP_STATE: + +# +# Rules for implementation subdirectories. +# +$(ROOT_OPL_DIR): $(ROOT_PLAT_DIR) + -$(INS.dir.root.sys) + +$(ROOT_OPL_MOD_DIR): $(ROOT_OPL_DIR) + -$(INS.dir.root.sys) + +$(ROOT_OPL_DRV_DIR_32): $(ROOT_OPL_MOD_DIR) + -$(INS.dir.root.sys) + +$(ROOT_OPL_DRV_DIR_64): $(ROOT_OPL_DRV_DIR_32) + -$(INS.dir.root.sys) + +$(ROOT_OPL_CPU_DIR_32): $(ROOT_OPL_MOD_DIR) + -$(INS.dir.root.sys) + +$(ROOT_OPL_CPU_DIR_64): $(ROOT_OPL_CPU_DIR_32) + -$(INS.dir.root.sys) + +$(ROOT_OPL_MISC_DIR_32): $(ROOT_OPL_MOD_DIR) + -$(INS.dir.root.sys) + +$(ROOT_OPL_MISC_DIR_64): $(ROOT_OPL_MISC_DIR_32) + -$(INS.dir.root.sys) + +$(ROOT_OPL_CRYPTO_DIR_32): $(ROOT_OPL_MOD_DIR) + -$(INS.dir.root.sys) + +$(ROOT_OPL_CRYPTO_DIR_64): $(ROOT_OPL_CRYPTO_DIR_32) + -$(INS.dir.root.sys) + +$(USR_OPL_DIR): $(USR_PLAT_DIR) + -$(INS.dir.root.sys) + +$(USR_OPL_INC_DIR): $(USR_OPL_DIR) $(USR_PSM_INCL_DIR) + $(INS.slink4) + +$(USR_OPL_SBIN_DIR): $(USR_OPL_DIR) $(USR_PSM_SBIN_DIR) + $(INS.dir.root.bin) + +$(USR_OPL_SBIN_EEPROM): $(USR_OPL_SBIN_DIR) + $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/eeprom $@ $(CHOWNLINK) $(CHGRPLINK) + +$(USR_OPL_SBIN_PRTDIAG): $(USR_OPL_SBIN_DIR) + $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/prtdiag $@ $(CHOWNLINK) $(CHGRPLINK) + +$(USR_OPL_SBIN_TRAPSTAT): $(USR_OPL_SBIN_DIR) + $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/trapstat $@ $(CHOWNLINK) $(CHGRPLINK) + +$(USR_OPL_SBIN_FRUADM): $(USR_OPL_SBIN_DIR) + $(RM) -r $@; $(SYMLINK) ../../$(PLATFORM)/sbin/fruadm $@ $(CHOWNLINK) $(CHGRPLINK) + +$(USR_OPL_LIB_DIR): $(USR_OPL_DIR) $(USR_PSM_LIB_DIR) + -$(INS.dir.root.bin) + +$(USR_OPL_ISYS_DIR): $(USR_OPL_INC_DIR) + $(INS.dir.root.bin) + +$(ROOT_OPL_KERN_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_KERN_DIR) FRC + $(INS.file) + +$(ROOT_OPL_DRV_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_DRV_DIR) FRC + $(INS.file) + +$(ROOT_OPL_CPU_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_CPU_DIR) FRC + $(INS.file) + +$(ROOT_OPL_MISC_DIR)/%: $(OBJS_DIR)/% $(ROOT_OPL_MISC_DIR) FRC + $(INS.file) + +# +# Include common targets. +# +include $(UTSTREE)/sun4u/opl/Makefile.rules +include $(UTSTREE)/sun4u/Makefile.targ
--- a/usr/src/uts/sun4u/opl/io/scfd/scf_os_interface.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/sunddi.h> -#include <sys/ddi.h> -#include <sys/kobj.h> - -#include <sys/scfd/scfsys.h> -#include <sys/scfd/scfostoescf.h> - -#define XSCF_DATA_LEN 16 -#define SCF_RETRY_COUNT 10 - - -static int -scf_os_putinfo(uint8_t type, char *datap, uint32_t length) -{ - int rv, count; - - rv = 0; - - count = SCF_RETRY_COUNT; - while (count-- > 0) { - rv = scf_service_putinfo(KEY_ESCF, type, 0, length, - (void *)datap); - if (rv == EBUSY) { - /* 5 sec delay */ - delay(5 * drv_usectohz(1000000)); - continue; - } - break; - }; - - return (rv); -} - -static int -scf_os_getinfo(uint8_t type, uint32_t transid, char *datap, uint32_t *lengthp) -{ - int rv, count; - - rv = 0; - count = SCF_RETRY_COUNT; - while (count-- > 0) { - rv = scf_service_getinfo(KEY_ESCF, type, transid, lengthp, - (void *)datap); - if (rv == EBUSY) { - /* 5 sec delay */ - delay(5 * drv_usectohz(1000000)); - continue; - } - break; - }; - - return (rv); -} - -/* - * scf_fmem_start() - * - * Description: Before starting rename memory, - * sending the message - * from OS to XSCF. - * - */ -int -scf_fmem_start(int s_bd, int t_bd) -{ - char data[XSCF_DATA_LEN]; - - bzero(data, XSCF_DATA_LEN); - data[0] = (char)s_bd; - data[1] = (char)t_bd; - - return (scf_os_putinfo(SUB_OS_SEND_PRE_FMEMA, - data, XSCF_DATA_LEN)); -} - -/* - * scf_fmem_end() - * - * Description: After doing rename memory, sending the message - * from OS to XSCF. - * - */ -int -scf_fmem_end() -{ - char data[XSCF_DATA_LEN]; - int rv; - uint32_t len; - - bzero(data, XSCF_DATA_LEN); - len = XSCF_DATA_LEN; - rv = scf_os_getinfo(SUB_OS_SEND_COMPLETE_FMEMA, 0, data, &len); - - if (rv == 0) { - /* 0 is OK and everything less than 0 is BAD but TBD */ - if (len > 0) - rv = (int)data[0]; - else - rv = -1; - } - return (rv); -} - -/* - * scf_fmem_cancel() - * - * Description: If the status failed after doing rename memory - * and check the result, sending the message from OS to XSCF. - * - */ -int -scf_fmem_cancel() -{ - return (scf_os_putinfo(SUB_OS_SEND_CANCEL_FMEMA, 0, 0)); -} - -/* - * scf_get_dimminfo() - * - * Description: Get the dimm infomation for a board. This information - * includes the serial-IDs. - */ -int -scf_get_dimminfo(uint32_t boardnum, void *buf, uint32_t *bufsz) -{ - return (scf_os_getinfo(SUB_OS_RECEIVE_DIMM_INFO, boardnum, buf, bufsz)); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfconf.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1131 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/stat.h> -#include <sys/file.h> -#include <sys/types.h> -#include <sys/conf.h> -#include <sys/kmem.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> -#include <sys/scfd/scfdscpif.h> - -static struct driver_minor_data { - char *name; - int type; - int minor_num; -} scf_minor[] = { - { "pwrctl", S_IFCHR, SCF_USER_INSTANCE }, - { "rasctl", S_IFCHR, SCF_USER_INSTANCE }, - { "rcictl", S_IFCHR, SCF_USER_INSTANCE }, - SCF_DBG_IOMP_INSTANCE - { NULL, 0} -}; - - -/* - * Function list - */ -void scf_resource_free_dev(scf_state_t *statep); -void scf_reload_conf(scf_state_t *statep); - -/* - * External function - */ -extern void scf_dscp_init(void); -extern void scf_dscp_fini(void); - -/* - * External value - */ -extern int scf_devbusy_wait_time; -extern int scf_cmdend_wait_time; -extern int scf_online_wait_time; -extern int scf_rxbuff_wait_time; -extern int scf_dscp_ack_wait_time; -extern int scf_dscp_end_wait_time; -extern int scf_dscp_txbusy_time; -extern int scf_dscp_callback_time; - - -/* - * scf_attach() - * - * Description: Driver attach() entry processing. - * - */ -int -scf_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) -{ -#define SCF_FUNC_NAME "scf_attach() " - scf_state_t *statep; - int instance; - struct driver_minor_data *dmdp; - int ret = DDI_FAILURE; - char wk_pathname[MAXPATHLEN]; - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG2(SCF_DBGFLAG_DDI, - SCF_FUNC_NAME ": start instance = %d name = %s", - ddi_get_instance(dip), ddi_get_name(dip)); - SC_DBG_DRV_TRACE(TC_ATTACH|TC_IN, __LINE__, &cmd, - sizeof (ddi_attach_cmd_t)); - - if (strcmp(ddi_get_name(dip), SCF_DRIVER_NAME) == 0) { - /* pseudo device */ - if (cmd == DDI_ATTACH) { - SCFDBGMSG(SCF_DBGFLAG_DDI, "pseudo attach proc"); - mutex_enter(&scf_comtbl.attach_mutex); - - /* get instance number */ - instance = ddi_get_instance(dip); - - /* allocate softstate */ - if (ddi_soft_state_zalloc(scfstate, instance) != - DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_soft_state_zalloc failed.\n", - scf_driver_name); - - mutex_exit(&scf_comtbl.attach_mutex); - goto END_attach; - } - - /* get softstate */ - if ((statep = ddi_get_soft_state(scfstate, instance)) == - NULL) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_get_soft_state failed.\n", - scf_driver_name); - ddi_soft_state_free(scfstate, instance); - - mutex_exit(&scf_comtbl.attach_mutex); - goto END_attach; - } - - /* retain dip in soft state */ - statep->dip = dip; - - /* create minor node */ - for (dmdp = scf_minor; dmdp->name != NULL; dmdp++) { - if (ddi_create_minor_node(dip, dmdp->name, - dmdp->type, dmdp->minor_num, - DDI_PSEUDO, 0) == DDI_FAILURE) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, - __LINE__, "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_create_minor_node " - "failed.\n", - scf_driver_name); - - /* remove minor node */ - if (scf_comtbl.resource_flag & - DID_MNODE) { - ddi_remove_minor_node(dip, - NULL); - scf_comtbl.resource_flag &= - (~DID_MNODE); - } - - /* soft state free */ - ddi_soft_state_free(scfstate, instance); - - mutex_exit(&scf_comtbl.attach_mutex); - goto END_attach; - } - scf_comtbl.resource_flag |= DID_MNODE; - SCFDBGMSG(SCF_DBGFLAG_DDI, - "ddi_create_minor_node() is success"); - } - - scf_comtbl.scf_pseudo_p = statep; - - mutex_exit(&scf_comtbl.attach_mutex); - } - ret = DDI_SUCCESS; - goto END_attach; - } - - /* get SCF Driver mutex */ - mutex_enter(&scf_comtbl.attach_mutex); - - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - - if (ddi_get_iblock_cookie(dip, 0, &scf_comtbl.iblock_cookie) != - DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_get_iblock_cookie failed.\n", - scf_driver_name); - - mutex_exit(&scf_comtbl.attach_mutex); - goto END_attach; - } - - mutex_init(&scf_comtbl.all_mutex, NULL, MUTEX_DRIVER, - scf_comtbl.iblock_cookie); - scf_comtbl.resource_flag |= DID_MUTEX_ALL; - } - if (!(scf_comtbl.resource_flag & DID_MUTEX_SI)) { - - if (ddi_get_soft_iblock_cookie(dip, SCF_EVENT_PRI, - &scf_comtbl.soft_iblock_cookie) != - DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_get_soft_iblock_cookie failed.\n", - scf_driver_name); - - mutex_exit(&scf_comtbl.attach_mutex); - goto END_attach; - } - - mutex_init(&scf_comtbl.si_mutex, NULL, MUTEX_DRIVER, - scf_comtbl.soft_iblock_cookie); - scf_comtbl.resource_flag |= DID_MUTEX_SI; - } - /* add software interrupt handler */ - if (!(scf_comtbl.resource_flag & DID_SOFTINTR)) { - if (ddi_add_softintr(dip, SCF_EVENT_PRI, - &scf_comtbl.scf_softintr_id, NULL, NULL, - &scf_softintr, NULL) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ATTACH | TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: ddi_add_softintr failed.", - scf_driver_name); - goto ATTACH_failed; - } - scf_comtbl.resource_flag |= DID_SOFTINTR; - } - /* kstat resource initialize */ - if (!(scf_comtbl.resource_flag & DID_KSTAT)) { - scf_kstat_init(); - scf_comtbl.resource_flag |= DID_KSTAT; - } - - mutex_exit(&scf_comtbl.attach_mutex); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* get instance number */ - instance = ddi_get_instance(dip); - - switch (cmd) { - case DDI_ATTACH: - /* DDI_ATTACH */ - SCFDBGMSG(SCF_DBGFLAG_DDI, "attach proc"); - /* allocate softstate */ - if (ddi_soft_state_zalloc(scfstate, instance) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_soft_state_zalloc failed.\n", - scf_driver_name); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_attach; - } - - /* get softstate */ - if ((statep = ddi_get_soft_state(scfstate, instance)) == NULL) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: ddi_get_soft_state failed.\n", - scf_driver_name); - ddi_soft_state_free(scfstate, instance); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_attach; - } - - /* pathname get (use cmn_err) */ - if (ddi_pathname(dip, &wk_pathname[0]) != 0) { - sprintf(&statep->pathname[0], "%s(%s%d)", - &wk_pathname[0], ddi_get_name(dip), instance); - } else { - sprintf(&statep->pathname[0], "(%s%d)", - ddi_get_name(dip), instance); - } - - /* retain dip in soft state */ - statep->dip = dip; - - /* create minor node */ - sprintf(wk_pathname, "%s%d", ddi_get_name(dip), instance); - if (ddi_create_minor_node(dip, wk_pathname, S_IFCHR, instance, - DDI_PSEUDO, 0) == DDI_FAILURE) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: " - "ddi_create_minor_node failed.\n", - scf_driver_name); - goto ATTACH_failed; - } - statep->resource_flag |= S_DID_MNODE; - - statep->instance = instance; - - /* get configuration file */ - scf_reload_conf(statep); - - /* map SCF registers */ - if (scf_map_regs(dip, statep) != 0) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - goto ATTACH_failed; - } - - /* add interrupt handler */ - if (ddi_add_intr(dip, 0, NULL, 0, &scf_intr, (caddr_t)statep) != - DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: ddi_add_intr failed.\n", - scf_driver_name); - goto ATTACH_failed; - } - statep->resource_flag |= S_DID_INTR; - - SCF_DBG_IOMP_ADD(statep); - - /* DSCP inteface initialize */ - if (!(scf_comtbl.resource_flag & DID_DSCPINIT)) { - scf_dscp_init(); - scf_comtbl.resource_flag |= DID_DSCPINIT; - } - - /* permit SCF intr */ - scf_permit_intr(statep, 1); - - /* first attach */ - if ((scf_comtbl.scf_path_p == NULL) && - (scf_comtbl.scf_exec_p == NULL)) { - /* no execute scf device */ - if (scf_comtbl.watchdog_after_resume) { - scf_comtbl.alive_running = SCF_ALIVE_START; - scf_comtbl.watchdog_after_resume = 0; - } - scf_chg_scf(statep, PATH_STAT_ACTIVE); - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - scf_comtbl.scf_domain_event_sub = EVENT_SUB_DOMAIN_WAIT; - scf_next_cmd_check(statep); - } else { - /* exists execute scf device */ - scf_chg_scf(statep, PATH_STAT_STANDBY); - } - scf_comtbl.attach_count++; - - ddi_report_dev(dip); - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, - SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - ret = DDI_SUCCESS; - goto END_attach; - - case DDI_RESUME: - SCFDBGMSG(SCF_DBGFLAG_DDI, "resume proc"); - /* get softstate */ - if ((statep = ddi_get_soft_state(scfstate, instance)) == NULL) { - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, - "attach ", 8); - cmn_err(CE_WARN, - "%s: scf_attach: ddi_get_soft_state failed.\n", - scf_driver_name); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_attach; - } - - /* Transmitting stop release by SUSPEND */ - scf_comtbl.scf_suspend_sendstop = 0; - /* queue update */ - scf_del_queue(statep); - if ((statep->old_path_status == PATH_STAT_ACTIVE) || - (statep->old_path_status == PATH_STAT_STANDBY)) { - if ((scf_comtbl.scf_path_p == NULL) && - (scf_comtbl.scf_exec_p == NULL)) { - scf_comtbl.suspend_flag = 0; - if (scf_comtbl.watchdog_after_resume) { - scf_comtbl.alive_running = - SCF_ALIVE_START; - scf_comtbl.watchdog_after_resume = 0; - } - /* permit SCF intr */ - scf_permit_intr(statep, 1); - scf_chg_scf(statep, PATH_STAT_ACTIVE); - scf_comtbl.scf_pchg_event_sub = - EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(statep); - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_RUN_WAIT; - } else { - /* exists execute SCF device */ - scf_chg_scf(statep, PATH_STAT_STANDBY); - /* permit SCF intr */ - scf_permit_intr(statep, 1); - } - } else { - scf_chg_scf(statep, statep->old_path_status); - } - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, - SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - ret = DDI_SUCCESS; - goto END_attach; - - default: - SC_DBG_DRV_TRACE(TC_ATTACH|TC_ERR, __LINE__, "attach ", 8); - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_attach; - } - -/* - * ATTACH_failed - */ - ATTACH_failed: - - scf_resource_free_dev(statep); - - if ((scf_comtbl.scf_exec_p == NULL) && - (scf_comtbl.scf_path_p == NULL) && - (scf_comtbl.scf_wait_p == NULL) && - (scf_comtbl.scf_suspend_p == NULL) && - (scf_comtbl.scf_stop_p == NULL) && - (scf_comtbl.scf_disc_p == NULL) && - (scf_comtbl.scf_err_p == NULL)) { - /* last SCF device */ - - /* DSCP interface area release */ - if (scf_comtbl.resource_flag & DID_DSCPINIT) { - scf_dscp_fini(); - scf_comtbl.resource_flag &= (~DID_DSCPINIT); - } - - /* All timer stop */ - scf_timer_all_stop(); - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = - scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - mutex_enter(&scf_comtbl.attach_mutex); - - /* destroy kstat resources */ - if (scf_comtbl.resource_flag & DID_KSTAT) { - scf_kstat_fini(); - scf_comtbl.resource_flag &= (~DID_KSTAT); - } - - mutex_exit(&scf_comtbl.attach_mutex); - } else { - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - } - - ddi_soft_state_free(scfstate, instance); - -/* - * END_attach - */ - END_attach: - - SC_DBG_DRV_TRACE(TC_ATTACH|TC_OUT, __LINE__, &ret, sizeof (int)); - SCFDBGMSG1(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_detach() - * - * Description: Driver detach() entry processing. - * - */ -int -scf_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_detach() " - scf_state_t *statep; - int instance; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - int ret = DDI_FAILURE; - scf_state_t *next_path = 0; - int cv_ret; - clock_t wk_time; - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG2(SCF_DBGFLAG_DDI, - SCF_FUNC_NAME ": start instance = %d name = %s", - ddi_get_instance(dip), ddi_get_name(dip)); - SC_DBG_DRV_TRACE(TC_DETACH|TC_IN, __LINE__, &cmd, - sizeof (ddi_detach_cmd_t)); - - if (strcmp(ddi_get_name(dip), SCF_DRIVER_NAME) == 0) { - if (cmd == DDI_DETACH) { - SCFDBGMSG(SCF_DBGFLAG_DDI, "pseudo detach proc"); - mutex_enter(&scf_comtbl.attach_mutex); - - /* get instance number */ - instance = ddi_get_instance(dip); - - /* remove minor node */ - if (scf_comtbl.resource_flag & DID_MNODE) { - ddi_remove_minor_node(dip, NULL); - scf_comtbl.resource_flag &= (~DID_MNODE); - SCFDBGMSG(SCF_DBGFLAG_DDI, - "ddi_remove_minor_node() is success"); - } - - /* soft state free */ - ddi_soft_state_free(scfstate, instance); - - scf_comtbl.scf_pseudo_p = NULL; - - mutex_exit(&scf_comtbl.attach_mutex); - } - ret = DDI_SUCCESS; - goto END_detach; - } - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - switch (cmd) { - case DDI_DETACH: - SCFDBGMSG(SCF_DBGFLAG_DDI, "detach proc"); - /* get instance number */ - instance = ddi_get_instance(dip); - - /* get softstate */ - if ((statep = ddi_get_soft_state(scfstate, instance)) == NULL) { - SC_DBG_DRV_TRACE(TC_DETACH|TC_ERR, __LINE__, - "detach ", 8); - cmn_err(CE_WARN, - "%s: scf_detach: ddi_get_soft_state failed.\n", - scf_driver_name); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_detach; - } - - if ((scf_comtbl.scf_exec_p == statep) || - (scf_comtbl.scf_path_p == statep)) { - if ((next_path = scf_comtbl.scf_wait_p) == 0) { - if (scf_last_detach_mode == 0) { - /* Last deveice detach is error */ - SC_DBG_DRV_TRACE(TC_DETACH|TC_MSG, - __LINE__, "detach ", 8); - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_detach; - } - } - } - - /* SCF command transmit sync stop */ - (void) scf_make_send_cmd(&scf_cmd, SCF_USE_STOP); - - scf_del_queue(statep); - scf_comtbl.attach_count--; - - /* forbid interrupt */ - scf_forbid_intr(statep); - - if (next_path) { - /* SCF path change */ - scf_comtbl.scf_wait_p = next_path->next; - scf_chg_scf(next_path, PATH_STAT_ACTIVE); - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(next_path); - } - /* SCF command sync start */ - (void) scf_make_send_cmd(&scf_cmd, SCF_USE_START); - SCF_DBG_IOMP_DEL(statep); - - scf_resource_free_dev(statep); - - /* free resources allocated in driver */ - if ((scf_comtbl.scf_exec_p == NULL) && - (scf_comtbl.scf_path_p == NULL) && - (scf_comtbl.scf_wait_p == NULL) && - (scf_comtbl.scf_suspend_p == NULL) && - (scf_comtbl.scf_stop_p == NULL) && - (scf_comtbl.scf_disc_p == NULL) && - (scf_comtbl.scf_err_p == NULL)) { - /* last device */ - - /* DSCP interface area release */ - if (scf_comtbl.resource_flag & DID_DSCPINIT) { - scf_dscp_fini(); - scf_comtbl.resource_flag &= (~DID_DSCPINIT); - } - - /* All timer stop */ - scf_timer_all_stop(); - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, - SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, - SCF_TIMERCD_MAX); - } - - SCF_DBG_TEST_TIMER_STOP; - - mutex_enter(&scf_comtbl.attach_mutex); - - /* destroy kstat resources */ - if (scf_comtbl.resource_flag & DID_KSTAT) { - scf_kstat_fini(); - scf_comtbl.resource_flag &= (~DID_KSTAT); - } - - mutex_exit(&scf_comtbl.attach_mutex); - } else { - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, - SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, - SCF_TIMERCD_MAX); - } - } - - /* soft state free */ - ddi_soft_state_free(scfstate, instance); - - ret = DDI_SUCCESS; - goto END_detach; - - case DDI_SUSPEND: - SCFDBGMSG(SCF_DBGFLAG_DDI, "suspend proc"); - - /* get instance number */ - instance = ddi_get_instance(dip); - - /* get softstate */ - if ((statep = ddi_get_soft_state(scfstate, instance)) == NULL) { - SC_DBG_DRV_TRACE(TC_DETACH|TC_ERR, __LINE__, - "detach ", 8); - cmn_err(CE_WARN, - "%s: scf_detach: ddi_get_soft_state failed.\n", - scf_driver_name); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - goto END_detach; - } - - if ((scf_comtbl.scf_exec_p == statep) || - (scf_comtbl.scf_path_p == statep)) { - /* report "Shutdown start" to SCF */ - scf_comtbl.suspend_flag = 1; - - /* - * if watching cpu stop it, but set flag for - * restart after resume - */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_comtbl.watchdog_after_resume = 1; - scf_comtbl.alive_running = SCF_ALIVE_STOP; - } - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALSP_WAIT; - scf_next_cmd_check(statep); - /* SUSPEND wait state */ - wk_time = drv_usectohz(SCF_MIL2MICRO(scf_timer_value_get - (SCF_TIMERCD_CMDEND))) + ddi_get_lbolt(); - scf_comtbl.suspend_wait = 1; - while (scf_comtbl.suspend_wait != 0) { - cv_ret = cv_timedwait_sig - (&scf_comtbl.suspend_wait_cv, - &scf_comtbl.all_mutex, wk_time); - if (cv_ret == 0) { - scf_comtbl.suspend_wait = 0; - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.suspend_wait_cv, - sizeof (kcondvar_t)); - break; - } else if (cv_ret == (-1)) { - scf_comtbl.suspend_wait = 0; - SC_DBG_DRV_TRACE(TC_DETACH|TC_ERR, - __LINE__, "detach ", 8); - break; - } - } - /* Check SCF command exec */ - if (scf_comtbl.scf_cmd_exec_flag) { - /* Set command wait status */ - scf_cmdwait_status_set(); - scf_comtbl.scf_cmd_exec_flag = 0; - } - - /* All timer stop */ - scf_timer_all_stop(); - } - - scf_del_queue(statep); - scf_chg_scf(statep, PATH_STAT_EMPTY); - - /* forbid interrupt */ - scf_forbid_intr(statep); - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = - scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - ret = DDI_SUCCESS; - goto END_detach; - - default: - SC_DBG_DRV_TRACE(TC_DETACH|TC_ERR, __LINE__, "detach ", 8); - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - break; - - } - -/* - * END_detach - */ - END_detach: - - SC_DBG_DRV_TRACE(TC_DETACH|TC_OUT, __LINE__, &ret, sizeof (int)); - SCFDBGMSG1(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_resource_free_dev() - * - * Description: Release processing of device resources. - * - */ -void -scf_resource_free_dev(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_resource_free_dev() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": start"); - - /* remove intr */ - if (statep->resource_flag & S_DID_INTR) { - ddi_remove_intr(statep->dip, 0, scf_comtbl.iblock_cookie); - statep->resource_flag &= (~S_DID_INTR); - SCFDBGMSG(SCF_DBGFLAG_DDI, "ddi_remove_intr() is success"); - } - - /* remove minor node */ - if (statep->resource_flag & S_DID_MNODE) { - ddi_remove_minor_node(statep->dip, NULL); - statep->resource_flag &= (~S_DID_MNODE); - SCFDBGMSG(SCF_DBGFLAG_DDI, - "ddi_remove_minor_node() is success"); - } - - /* unmap SCF registers */ - scf_unmap_regs(statep); - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_getinfo() - * - * Description: Driver getinfo() entry processing. - * - */ -/* ARGSUSED */ -int -scf_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **resultp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_getinfo() " - scf_state_t *statep; - int ret; - int instance; - - SCFDBGMSG1(SCF_DBGFLAG_OPCLS, SCF_FUNC_NAME ": start instance = %d", - getminor((dev_t)arg)); - - instance = getminor((dev_t)arg); - if (SCF_CHECK_INSTANCE(instance)) { - instance = SCF_USER_INSTANCE; - } - - switch (cmd) { - case DDI_INFO_DEVT2INSTANCE: - *resultp = (void *)(uintptr_t)instance; - ret = DDI_SUCCESS; - goto END_getinfo; - case DDI_INFO_DEVT2DEVINFO: - statep = (scf_state_t *)ddi_get_soft_state(scfstate, instance); - if (statep != NULL) { - *resultp = statep->dip; - ret = DDI_SUCCESS; - goto END_getinfo; - } - default: - SC_DBG_DRV_TRACE(TC_GETINFO|TC_ERR, __LINE__, "getinfo ", 8); - *resultp = NULL; - ret = DDI_FAILURE; - } - -/* - * END_getinfo - */ - END_getinfo: - - SC_DBG_DRV_TRACE(TC_GETINFO|TC_OUT, __LINE__, &ret, sizeof (int)); - SCFDBGMSG1(SCF_DBGFLAG_OPCLS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_reload_conf() - * - * Description: Read in processing of driver configuration file. - * - */ -void -scf_reload_conf(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_reload_conf() " - dev_info_t *dip; - int get_prm; - char *wkcharp = NULL; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": start"); - - if (scf_comtbl.reload_conf_flag == FLAG_OFF) { - dip = statep->dip; - - /* - * get driver control mode value - */ - - /* SCFHALT after processing mode */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_halt_proc_mode", (-1)); - if (get_prm != (-1)) { - scf_halt_proc_mode = (uint_t)get_prm; - } - - /* - * get alive check function parameter value - */ - /* Operation of alive check function */ - if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf-alive-check-function", &wkcharp) == - DDI_PROP_SUCCESS) { - if (strcmp(wkcharp, SCF_ALIVE_FUNC_ON) == 0) { - scf_comtbl.alive_running = SCF_ALIVE_START; - } else if (strcmp(wkcharp, SCF_ALIVE_FUNC_OFF) == 0) { - scf_comtbl.alive_running = SCF_ALIVE_STOP; - } - ddi_prop_free(wkcharp); - } - - /* Interrupt interval time */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf-alive-interval-time", (-1)); - if (get_prm != (-1)) { - SCF_MIN_TO_10SEC(get_prm); - scf_alive_interval_time = (uchar_t)get_prm; - } - /* Monitoring timeout */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf-alive-monitor-time", (-1)); - if (get_prm != (-1)) { - SCF_MIN_TO_10SEC(get_prm); - scf_alive_monitor_time = (uchar_t)get_prm; - } - /* Panic timeout */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf-alive-panic-time", (-1)); - if (get_prm != (-1)) { - SCF_MIN_TO_10SEC(get_prm); - scf_alive_panic_time = (ushort_t)get_prm; - } - - if ((scf_alive_interval_time < INTERVAL_TIME_MIN) || - (scf_alive_interval_time > INTERVAL_TIME_MAX) || - (scf_alive_monitor_time < MONITOR_TIME_MIN) || - (scf_alive_monitor_time > MONITOR_TIME_MAX) || - ((scf_alive_panic_time != PANIC_TIME_NONE) && - (scf_alive_panic_time < PANIC_TIME_MIN)) || - (scf_alive_panic_time > PANIC_TIME_MAX)) { - scf_alive_interval_time = INTERVAL_TIME_DEF; - scf_alive_monitor_time = MONITOR_TIME_DEF; - scf_alive_panic_time = PANIC_TIME_DEF; - } - if (scf_alive_interval_time >= scf_alive_monitor_time) { - scf_alive_monitor_time = - scf_alive_interval_time + MONITOR_TIME_CORRECT; - } - - /* - * get system interface control value - */ - - /* SCFIOCRDCTRL wait timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_rdctrl_sense_wait", (-1)); - if ((get_prm >= SCF_SEC2MICRO(1)) && - (get_prm <= SCF_SEC2MICRO(120))) { - scf_rdctrl_sense_wait = (uint_t)get_prm; - } - - /* Buff full wait retry timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_buf_ful_rtime", (-1)); - if (get_prm >= 0) { - scf_buf_ful_rtime = (uint_t)get_prm; - } - - /* RCI busy wait retry timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_rci_busy_rtime", (-1)); - if (get_prm >= 0) { - scf_rci_busy_rtime = (uint_t)get_prm; - } - - /* Tx sum retry counter */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_tesum_rcnt", (-1)); - if (get_prm >= 0) { - scf_tesum_rcnt = (uint_t)get_prm; - } - - /* Rx sum retry counter */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_resum_rcnt", (-1)); - if (get_prm >= 0) { - scf_resum_rcnt = (uint_t)get_prm; - } - - /* Command to retry counter */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_cmd_to_rcnt", (-1)); - if (get_prm >= 0) { - scf_cmd_to_rcnt = (uint_t)get_prm; - } - - /* Command device busy retry counter */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_devbusy_wait_rcnt", (-1)); - if (get_prm >= 0) { - scf_devbusy_wait_rcnt = (uint_t)get_prm; - } - - /* SCF online retry counter */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_online_wait_rcnt", (-1)); - if (get_prm >= 0) { - scf_online_wait_rcnt = (uint_t)get_prm; - } - - /* SCF path change retry counter */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_path_change_max", (-1)); - if (get_prm >= 0) { - scf_path_change_max = (uint_t)get_prm; - } - - /* - * get timer control value - */ - - /* SCF command busy watch timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_devbusy_wait_time", (-1)); - if (get_prm >= 0) { - scf_devbusy_wait_time = (uint_t)get_prm; - } - - /* SCF command completion watch value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_cmdend_wait_time", (-1)); - if (get_prm >= 0) { - scf_cmdend_wait_time = (uint_t)get_prm; - } - - /* SCF online watch timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_online_wait_time", (-1)); - if (get_prm >= 0) { - scf_online_wait_time = (uint_t)get_prm; - } - - /* Next receive wait timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_rxbuff_wait_time", (-1)); - if (get_prm >= 0) { - scf_rxbuff_wait_time = (uint_t)get_prm; - } - - /* DSCP interface TxACK watch timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_dscp_ack_wait_time", (-1)); - if (get_prm >= 0) { - scf_dscp_ack_wait_time = (uint_t)get_prm; - } - - /* DSCP interface TxEND watch timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_dscp_end_wait_time", (-1)); - if (get_prm >= 0) { - scf_dscp_end_wait_time = (uint_t)get_prm; - } - - /* DSCP interface busy watch timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_dscp_txbusy_time", (-1)); - if (get_prm >= 0) { - scf_dscp_txbusy_time = (uint_t)get_prm; - } - - /* DSCP interface callback timer value */ - get_prm = ddi_prop_get_int(DDI_DEV_T_ANY, dip, - (DDI_PROP_DONTPASS | DDI_PROP_NOTPROM), - "scf_dscp_callback_time", (-1)); - if (get_prm >= 0) { - scf_dscp_callback_time = (uint_t)get_prm; - } - - /* Timer value set */ - scf_timer_init(); - - scf_comtbl.reload_conf_flag = FLAG_ON; - } - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end"); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfd.conf Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 -# -#pragma ident "%Z%%M% %I% %E% SMI" - -# Begin (do not edit) -name="scfd" parent="pseudo" instance=200; -ddi-forceattach=1; -interrupt-priorities=0x9; -# End (do not edit) - -# When scf-alive-check-function is set to "on", starts the Alive check -# function by XSCF. If XSCF detected abnormality of the domain, OS panic of -# the domain is executed. The default is "off". -# "on" : Starts the Alive check function -# "off" : Stops the Alive check function -scf-alive-check-function="off"; - -# You can set the Alive check interval time for the Alive check function. -# Specify this parameter in minutes. The range is 1 - 10 minutes. -# The default is 2 minutes. -scf-alive-interval-time=2; - -# You can set the Alive check monitoring time for the Alive check function. -# Specify this parameter in minutes. The range is 3 - 30 minutes. -# The default is 6 minutes. -scf-alive-monitor-time=6; - -# You can set the monitoring time for the OS panic monitoring of Alive -# check function. Specify this parameter in minutes. The range is -# 30 - 360 minutes. The default is 30 minutes. -scf-alive-panic-time=30;
--- a/usr/src/uts/sun4u/opl/io/scfd/scfdebug.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2079 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/ksynch.h> -#include <sys/types.h> -#include <sys/file.h> -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> -#include <sys/scfd/scfdscp.h> - -#ifdef DEBUG -/* - * Debug control value and flag - */ -uint_t scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_OFF; -uint_t scf_debug_test_rxbuff_nosum_check_flag = SCF_DBF_RXBUFF_NOSUM_CHECK_OFF; -uint_t scf_debug_test_sys_event_flag = SCF_DBF_SYS_EVENT_OFF; -uint_t scf_debug_test_sys_poff_flag = SCF_DBF_SYS_POFF_OFF; -uint_t scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_OFF; -uint_t scf_debug_test_cmdr_busy = SCF_DBC_CMDR_BUSY_CLEAR; -uint_t scf_debug_test_cmdexr_busy = SCF_DBC_CMDEXR_BUSY_CLEAR; -uint_t scf_debug_test_path_check = SCF_DBC_PATH_CHECK_CLEAR; -uint_t scf_debug_test_path_check_rtn = SCF_DBC_PATH_CHECK_RTN_CLEAR; -uint_t scf_debug_test_offline_check = SCF_DBC_OFFLINE_CHECK_CLEAR; -uint_t scf_debug_test_offline_check_rtn = SCF_DBC_OFFLINE_CHECK_RTN_CLEAR; -uint_t scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; -uint_t scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_OFF; - -uint_t scf_no_make_sum_s = SCF_DBF_NO_MAKE_SUM_S_OFF; -uint_t scf_no_make_sum_l = SCF_DBF_NO_MAKE_SUM_L_OFF; - -uint_t scf_debug_nofirm_sys = SCF_DBF_NOFIRM_SYS_OFF; -uint_t scf_debug_scfint_time = SCF_DBT_SCFINT_TIME_100MS; -uint_t scf_debug_nofirm_dscp = SCF_DBF_NOFIRM_DSCP_OFF; -uint_t scf_debug_idbcint_time = SCF_DBT_IDBCINT_TIME_100MS; -uint_t scf_debug_test_dscp_loopback = SCF_DBF_DSCP_LOOPBACK_OFF; -uint_t scf_debug_nooffline_check = SCF_DBF_NOOFFLINE_CHECK_OFF; -uint_t scf_debug_no_dscp_path = SCF_DBF_NO_DSCP_PATH_OFF; -uint_t scf_debug_no_alive = SCF_DBF_NO_ALIVE_OFF; -uint_t scf_debug_norxsum_check = SCF_DBF_NORXSUM_CHECK_OFF; -uint_t scf_debug_no_int_reason = SCF_DBF_NO_INT_REASON_OFF; - -uint_t scf_debug_no_device = SCF_DBF_NO_DEVICE_OFF; - -scf_regs_t *scf_debug_scf_regs; -scf_regs_c_t *scf_debug_scf_regs_c; -scf_dscp_sram_t *scf_debug_scf_dscp_sram; -scf_sys_sram_t *scf_debug_scf_sys_sram; -scf_interface_t *scf_debug_scf_interface; -scf_if_drvtrc_t *scf_debug_scf_reg_drvtrc; - -scf_regs_t scf_debug_scf_regs_tbl; -scf_regs_c_t scf_debug_scf_regs_c_tbl; -scf_dscp_sram_t scf_debug_scf_dscp_sram_tbl; -scf_sys_sram_t scf_debug_scf_sys_sram_tbl; -scf_interface_t scf_debug_scf_interface_tbl; -struct { - uint8_t data[0x00001000]; - -} scf_debug_scf_reg_drvtrc_tbl; - -struct { - uint16_t STATUS; - uint16_t INT_ST; - uint32_t STATUS_ExR; - uint32_t rxsize; - uint32_t RDATA0; - uint32_t RDATA1; - uint32_t RDATA2; - uint32_t RDATA3; - uint32_t POFF_FACTOR; - uint32_t EVENT[8 * 4]; -} scf_debug_test_sys_int_tbl; - -struct { - uint8_t DSR; - uint8_t rev01; - uint16_t TxDSR_C_FLAG; - uint16_t TxDSR_OFFSET; - uint32_t rxsize; - uint16_t RxDCR_C_FLAG; - uint16_t RxDCR_OFFSET; - uint32_t RxDCR_LENGTH; - uint32_t rsv14; - uint32_t rsv18; -} scf_debug_test_dscp_int_tbl; - -uint32_t scf_debug_rdata[4] = {0, 0, 0, 0}; - -timeout_id_t scf_debug_test_intr_id = 0; -timeout_id_t scf_debug_test_alive_id = 0; -uint_t scf_debug_test_alive_flag = FLAG_OFF; - -/* - * Function list - */ -int scf_debug_cmdthrough(intptr_t arg, int mode); -int scf_debug_test(intptr_t arg, int mode); -void scf_debug_test_intr_tout(void *arg); -void scf_debug_test_intr(scf_state_t *statep); -void scf_debug_test_intr_scfint(scf_state_t *statep); -void scf_debug_test_intr_cmdend(scf_state_t *statep); -void scf_debug_test_intr_poff(void); -void scf_debug_test_dsens(struct scf_cmd *scfcmdp, scf_int_reason_t *int_rp, - int len); -void scf_debug_test_intr_dscp_dsr(scf_state_t *statep); -void scf_debug_test_intr_dscp_rxtx(scf_state_t *statep, uint8_t dsr); -void scf_debug_test_alive_start(scf_state_t *statep); -void scf_debug_test_alive_stop(scf_state_t *statep); -void scf_debug_test_alive_intr_tout(void *arg); -void scf_debug_test_send_cmd(struct scf_state *statep, - struct scf_cmd *scfcmdp); -void scf_debug_test_txreq_send(scf_state_t *statep, scf_dscp_dsc_t *dsc_p); -void scf_debug_test_event_handler(scf_event_t mevent, void *arg); -void scf_debug_test_timer_stop(void); -void scf_debug_test_map_regs(scf_state_t *statep); -void scf_debug_test_unmap_regs(scf_state_t *statep); - -/* - * External function - */ -extern int scf_dscp_init(void); -extern void scf_dscp_fini(void); -extern void scf_dscp_start(uint32_t factor); -extern void scf_dscp_stop(uint32_t factor); -extern int scf_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); -extern int scf_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); - -extern int scf_fmem_start(int s_bd, int t_bd); -extern int scf_fmem_end(void); -extern int scf_fmem_cancel(void); -extern int scf_get_dimminfo(uint32_t boardnum, void *buf, uint32_t *bufsz); - -int -scf_debug_cmdthrough(intptr_t arg, int mode) -{ -#define SCF_FUNC_NAME "scf_debug_cmdthrough() " - int ret = 0; - scfcmdthrough_t *scfcmdthrough_p = NULL; - struct scf_cmd scf_cmd; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - scfcmdthrough_p = - kmem_zalloc((size_t)(sizeof (scfcmdthrough_t)), - KM_SLEEP); - if (ddi_copyin((void *)arg, (void *)scfcmdthrough_p, - sizeof (scfcmdthrough_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_cmdt", 8); - ret = EFAULT; - goto END_cmdthrough; - } - - mutex_enter(&scf_comtbl.all_mutex); - - switch (scfcmdthrough_p->mode) { - case SCF_CMDTHROUGH_START: - scf_comtbl.debugxscf_flag = 1; - - mutex_exit(&scf_comtbl.all_mutex); - break; - - case SCF_CMDTHROUGH_STOP: - scf_comtbl.debugxscf_flag = 0; - - mutex_exit(&scf_comtbl.all_mutex); - break; - - case SCF_CMDTHROUGH_CMD: - if (!scf_comtbl.debugxscf_flag) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_cmdt", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_cmdthrough; - } - scf_cmd.cmd = (unsigned char)scfcmdthrough_p->code; - scf_cmd.subcmd = (unsigned char)(scfcmdthrough_p->code >> 8); - - switch (scfcmdthrough_p->cmdtype) { - case SCF_CMDTHROUGH_TYPE_NN: - case SCF_CMDTHROUGH_TYPE_NS: - case SCF_CMDTHROUGH_TYPE_NL: - scf_cmd.scount = 0; - break; - - case SCF_CMDTHROUGH_TYPE_SN: - case SCF_CMDTHROUGH_TYPE_SS: - case SCF_CMDTHROUGH_TYPE_SL: - if (scfcmdthrough_p->sbufleng > SCF_S_CNT_16) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_cmdt", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_cmdthrough; - } - scf_cmd.scount = scfcmdthrough_p->sbufleng; - break; - - case SCF_CMDTHROUGH_TYPE_LN: - case SCF_CMDTHROUGH_TYPE_LS: - if (scfcmdthrough_p->sbufleng > SCF_L_CNT_MAX) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_cmdt", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_cmdthrough; - } - scf_cmd.scount = scfcmdthrough_p->sbufleng; - break; - - default: - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_cmdt", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_cmdthrough; - } - - switch (scfcmdthrough_p->cmdtype) { - case SCF_CMDTHROUGH_TYPE_NN: - case SCF_CMDTHROUGH_TYPE_SN: - scf_cmd.flag = SCF_USE_S_BUF; - break; - - case SCF_CMDTHROUGH_TYPE_NS: - case SCF_CMDTHROUGH_TYPE_SS: - scf_cmd.flag = SCF_USE_SSBUF; - break; - - case SCF_CMDTHROUGH_TYPE_NL: - case SCF_CMDTHROUGH_TYPE_SL: - scf_cmd.flag = SCF_USE_SLBUF; - break; - - case SCF_CMDTHROUGH_TYPE_LN: - scf_cmd.flag = SCF_USE_L_BUF; - break; - - case SCF_CMDTHROUGH_TYPE_LS: - scf_cmd.flag = SCF_USE_LSBUF; - break; - } - scf_cmd.sbuf = &scfcmdthrough_p->sbuf[0]; - scf_cmd.scount = scfcmdthrough_p->sbufleng; - scf_cmd.rbuf = &scfcmdthrough_p->rbuf[0]; - scf_cmd.rcount = SCF_L_CNT_MAX; - scf_cmd.rbufleng = 0; - scf_cmd.status = 0; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - scfcmdthrough_p->rbufleng = scf_cmd.rbufleng; - scfcmdthrough_p->status = scf_cmd.status; - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret != 0) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_cmdt", 8); - goto END_cmdthrough; - } - if (ddi_copyout((void *)scfcmdthrough_p, (void *)arg, - sizeof (scfcmdthrough_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_cmdt", 8); - ret = EFAULT; - } - break; - - default: - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_cmdt", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - } - -/* - * END_cmdthrough - */ - END_cmdthrough: - - if (scfcmdthrough_p) { - kmem_free((void *)scfcmdthrough_p, - (size_t)(sizeof (scfcmdthrough_t))); - } - SCFDBGMSG1(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -int -scf_debug_test(intptr_t arg, int mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test() " - scf_state_t *statep; - int func_ret = 0; - int ret = 0; - - scf_scfioctest_t *test_p = NULL; - caddr_t data_addr = NULL; - caddr_t msc_dptr = NULL; - uint32_t msc_len; - uint8_t *wk_out_p; - int ii; - int jj; - - target_id_t target_id; - mkey_t mkey; - uint_t func_arg; - uint32_t data_len; - uint32_t num_sg; - mscat_gath_t *sgp = NULL; - mflush_type_t flush_type; - uint32_t op; - - uint32_t key; - uint8_t type; - uint32_t transid; - uint32_t length; - uint16_t offset_low; - uint16_t offset_hight; - int kmem_size = 0; - int kmem_size2 = 0; - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - test_p = kmem_zalloc((size_t)(sizeof (scf_scfioctest_t)), KM_SLEEP); - if (ddi_copyin((void *)arg, (void *)test_p, - sizeof (scf_scfioctest_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_test; - } - - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_comtbl.scf_exec_p != NULL) { - statep = scf_comtbl.scf_exec_p; - } else if (scf_comtbl.scf_path_p != NULL) { - statep = scf_comtbl.scf_path_p; - } else if (scf_comtbl.scf_wait_p != NULL) { - statep = scf_comtbl.scf_wait_p; - } else if (scf_comtbl.scf_err_p != NULL) { - statep = scf_comtbl.scf_err_p; - } - - test_p->scf_debugxscf = scf_comtbl.debugxscf_flag; - - switch (test_p->mode & TEST_MODE_MASK_LOW) { - case TEST_NONE: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_NONE"); - break; - - case TEST_CONF_RESET: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_CONF_RESET"); - - /* Not use info */ - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_OFF; - scf_debug_test_rxbuff_nosum_check_flag = - SCF_DBF_RXBUFF_NOSUM_CHECK_OFF; - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_OFF; - scf_debug_test_cmdr_busy = SCF_DBC_CMDR_BUSY_CLEAR; - scf_debug_test_cmdexr_busy = SCF_DBC_CMDEXR_BUSY_CLEAR; - scf_debug_test_path_check = SCF_DBC_PATH_CHECK_CLEAR; - scf_debug_test_path_check_rtn = SCF_DBC_PATH_CHECK_RTN_CLEAR; - scf_debug_test_offline_check = SCF_DBC_OFFLINE_CHECK_CLEAR; - scf_debug_test_offline_check_rtn = - SCF_DBC_OFFLINE_CHECK_RTN_CLEAR; - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_OFF; - break; - - case TEST_CONF_DEBUG_MSG: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_CONF_DEBUG_MSG"); - - /* - * IN: - * info[0] : trace massege flag - */ - scf_trace_msg_flag = test_p->info[0]; - break; - - case TEST_CONF_CMD_BUSY: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_CONF_CMD_BUSY"); - - /* - * IN: - * info[0] : command busy count - * info[1] : command ex busy count - */ - scf_debug_test_cmdr_busy = test_p->info[0]; - scf_debug_test_cmdexr_busy = test_p->info[1]; - break; - - case TEST_CONF_SCF_PATH: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_CONF_SCF_PATH"); - - /* - * IN: - * info[0] : scf_path_check count - * info[1] : scf_path_check return - * info[2] : scf_offline_check count - * info[3] : scf_offline_check return - */ - scf_debug_test_path_check = test_p->info[0]; - scf_debug_test_path_check_rtn = test_p->info[1]; - scf_debug_test_offline_check = test_p->info[2]; - scf_debug_test_offline_check_rtn = test_p->info[3]; - break; - - case TEST_CONF_DSCP_LOOPBACK: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_CONF_DSCP_LOOPBACK"); - - /* - * IN: - * info[0] : loopback mode - */ - scf_debug_test_dscp_loopback = - (test_p->info[0]) ? - SCF_DBF_DSCP_LOOPBACK_ON : SCF_DBF_DSCP_LOOPBACK_OFF; - break; - - case TEST_INT_SYS: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_INT_SYS"); - - /* - * IN: - * info[0] : STR/ISR register - * info[1] : STExR register - * info[2] : receive data size - * info[3] : RxDR register 0 - * info[4] : RxDR register 1 - * info[5] : RxDR register 2 - * info[6] : RxDR register 3 - */ - if (scf_debug_scfint_time != 0) { - if (scf_debug_test_sys_int_flag == - SCF_DBF_SYS_INTR_OFF) { - if (statep != NULL) { - scf_debug_test_sys_int_flag = - SCF_DBF_SYS_INTR_ON; - - scf_debug_test_sys_int_tbl.STATUS = - (uint16_t) - (test_p->info[0] >> 16); - scf_debug_test_sys_int_tbl.INT_ST |= - (uint16_t)test_p->info[0]; - scf_debug_test_sys_int_tbl.STATUS_ExR = - test_p->info[1]; - scf_debug_test_sys_int_tbl.rxsize = - test_p->info[2]; - scf_debug_test_sys_int_tbl.RDATA0 = - test_p->info[3]; - scf_debug_test_sys_int_tbl.RDATA1 = - test_p->info[4]; - scf_debug_test_sys_int_tbl.RDATA2 = - test_p->info[5]; - scf_debug_test_sys_int_tbl.RDATA3 = - test_p->info[6]; - - if (scf_debug_test_intr_id == 0) { - scf_debug_test_intr_id = - timeout((void (*)())scf_debug_test_intr_tout, - (void *)statep, - drv_usectohz(SCF_MIL2MICRO(scf_debug_scfint_time))); - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EIO; - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EBUSY; - } - } - break; - - case TEST_INT_SYS_POFF: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_INT_SYS_POFF"); - - /* - * IN: - * info[0] : POFF factor - */ - if (scf_debug_test_sys_poff_flag == SCF_DBF_SYS_POFF_OFF) { - if (statep != NULL) { - scf_debug_test_sys_poff_flag = - SCF_DBF_SYS_POFF_ON; - - scf_debug_test_sys_int_tbl.POFF_FACTOR = - test_p->info[0]; - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EIO; - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_test", 8); - ret = EBUSY; - } - break; - - case TEST_INT_SYS_EVENT: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_INT_SYS_EVENT"); - - /* - * IN: - * info[0] - info[7] : Event 0 - * info[8] - info[15] : Event 1 - * info[16] - info[23] : Event 2 - * info[24] - info[31] : Event 3 - */ - if (scf_debug_test_sys_event_flag == FLAG_OFF) { - if (statep != NULL) { - scf_debug_test_sys_event_flag = - SCF_DBF_SYS_EVENT_ON; - - for (ii = 0; ii < TEST_INFO_MAX; ii++) { - scf_debug_test_sys_int_tbl.EVENT[ii] = - test_p->info[ii]; - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EIO; - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_test", 8); - ret = EBUSY; - } - break; - - case TEST_INT_DSCP: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_INT_DSCP"); - - /* - * IN: - * info[0] : DSR/ISR register - * info[1] : TxDSR_C_FLAG/TxDSR_OFFSET register - * info[2] : RxDCR_C_FLAG/RxDCR_OFFSET register - * info[3] : RxDCR_LENGTH register - */ - if (scf_debug_idbcint_time != 0) { - if (scf_debug_test_dscp_int_flag == - SCF_DBF_DSCP_INT_OFF) { - if (statep != NULL) { - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_ON; - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_ON; - - scf_debug_test_dscp_int_tbl.DSR = (uint8_t)(test_p->info[0] >> 16); - scf_debug_test_sys_int_tbl.INT_ST |= (uint16_t)test_p->info[0]; - scf_debug_test_dscp_int_tbl.TxDSR_C_FLAG = - (uint16_t)(test_p->info[1] >> 16); - scf_debug_test_dscp_int_tbl.TxDSR_OFFSET = - (uint16_t)test_p->info[1]; - scf_debug_test_dscp_int_tbl.RxDCR_C_FLAG = - (uint16_t)(test_p->info[2] >> 16); - - offset_low = SCF_TXBUFFSIZE * SCF_TX_SRAM_MAXCOUNT / DSC_OFFSET_CONVERT; - offset_hight = offset_low + - SCF_RXBUFFSIZE * SCF_RX_SRAM_MAXCOUNT / DSC_OFFSET_CONVERT; - if ((test_p->info[2] >= offset_low) && - (test_p->info[2] < offset_hight)) { - scf_debug_test_dscp_int_tbl.RxDCR_OFFSET = - (uint16_t)test_p->info[2]; - } else { - scf_debug_test_dscp_int_tbl.RxDCR_OFFSET = offset_low; - } - scf_debug_test_dscp_int_tbl.RxDCR_LENGTH = test_p->info[3]; - - if ((scf_debug_test_dscp_int_tbl.RxDCR_OFFSET >= offset_low) && - (scf_debug_test_dscp_int_tbl.RxDCR_LENGTH != 0)) { - /* Data copy to SRAM */ - ii = scf_debug_test_dscp_int_tbl.RxDCR_OFFSET * - DSC_OFFSET_CONVERT; - wk_out_p = - (uint8_t *)&statep->scf_dscp_sram->DATA[ii]; - for (ii = 0; ii < scf_debug_test_dscp_int_tbl.RxDCR_LENGTH; - ii++, wk_out_p++) { - SCF_DDI_PUT8(statep, statep->scf_dscp_sram_handle, - wk_out_p, (uint8_t)ii); - } - } - - if (scf_debug_test_intr_id == 0) { - scf_debug_test_intr_id = - timeout((void (*)())scf_debug_test_intr_tout, - (void *)statep, - drv_usectohz(SCF_MIL2MICRO(scf_debug_idbcint_time))); - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EIO; - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EBUSY; - } - } - break; - - case TEST_SYS_CALL_INT: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_SYS_CALL_INT"); - - /* Not use info */ - if (scf_debug_scfint_time != 0) { - if (statep != NULL) { - if (scf_debug_test_intr_id == 0) { - scf_debug_test_intr_id = - timeout((void (*)())scf_debug_test_intr_tout, - (void *)statep, - drv_usectohz(SCF_MIL2MICRO(scf_debug_scfint_time))); - } - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, - "dbg_test", 8); - ret = EIO; - } - } - break; - - case TEST_DSCP_CALL_RESET: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_RESET"); - - /* Not use info */ - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - break; - - - case TEST_DSCP_CALL_INIT: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_INIT"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - - /* - * scf_mb_init(target_id_t target_id, mkey_t mkey, - * void (*event_handler) (scf_event_t mevent, void *arg), - * void *arg); - */ - - func_arg = 0x01020304; - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_mb_init(target_id, mkey, NULL, - (void *)&func_arg); - } else { - func_ret = scf_mb_init(target_id, mkey, - scf_debug_test_event_handler, - (void *)&func_arg); - } - mutex_enter(&scf_comtbl.all_mutex); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - break; - - case TEST_DSCP_CALL_FINI: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_FINI"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - - /* scf_mb_fini(target_id_t target_id, mkey_t mkey); */ - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_mb_fini(target_id, mkey); - mutex_enter(&scf_comtbl.all_mutex); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - break; - - case TEST_DSCP_CALL_PUTMSG: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_PUTMSG"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - * info[2] : data_len - * info[3] : num_sg - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - data_len = (uint32_t)test_p->info[2]; - num_sg = (uint32_t)test_p->info[3]; - - /* - * scf_mb_putmsg(target_id_t target_id, mkey_t mkey, - * uint32_t data_len, uint32_t num_sg, mscat_gath_t *sgp, - * clock_t timeout); - */ - - - if (data_len != 0) { - kmem_size = data_len; - data_addr = (caddr_t)kmem_zalloc(kmem_size, KM_SLEEP); - } - if (num_sg != 0) { - kmem_size2 = sizeof (mscat_gath_t) * num_sg; - sgp = (mscat_gath_t *)kmem_zalloc(kmem_size2, KM_SLEEP); - } - - msc_dptr = data_addr; - msc_len = data_len; - for (ii = 0; ii < num_sg; ii++) { - if (msc_len != 0) { - sgp[ii].msc_dptr = msc_dptr; - if ((msc_len < 0x00000010) || - (ii == (num_sg - 1))) { - sgp[ii].msc_len = msc_len; - } else { - sgp[ii].msc_len = 0x00000010; - } - msc_len -= sgp[ii].msc_len; - for (jj = 0; jj < sgp[ii].msc_len; jj++, - msc_dptr++) { - *msc_dptr = jj; - } - } else { - sgp[ii].msc_dptr = NULL; - sgp[ii].msc_len = 0; - } - } - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_mb_putmsg(target_id, mkey, data_len, - num_sg, NULL, 0); - } else if (test_p->data[0] == 2) { - sgp->msc_len = 0x00000010; - sgp->msc_dptr = NULL; - func_ret = scf_mb_putmsg(target_id, mkey, data_len, - num_sg, sgp, 0); - } else if (test_p->data[0] == 3) { - sgp->msc_len += 1; - func_ret = scf_mb_putmsg(target_id, mkey, data_len, - num_sg, sgp, 0); - } else { - func_ret = scf_mb_putmsg(target_id, mkey, data_len, - num_sg, sgp, 0); - } - mutex_enter(&scf_comtbl.all_mutex); - - if (data_len != 0) - bcopy((void *)data_addr, (void *)&test_p->rdata[0], - data_len); - - if (data_addr != NULL) kmem_free(data_addr, kmem_size); - if (sgp != NULL) kmem_free(sgp, kmem_size2); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - break; - - case TEST_DSCP_CALL_CANGET: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_CANGET"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - * OUT: - * info[2] : data_len - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - data_len = 0xffffffff; - - /* - * scf_mb_canget(target_id_t target_id, mkey_t mkey, - * uint32_t *data_lenp); - */ - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_mb_canget(target_id, mkey, NULL); - } else { - func_ret = scf_mb_canget(target_id, mkey, - (uint32_t *)&data_len); - } - mutex_enter(&scf_comtbl.all_mutex); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - - test_p->info[2] = (uint_t)data_len; - - break; - - case TEST_DSCP_CALL_GETMSG: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_GETMSG"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - * info[2] : data_len - * info[3] : num_sg - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - data_len = (uint32_t)test_p->info[2]; - num_sg = (uint32_t)test_p->info[3]; - - /* - * scf_mb_getmsg(target_id_t target_id, mkey_t mkey, - * uint32_t data_len, uint32_t num_sg, mscat_gath_t *sgp, - * clock_t timeout); - */ - - if (data_len != 0) { - kmem_size = data_len; - data_addr = (caddr_t)kmem_zalloc(kmem_size, KM_SLEEP); - } - if (num_sg != 0) { - kmem_size2 = sizeof (mscat_gath_t) * num_sg; - sgp = (mscat_gath_t *)kmem_zalloc(kmem_size2, KM_SLEEP); - } - - msc_dptr = data_addr; - msc_len = data_len; - for (ii = 0; ii < num_sg; ii++) { - if (msc_len != 0) { - sgp[ii].msc_dptr = msc_dptr; - if ((msc_len < 0x00000010) || - (ii == (num_sg - 1))) { - sgp[ii].msc_len = msc_len; - } else { - sgp[ii].msc_len = 0x00000010; - } - msc_len -= sgp[ii].msc_len; - for (jj = 0; jj < sgp[ii].msc_len; jj++, - msc_dptr++) { - *msc_dptr = jj; - } - } else { - sgp[ii].msc_dptr = NULL; - sgp[ii].msc_len = 0; - } - } - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_mb_getmsg(target_id, mkey, data_len, - num_sg, NULL, 0); - } else if (test_p->data[0] == 2) { - sgp->msc_len = 0x00000010; - sgp->msc_dptr = NULL; - func_ret = scf_mb_getmsg(target_id, mkey, data_len, - num_sg, sgp, 0); - } else if (test_p->data[0] == 3) { - sgp->msc_len += 1; - func_ret = scf_mb_getmsg(target_id, mkey, data_len, - num_sg, sgp, 0); - } else { - func_ret = scf_mb_getmsg(target_id, mkey, data_len, - num_sg, sgp, 0); - } - mutex_enter(&scf_comtbl.all_mutex); - - if (data_len != 0) - bcopy((void *)data_addr, (void *)&test_p->rdata[0], - data_len); - - if (data_addr != NULL) kmem_free(data_addr, kmem_size); - if (sgp != NULL) kmem_free(sgp, kmem_size2); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - break; - - case TEST_DSCP_CALL_FLUSH: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_FLUSH"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - * info[2] : flush_type - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - flush_type = (mflush_type_t)test_p->info[2]; - - /* - * scf_mb_flush(target_id_t target_id, mkey_t mkey, - * mflush_type_t flush_type); - */ - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_mb_flush(target_id, mkey, flush_type); - mutex_enter(&scf_comtbl.all_mutex); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - break; - - case TEST_DSCP_CALL_CTRL: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_CTRL"); - - /* - * IN: - * info[0] : target_id - * info[1] : mkey - * info[2] : op - * OUT: - * info[3] : arg - */ - target_id = (target_id_t)test_p->info[0]; - mkey = (mkey_t)test_p->info[1]; - op = test_p->info[2]; - - /* - * scf_mb_ctrl(target_id_t target_id, mkey_t mkey, - * uint32_t op, void *arg); - */ - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_mb_ctrl(target_id, mkey, op, NULL); - } else { - func_ret = scf_mb_ctrl(target_id, mkey, op, - (void *)&func_arg); - } - mutex_enter(&scf_comtbl.all_mutex); - - scf_debug_test_dscp_call_flag = SCF_DBF_DSCP_CALL_OFF; - - test_p->info[3] = (uint_t)func_arg; - - break; - - case TEST_DSCP_CALL_OTHER: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_DSCP_CALL_OTHER"); - - /* - * IN: - * info[0] : function code - * info[1] : factor - * OUT: - * info[3] : return code - */ - switch (test_p->info[0]) { - case 0x00000001: - test_p->info[3] = scf_dscp_init(); - break; - - case 0x00000002: - scf_dscp_fini(); - break; - - case 0x00000003: - scf_dscp_start(test_p->info[1]); - break; - - case 0x00000004: - scf_dscp_stop(test_p->info[1]); - break; - - case 0x00000101: - if (test_p->info[1] == 0xffffffff) { - for (ii = 0; ii < SCF_TIMERCD_MAX; ii++) { - scf_timer_start(ii); - } - } else { - scf_timer_start(test_p->info[1]); - } - break; - - case 0x00000102: - if (test_p->info[1] == 0xffffffff) { - scf_timer_all_stop(); - } else { - scf_timer_stop(test_p->info[1]); - } - break; - - case 0x00000103: - func_ret = scf_timer_check(test_p->info[1]); - break; - - case 0x00000104: - func_ret = scf_timer_value_get(test_p->info[1]); - break; - - case 0x00000200: - if (statep != NULL) { - SCF_SRAM_TRACE(statep, DTC_ONLINETO); - SCF_SRAM_TRACE(statep, DTC_ONLINE); - SCF_SRAM_TRACE(statep, DTC_OFFLINE); - - SCF_SRAM_TRACE(statep, DTC_SENDDATA); - - SCF_SRAM_TRACE(statep, DTC_RECVDATA); - - SCF_SRAM_TRACE(statep, DTC_ERRRTN); - SCF_SRAM_TRACE(statep, DTC_RCI_BUF_FUL); - SCF_SRAM_TRACE(statep, DTC_RCI_BUSY); - SCF_SRAM_TRACE(statep, DTC_INTERFACE); - SCF_SRAM_TRACE(statep, DTC_E_NOT_SUPPORT); - SCF_SRAM_TRACE(statep, DTC_E_PARAM); - SCF_SRAM_TRACE(statep, DTC_E_SCFC_PATH); - SCF_SRAM_TRACE(statep, DTC_E_RCI_ACCESS); - SCF_SRAM_TRACE(statep, DTC_E_SEQUENCE); - - SCF_SRAM_TRACE(statep, DTC_RSUMERR); - - SCF_SRAM_TRACE(statep, DTC_DSCP_TXREQ); - - SCF_SRAM_TRACE(statep, DTC_DSCP_RXACK); - - SCF_SRAM_TRACE(statep, DTC_DSCP_RXEND); - - SCF_SRAM_TRACE(statep, DTC_DSCP_RXREQ); - - SCF_SRAM_TRACE(statep, DTC_DSCP_TXACK); - SCF_SRAM_TRACE(statep, DTC_DSCP_ACKTO); - SCF_SRAM_TRACE(statep, DTC_DSCP_ENDTO); - - SCF_SRAM_TRACE(statep, DTC_DSCP_TXEND); - - SCF_SRAM_TRACE(statep, DTC_SENDDATA_SRAM); - SCF_SRAM_TRACE(statep, DTC_RECVDATA_SRAM); - SCF_SRAM_TRACE(statep, DTC_DSCP_SENDDATA); - SCF_SRAM_TRACE(statep, DTC_DSCP_RECVDATA); - - SCF_SRAM_TRACE(statep, DTC_CMD); - SCF_SRAM_TRACE(statep, DTC_INT); - SCF_SRAM_TRACE(statep, DTC_CMDTO); - SCF_SRAM_TRACE(statep, DTC_CMDBUSYTO); - SCF_SRAM_TRACE(statep, 0x99); - } - break; - - case 0x00010000: - case 0x00010098: - if (statep != NULL) { - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_detach(statep->dip, DDI_SUSPEND); - func_ret = - scf_detach(scf_comtbl.scf_pseudo_p->dip, - DDI_SUSPEND); - if (test_p->info[0] == 0x00010098) { - scf_panic_callb(1); - mutex_enter(&scf_comtbl.all_mutex); - break; - } - - drv_usecwait(5000000); - - func_ret = - scf_attach(scf_comtbl.scf_pseudo_p->dip, - DDI_RESUME); - func_ret = scf_attach(statep->dip, DDI_RESUME); - mutex_enter(&scf_comtbl.all_mutex); - } - break; - - case 0x00019990: - case 0x00019991: - mutex_exit(&scf_comtbl.all_mutex); - mutex_enter(&scf_comtbl.si_mutex); - if (test_p->info[0] & 0x00000001) { - scf_comtbl.scf_softintr_dscp_kicked = FLAG_ON; - } else { - scf_comtbl.scf_softintr_dscp_kicked = FLAG_OFF; - } - mutex_exit(&scf_comtbl.si_mutex); - scf_softintr(NULL); - mutex_enter(&scf_comtbl.all_mutex); - break; - - case 0x00019998: - mutex_exit(&scf_comtbl.all_mutex); - scf_panic_callb(1); - mutex_enter(&scf_comtbl.all_mutex); - break; - - case 0x00019999: - mutex_exit(&scf_comtbl.all_mutex); - scf_shutdown_callb(1); - mutex_enter(&scf_comtbl.all_mutex); - break; - - case 0x00020000: - func_ret = scf_offline_check(statep, FLAG_OFF); - func_ret = scf_offline_check(statep, FLAG_ON); - func_ret = scf_cmdbusy_check(statep); - break; - - default: - break; - } - break; - - case TEST_OSESCF_CALL_RESET: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_OSESCF_CALL_RESET"); - - /* Not use info */ - scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_OFF; - break; - - case TEST_OSESCF_CALL_PUTINFO: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_OSESCF_CALL_PUTINFO"); - - /* - * IN: - * info[0] : key - * info[1] : type - * info[2] : transid - * info[3] : length - */ - key = (uint32_t)test_p->info[0]; - type = (uint8_t)test_p->info[1]; - transid = (uint32_t)test_p->info[2]; - length = (uint32_t)test_p->info[3]; - - /* - * scf_service_putinfo(uint32_t key, uint8_t type, - * uint32_t transid, uint32_t length, void *datap); - */ - - if (length != 0) { - kmem_size = length; - data_addr = (caddr_t)kmem_zalloc(kmem_size, KM_SLEEP); - } - - msc_dptr = data_addr; - for (ii = 0; ii < length; ii++, msc_dptr++) { - *msc_dptr = ii; - } - - scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_service_putinfo(key, type, transid, - length, NULL); - } else { - func_ret = scf_service_putinfo(key, type, transid, - length, (void *)data_addr); - } - mutex_enter(&scf_comtbl.all_mutex); - - if (length != 0) - bcopy((void *)data_addr, (void *)&test_p->rdata[0], - length); - - if (data_addr != NULL) kmem_free(data_addr, kmem_size); - - scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_OFF; - - break; - - case TEST_OSESCF_CALL_GETINFO: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_OSESCF_CALL_GETINFO"); - - /* - * IN: - * info[0] : key - * info[1] : type - * info[2] : transid - * info[3] : length - * OUT: - * info[3] : length - */ - key = (uint32_t)test_p->info[0]; - type = (uint8_t)test_p->info[1]; - transid = (uint32_t)test_p->info[2]; - length = (uint32_t)test_p->info[3]; - - /* - * scf_service_getinfo(uint32_t key, uint8_t type, - * uint32_t transid, uint32_t *lengthp, void *datap); - */ - if (length != 0) { - kmem_size = length; - data_addr = (caddr_t)kmem_zalloc(kmem_size, KM_SLEEP); - } - - msc_dptr = data_addr; - for (ii = 0; ii < length; ii++, msc_dptr++) { - *msc_dptr = 0x7f; - } - - scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_ON; - - mutex_exit(&scf_comtbl.all_mutex); - if (test_p->data[0] == 1) { - func_ret = scf_service_getinfo(key, type, transid, - (uint32_t *)&length, NULL); - } else if (test_p->data[0] == 2) { - func_ret = scf_service_getinfo(key, type, transid, - NULL, (void *)data_addr); - } else { - func_ret = scf_service_getinfo(key, type, transid, - (uint32_t *)&length, (void *)data_addr); - } - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_debug_nofirm_sys == SCF_DBF_NOFIRM_SYS_ON) { - length = kmem_size; - msc_dptr = data_addr; - for (ii = 0; ii < length; ii++, msc_dptr++) { - *msc_dptr = ii; - } - } - if (length != 0) - bcopy((void *)data_addr, (void *)&test_p->rdata[0], - length); - - if (data_addr != NULL) kmem_free(data_addr, kmem_size); - - scf_debug_test_osescf_call_flag = SCF_DBF_OSESCF_CALL_OFF; - - test_p->info[3] = (uint_t)length; - break; - - case TEST_FMEM_START: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_FMEM_START"); - - /* - * IN: - * info[0] : lsb_1 - * info[1] : lsb_2 - */ - - /* - * scf_fmem_start(int s_bd, int t_bd); - */ - - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_fmem_start(test_p->info[0], test_p->info[1]); - mutex_enter(&scf_comtbl.all_mutex); - break; - - case TEST_FMEM_END: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_FMEM_END"); - - /* - * scf_fmem_end(void); - */ - - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_fmem_end(); - mutex_enter(&scf_comtbl.all_mutex); - - break; - - case TEST_FMEM_CANCEL: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_FMEM_CANCEL"); - - /* - * scf_fmem_cancel(void); - */ - - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_fmem_cancel(); - mutex_enter(&scf_comtbl.all_mutex); - - break; - - case TEST_GET_DIMMINFO: - SCFDBGMSG(SCF_DBGFLAG_DBG, "TEST_GET_DIMMINFO"); - - /* - * IN: - * info[0] : boardnum - * info[1] : bufsz - * OUT: - * info[1] : bufsz - */ - length = (uint32_t)test_p->info[1]; - - /* - * scf_get_dimminfo(uint32_t boardnum, void *buf, - * uint32_t *bufsz); - */ - - if (length != 0) { - kmem_size = length; - data_addr = (caddr_t)kmem_zalloc(kmem_size, KM_SLEEP); - } - - mutex_exit(&scf_comtbl.all_mutex); - func_ret = scf_get_dimminfo(test_p->info[0], data_addr, - &length); - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_debug_nofirm_sys == SCF_DBF_NOFIRM_SYS_ON) { - length = kmem_size; - msc_dptr = data_addr; - for (ii = 0; ii < length; ii++, msc_dptr++) { - *msc_dptr = ii; - } - } - if (length != 0) - bcopy((void *)data_addr, (void *)&test_p->rdata[0], - length); - - if (data_addr != NULL) kmem_free(data_addr, kmem_size); - - test_p->info[1] = (uint_t)length; - - break; - - default: - SCFDBGMSG(SCF_DBGFLAG_DBG, "Undefine mod"); - - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "dbg_test", 8); - ret = EINVAL; - break; - } - - test_p->rtncode = func_ret; - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - if (ret == 0) { - if (ddi_copyout((void *)test_p, (void *)arg, - sizeof (scf_scfioctest_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_test - */ - END_test: - - if (test_p) { - kmem_free((void *)test_p, - (size_t)(sizeof (scf_scfioctest_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -void -scf_debug_test_intr_tout(void *arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr_tout() " - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_debug_test_intr_id != 0) { - scf_debug_test_intr_id = 0; - - mutex_exit(&scf_comtbl.all_mutex); - - scf_intr(arg); - } else { - mutex_exit(&scf_comtbl.all_mutex); - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_intr(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - statep->reg_int_st = scf_debug_test_sys_int_tbl.INT_ST; - - if (SCF_DBG_CHECK_NODEVICE) { - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, statep->reg_int_st); - } - - SCFDBGMSG1(SCF_DBGFLAG_DBG, "set ISR = 0x%04x", statep->reg_int_st); - - scf_debug_test_sys_int_tbl.INT_ST = 0; - - if ((statep->reg_int_st & INT_ST_IDBCINT) == 0) { - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_OFF; - } - if ((statep->reg_int_st & INT_ST_SCFINT) == 0) { - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_OFF; - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_intr_scfint(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr_scfint() " - uint16_t wk_STATUS; - uint32_t wk_STATUS_ExR; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - if ((scf_debug_test_sys_int_tbl.STATUS & STATUS_MODE_CHANGED) == 0) { - wk_STATUS = - statep->reg_status & - (STATUS_SECURE_MODE | STATUS_BOOT_MODE); - scf_debug_test_sys_int_tbl.STATUS &= - ~(STATUS_SECURE_MODE | STATUS_BOOT_MODE); - scf_debug_test_sys_int_tbl.STATUS |= wk_STATUS; - } - statep->reg_status = scf_debug_test_sys_int_tbl.STATUS; - - if (SCF_DBG_CHECK_NODEVICE) { - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS, statep->reg_status); - } - - SCFDBGMSG1(SCF_DBGFLAG_DBG, "set STR = 0x%04x", statep->reg_status); - - scf_debug_test_sys_int_tbl.STATUS = 0; - - if ((scf_debug_test_sys_int_tbl.STATUS_ExR & - STATUS_SCF_STATUS_CHANGE) == 0) { - wk_STATUS_ExR = statep->reg_status_exr & - (STATUS_SCF_STATUS | STATUS_SCF_NO); - scf_debug_test_sys_int_tbl.STATUS_ExR &= - ~(STATUS_SCF_STATUS | STATUS_SCF_NO); - scf_debug_test_sys_int_tbl.STATUS_ExR |= wk_STATUS_ExR; - } - statep->reg_status_exr = scf_debug_test_sys_int_tbl.STATUS_ExR; - - if (SCF_DBG_CHECK_NODEVICE) { - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, statep->reg_status_exr); - } - - SCFDBGMSG1(SCF_DBGFLAG_DBG, "set STExR = 0x%08x", - statep->reg_status_exr); - - scf_debug_test_sys_int_tbl.STATUS_ExR = 0; - - if ((statep->reg_status & STATUS_CMD_COMPLETE) == 0) { - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_OFF; - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_intr_cmdend(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr_cmdend() " - uint_t ii; - uint8_t *wk_charp; - uint8_t sum = SCF_MAGICNUMBER_S; - uint32_t sum4 = SCF_MAGICNUMBER_L; - uint32_t wk_data; - uint8_t *wk_out_p; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - if (scf_debug_test_sys_int_tbl.rxsize < SCF_S_CNT_16) { - if ((scf_debug_rdata[0] == 0) && - (scf_debug_rdata[1] == 0) && - (scf_debug_rdata[2] == 0) && - (scf_debug_rdata[3] == 0)) { - statep->reg_rdata[0] = - scf_debug_test_sys_int_tbl.RDATA0; - statep->reg_rdata[1] = - scf_debug_test_sys_int_tbl.RDATA1; - statep->reg_rdata[2] = - scf_debug_test_sys_int_tbl.RDATA2; - statep->reg_rdata[3] = - scf_debug_test_sys_int_tbl.RDATA3; - } else { - statep->reg_rdata[0] = scf_debug_rdata[0]; - statep->reg_rdata[1] = scf_debug_rdata[1]; - statep->reg_rdata[2] = scf_debug_rdata[2]; - statep->reg_rdata[3] = scf_debug_rdata[3]; - } - } else { - statep->reg_rdata[0] = scf_debug_test_sys_int_tbl.rxsize; - statep->reg_rdata[1] = 0; - if (scf_debug_test_sys_int_tbl.RDATA2 != 0) { - statep->reg_rdata[2] = - scf_debug_test_sys_int_tbl.RDATA2; - scf_debug_test_rxbuff_nosum_check_flag = - SCF_DBF_RXBUFF_NOSUM_CHECK_OFF; - } else { - statep->reg_rdata[2] = 0; - scf_debug_test_rxbuff_nosum_check_flag = - SCF_DBF_RXBUFF_NOSUM_CHECK_ON; - } - statep->reg_rdata[3] = scf_debug_test_sys_int_tbl.RDATA3; - - if ((scf_comtbl.scf_exec_cmd_id == 0) && - (scf_comtbl.scf_cmd_intr.cmd == CMD_INT_REASON)) { - wk_out_p = (uint8_t *)&statep->scf_sys_sram->DATA[0]; - for (ii = 0; ii < scf_debug_test_sys_int_tbl.rxsize; - ii++, wk_out_p++) { - SCF_DDI_PUT8(statep, - statep->scf_sys_sram_handle, wk_out_p, - 0x00); - } - } else { - wk_data = 0x00010203; - wk_out_p = (uint8_t *)&statep->scf_sys_sram->DATA[0]; - for (ii = 0; ii < scf_debug_test_sys_int_tbl.rxsize; - ii++, wk_out_p++) { - SCF_DDI_PUT8(statep, - statep->scf_sys_sram_handle, wk_out_p, - ii); - if ((ii % 4) == 0) { - wk_data = (ii & 0x000000ff) << 24; - } else if ((ii % 4) == 1) { - wk_data |= (ii & 0x000000ff) << 16; - } else if ((ii % 4) == 2) { - wk_data |= (ii & 0x000000ff) << 8; - } else { - wk_data |= (ii & 0x000000ff); - sum4 += wk_data; - } - } - } - - if (scf_no_make_sum_l == SCF_DBF_NO_MAKE_SUM_L_OFF) { - statep->reg_rdata[2] = sum4; - } - } - - wk_charp = (uint8_t *)&statep->reg_rdata[0]; - for (ii = 0; ii < SCF_S_CNT_15; ii++, wk_charp++) { - sum += (*wk_charp); - } - - if (scf_no_make_sum_s == SCF_DBF_NO_MAKE_SUM_S_OFF) { - *wk_charp = sum; - } - - SCFDBGMSG4(SCF_DBGFLAG_DBG, "set RxDR = 0x%08x 0x%08x 0x%08x 0x%08x", - statep->reg_rdata[0], statep->reg_rdata[1], - statep->reg_rdata[2], statep->reg_rdata[3]); - - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_OFF; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_intr_poff(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr_poff() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - scf_comtbl.scf_poff_id = scf_debug_test_sys_int_tbl.POFF_FACTOR; - - SCFDBGMSG1(SCF_DBGFLAG_DBG, "set POFF factor = 0x%02x", - scf_comtbl.scf_poff_id); - - scf_debug_test_sys_poff_flag = SCF_DBF_SYS_POFF_OFF; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - -void -scf_debug_test_dsens(struct scf_cmd *scfcmdp, scf_int_reason_t *int_rp, int len) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_dsens() " - int wk_len = len; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - if (wk_len == 0) { - wk_len = SCF_INT_CNT_MAX; - scfcmdp->rbufleng = wk_len; - } - - wk_in_p = (uint8_t *)&scf_debug_test_sys_int_tbl.EVENT[0]; - wk_out_p = (uint8_t *)int_rp; - bcopy((void *)wk_in_p, (void *)wk_out_p, wk_len); - - scf_debug_test_sys_event_flag = SCF_DBF_SYS_EVENT_OFF; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_intr_dscp_dsr(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr_dscp_dsr() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - statep->reg_dsr = scf_debug_test_dscp_int_tbl.DSR; - - if (SCF_DBG_CHECK_NODEVICE) { - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR, statep->reg_dsr); - } - - SCFDBGMSG1(SCF_DBGFLAG_DBG, "set DSR = 0x%02x", statep->reg_dsr); - - scf_debug_test_dscp_int_tbl.DSR = 0; - - if ((statep->reg_dsr & (DSR_RxREQ | DSR_TxACK | DSR_TxEND)) == 0) { - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_OFF; - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_intr_dscp_rxtx(scf_state_t *statep, uint8_t dsr) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_intr_dscp_rxtx() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - if (dsr & DSR_RxREQ) { - statep->reg_rxdcr_c_flag = - (scf_debug_test_dscp_int_tbl.RxDCR_C_FLAG | - DSC_FLAG_DEFAULT); - statep->reg_rxdcr_c_length = - scf_debug_test_dscp_int_tbl.RxDCR_LENGTH; - if (scf_debug_test_dscp_int_tbl.RxDCR_LENGTH != 0) { - if (scf_debug_test_dscp_int_tbl.RxDCR_OFFSET != - DSC_OFFSET_NOTHING) { - statep->reg_rxdcr_c_offset = - scf_debug_test_dscp_int_tbl.RxDCR_OFFSET; - } else { - statep->reg_rxdcr_c_offset = - (SCF_TX_SRAM_MAXCOUNT * SCF_RXBUFFSIZE / - DSC_OFFSET_CONVERT); - } - } else { - statep->reg_rxdcr_c_offset = DSC_OFFSET_NOTHING; - } - - SCFDBGMSG3(SCF_DBGFLAG_DBG, - "set RxDCR = 0x%04x 0x%04x 0x%08x", - statep->reg_rxdcr_c_flag, - statep->reg_rxdcr_c_offset, - statep->reg_rxdcr_c_length); - - if ((dsr & DSR_TxEND) == 0) { - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_OFF; - } - - } else if (dsr == DSR_TxEND) { - statep->reg_txdsr_c_flag = - (statep->reg_txdcr_c_flag & 0xff00) | - scf_debug_test_dscp_int_tbl.TxDSR_C_FLAG; - if (scf_debug_test_dscp_int_tbl.TxDSR_OFFSET == 0) { - statep->reg_txdsr_c_offset = statep->reg_txdcr_c_offset; - } else { - statep->reg_txdsr_c_offset = - scf_debug_test_dscp_int_tbl.TxDSR_OFFSET; - } - - SCFDBGMSG2(SCF_DBGFLAG_DBG, "set TxDSR = 0x%04x 0x%04x", - statep->reg_rxdcr_c_flag, - statep->reg_rxdcr_c_offset); - - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_OFF; - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_alive_start(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_alive_start() " - uint8_t wk_int8; - uint_t alive_timer; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - wk_int8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR); - - switch (wk_int8 & ATR_INTERVAL) { - case ATR_INTERVAL_30S: - alive_timer = 30000; - break; - - case ATR_INTERVAL_60S: - alive_timer = 60000; - break; - - case ATR_INTERVAL_120S: - alive_timer = 120000; - break; - - default: - alive_timer = 0; - break; - } - if ((alive_timer != 0) && (scf_debug_test_alive_id == 0)) { - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_ON; - scf_debug_test_sys_int_tbl.INT_ST |= INT_ST_ALIVEINT; - scf_debug_test_alive_id = - timeout((void (*)())scf_debug_test_alive_intr_tout, - (void *)statep, - drv_usectohz(SCF_MIL2MICRO(alive_timer))); - scf_debug_test_alive_flag = FLAG_ON; - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -/* ARGSUSED */ -void -scf_debug_test_alive_stop(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_alive_stop() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - scf_debug_test_alive_flag = FLAG_OFF; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_alive_intr_tout(void *arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_alive_intr_tout() " - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - mutex_enter(&scf_comtbl.all_mutex); - - scf_debug_test_alive_id = 0; - - if (scf_debug_test_alive_flag == FLAG_ON) { - scf_debug_test_alive_start(arg); - - mutex_exit(&scf_comtbl.all_mutex); - - scf_intr(arg); - } else { - mutex_exit(&scf_comtbl.all_mutex); - } - - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_send_cmd(scf_state_t *statep, struct scf_cmd *scfcmdp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_send_cmd() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - if (scf_debug_scfint_time != 0) { - scf_debug_test_sys_int_flag = SCF_DBF_SYS_INTR_ON; - scf_debug_test_sys_int_tbl.INT_ST |= INT_ST_SCFINT; - - scf_debug_test_sys_int_tbl.STATUS = STATUS_CMD_COMPLETE; - scf_debug_test_sys_int_tbl.STATUS_ExR = 0; - - switch (scfcmdp->flag) { - case SCF_USE_SSBUF: - case SCF_USE_LSBUF: - scf_debug_test_sys_int_tbl.rxsize = scfcmdp->rcount; - scf_debug_test_sys_int_tbl.RDATA0 = 0x00010203; - scf_debug_test_sys_int_tbl.RDATA1 = 0x04050607; - scf_debug_test_sys_int_tbl.RDATA2 = 0x08090a0b; - scf_debug_test_sys_int_tbl.RDATA3 = 0x0c0d0e0f; - break; - - case SCF_USE_SLBUF: - scf_debug_test_sys_int_tbl.rxsize = scfcmdp->rcount; - scf_debug_test_sys_int_tbl.RDATA0 = scfcmdp->rcount; - scf_debug_test_sys_int_tbl.RDATA1 = 0; - scf_debug_test_sys_int_tbl.RDATA2 = 0; - scf_debug_test_sys_int_tbl.RDATA3 = 0; - break; - - default: - scf_debug_test_sys_int_tbl.rxsize = 0; - scf_debug_test_sys_int_tbl.RDATA0 = 0; - scf_debug_test_sys_int_tbl.RDATA1 = 0; - scf_debug_test_sys_int_tbl.RDATA2 = 0; - scf_debug_test_sys_int_tbl.RDATA3 = 0; - break; - } - - if (scf_debug_test_intr_id == 0) { - scf_debug_test_intr_id = - timeout((void (*)())scf_debug_test_intr_tout, - (void *)statep, - drv_usectohz(SCF_MIL2MICRO(scf_debug_scfint_time))); - } - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_txreq_send(scf_state_t *statep, scf_dscp_dsc_t *dsc_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_txreq_send() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - if (scf_debug_idbcint_time != 0) { - scf_debug_test_dscp_int_flag = SCF_DBF_DSCP_INT_ON; - scf_debug_test_sys_int_tbl.INT_ST |= INT_ST_IDBCINT; - - if (dsc_p->dinfo.base.length != 0) { - if (scf_debug_test_dscp_loopback == - SCF_DBF_DSCP_LOOPBACK_ON) { - scf_debug_test_dscp_int_tbl.DSR = - (DSR_RxREQ | DSR_TxACK | DSR_TxEND); - - scf_debug_test_dscp_int_tbl.RxDCR_C_FLAG = - dsc_p->dinfo.base.c_flag; - scf_debug_test_dscp_int_tbl.RxDCR_OFFSET = - dsc_p->dinfo.base.offset; - scf_debug_test_dscp_int_tbl.RxDCR_LENGTH = - dsc_p->dinfo.base.length; - } else { - scf_debug_test_dscp_int_tbl.DSR = - (DSR_TxACK | DSR_TxEND); - } - } else { - scf_debug_test_dscp_int_tbl.DSR = DSR_TxEND; - } - - scf_debug_test_dscp_int_tbl.TxDSR_C_FLAG = - (dsc_p->dinfo.base.c_flag & 0xff00) | DSC_STATUS_NORMAL; - scf_debug_test_dscp_int_tbl.TxDSR_OFFSET = - dsc_p->dinfo.base.offset; - - if (scf_debug_test_intr_id == 0) { - scf_debug_test_intr_id = - timeout((void (*)())scf_debug_test_intr_tout, - (void *)statep, - drv_usectohz(SCF_MIL2MICRO(scf_debug_idbcint_time))); - } - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -/* ARGSUSED */ -void -scf_debug_test_event_handler(scf_event_t mevent, void *arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_event_handler() " - - SCFDBGMSG1(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start mevent = %d", - mevent); - SCFDBGMSG(SCF_DBGFLAG_DBG, "======================================="); - - switch (mevent) { - case SCF_MB_CONN_OK: - SCFDBGMSG(SCF_DBGFLAG_DBG, "SCF_MB_CONN_OK"); - break; - case SCF_MB_MSG_DATA: - SCFDBGMSG(SCF_DBGFLAG_DBG, "SCF_MB_MSG_DATA"); - break; - case SCF_MB_SPACE: - SCFDBGMSG(SCF_DBGFLAG_DBG, "SCF_MB_SPACE"); - break; - case SCF_MB_DISC_ERROR: - SCFDBGMSG(SCF_DBGFLAG_DBG, "SCF_MB_DISC_ERROR"); - break; - default: - SCFDBGMSG(SCF_DBGFLAG_DBG, "Undefine event code"); - break; - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, "======================================="); - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_timer_stop() -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_timer_stop() " - timeout_id_t save_tmid[4]; - int timer_cnt = 0; - int ii; - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_debug_test_intr_id != 0) { - save_tmid[timer_cnt] = scf_debug_test_intr_id; - scf_debug_test_intr_id = 0; - timer_cnt++; - } - if (scf_debug_test_alive_id != 0) { - save_tmid[timer_cnt] = scf_debug_test_alive_id; - scf_debug_test_alive_id = 0; - timer_cnt++; - } - - mutex_exit(&scf_comtbl.all_mutex); - - for (ii = 0; ii < timer_cnt; ii++) { - (void) untimeout(save_tmid[ii]); - } - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_map_regs(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_map_regs() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - statep->scf_regs = &scf_debug_scf_regs_tbl; - statep->scf_regs_c = &scf_debug_scf_regs_c_tbl; - statep->scf_dscp_sram = &scf_debug_scf_dscp_sram_tbl; - statep->scf_sys_sram = &scf_debug_scf_sys_sram_tbl; - statep->scf_interface = &scf_debug_scf_interface_tbl; - statep->scf_reg_drvtrc = (void *)&scf_debug_scf_reg_drvtrc_tbl; - statep->scf_reg_drvtrc_len = - (off_t)sizeof (scf_debug_scf_reg_drvtrc_tbl); - - statep->resource_flag |= - (S_DID_REG1 | S_DID_REG2 | S_DID_REG3 | - S_DID_REG4 | S_DID_REG5 | S_DID_REG6); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} - - -void -scf_debug_test_unmap_regs(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_debug_test_unmap_regs() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": start"); - - statep->scf_regs = NULL; - statep->scf_regs_c = NULL; - statep->scf_dscp_sram = NULL; - statep->scf_sys_sram = NULL; - statep->scf_interface = NULL; - statep->scf_reg_drvtrc = NULL; - - statep->resource_flag &= - ~(S_DID_REG1 | S_DID_REG2 | S_DID_REG3 | - S_DID_REG4 | S_DID_REG5 | S_DID_REG6); - - SCFDBGMSG(SCF_DBGFLAG_DBG, SCF_FUNC_NAME ": end"); -} -#endif /* DEBUG */
--- a/usr/src/uts/sun4u/opl/io/scfd/scfdscp.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4541 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/ksynch.h> -#include <sys/types.h> -#include <sys/cmn_err.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> -#include <sys/scfd/scfdscp.h> - -/* - * DSCP control table - */ -scf_dscp_comtbl_t scf_dscp_comtbl; /* DSCP control table */ - -mkey_t scf_dscp_mkey_search[] = { - DSCP_KEY, /* DSCP mailbox interface key */ - DKMD_KEY /* DKMD mailbox interface key */ - /* Add mailbox key */ -}; - -/* - * SCF driver system control intafece function - */ -void scf_dscp_init(void); -void scf_dscp_fini(void); -void scf_dscp_start(uint32_t factor); -void scf_dscp_stop(uint32_t factor); -void scf_dscp_intr(scf_state_t *statep); - -/* - * Timeout function : from SCF driver timer contorol function - */ -void scf_dscp_ack_tout(void); -void scf_dscp_end_tout(void); -void scf_dscp_busy_tout(void); -void scf_dscp_callback_tout(void); -void scf_dscp_callback(void); -void scf_dscp_init_tout(uint8_t id); - -/* - * Interrupt function : from scf_dscp_intr() - */ -void scf_dscp_txack_recv(scf_state_t *statep); -void scf_dscp_txend_recv(scf_state_t *statep); -void scf_dscp_rxreq_recv(scf_state_t *statep); - -/* - * Main and Tx/Rx interface function - */ -void scf_dscp_txend_notice(scf_dscp_main_t *mainp); -void scf_dscp_txrelbusy_notice(scf_dscp_main_t *mainp); -void scf_dscp_rxreq_notice(scf_dscp_main_t *mainp); -void scf_dscp_rxdata_notice(scf_dscp_main_t *mainp); - -/* - * Tx subroutine function - */ -void scf_dscp_send_matrix(void); -void scf_dscp_txreq_send(scf_state_t *statep, scf_dscp_dsc_t *dsc_p); - -/* - * Rx subroutine function - */ -void scf_dscp_recv_matrix(void); -void scf_dscp_rxack_send(scf_state_t *statep); -void scf_dscp_rxend_send(scf_state_t *statep, scf_dscp_dsc_t *dsc_p); - -/* - * subroutine function - */ -void scf_dscp_dscbuff_free_all(void); -void scf_dscp_txdscbuff_free(scf_dscp_main_t *mainp); -void scf_dscp_rxdscbuff_free(scf_dscp_main_t *mainp); -void scf_dscp_rdata_free(scf_dscp_main_t *mainp); -void scf_dscp_event_queue(scf_dscp_main_t *mainp, scf_event_t mevent); -void scf_dscp_event_queue_free(scf_dscp_main_t *mainp); -scf_dscp_main_t *scf_dscp_mkey2mainp(mkey_t mkey); -scf_dscp_main_t *scf_dscp_id2mainp(uint8_t id); -uint16_t scf_dscp_sram_get(void); -void scf_dscp_sram_free(uint16_t offset); - - -/* - * DSCP Driver interface function - */ - -/* - * scf_mb_init() - * - * Description: Initialize the mailbox and register a callback for receiving - * events related to the specified mailbox. - * Arguments: - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - mailbox key - * event_handler- handler to be called for all events related - * to a mailbox. It should be called back with - * the event type and the registered argument. - * - * arg - A callback argument to be passed back to the - * event_handler. - * - * Return Values: returns 0 on success, otherwise any meaningful errno - * values are returned, some of the notable error values - * are given below. - * EINVAL - Invalid values. - * EEXIST - Already OPEN. - * EIO - DSCP I/F path not available. - */ -int -scf_mb_init(target_id_t target_id, mkey_t mkey, - void (*event_handler) (scf_event_t mevent, void *arg), void *arg) -{ -#define SCF_FUNC_NAME "scf_mb_init() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - int path_ret; /* SCF path status return value */ - int ret = 0; /* Return value */ - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_IN, __LINE__, &mkey, sizeof (mkey)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_init; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_init; - } - - /* Check "event_handler" address */ - if (event_handler == NULL) { - /* Invalid "event_handler" */ - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_ERRCD, __LINE__, - &event_handler, sizeof (event_handler)); - ret = EINVAL; - goto END_mb_init; - } - - /* Get SCF path status */ - path_ret = scf_path_check(NULL); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_HALT) { - /* SCF path status is halt */ - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_ERRCD, __LINE__, &path_ret, - sizeof (path_ret)); - ret = EIO; - goto END_mb_init; - } - - /* Check main status */ - if (mainp->status != SCF_ST_IDLE) { - /* Main status != A0 */ - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_ERRCD, __LINE__, - &mainp->status, sizeof (mainp->status)); - ret = EEXIST; - goto END_mb_init; - } - - /* Initialize flag */ - mainp->conn_chk_flag = FLAG_OFF; - mainp->putmsg_busy_flag = FLAG_OFF; - - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_put]; - - /* Make Tx descriptor : INIT_REQ */ - dsc_p->dinfo.base.c_flag = DSC_FLAG_DEFAULT; - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - dsc_p->dinfo.base.length = 0; - dsc_p->dinfo.base.dscp_datap = NULL; - dsc_p->dinfo.bdcr.id = mainp->id & DSC_CNTL_MASK_ID; - dsc_p->dinfo.bdcr.code = DSC_CNTL_INIT_REQ; - - /* Update Tx descriptor offset */ - if (scf_dscp_comtbl.tx_put == scf_dscp_comtbl.tx_last) { - scf_dscp_comtbl.tx_put = scf_dscp_comtbl.tx_first; - } else { - scf_dscp_comtbl.tx_put++; - } - - /* Update Tx descriptor count */ - scf_dscp_comtbl.tx_dsc_count++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - - /* Call send matrix */ - scf_dscp_send_matrix(); - - /* Change main status (B0) */ - SCF_SET_STATUS(mainp, SCF_ST_EST_TXEND_RECV_WAIT); - - /* Save parameter */ - mainp->event_handler = event_handler; - mainp->arg = arg; - mainp->target_id = target_id; - mainp->mkey = mkey; - -/* - * END_mb_init - */ - END_mb_init: - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_MB_INIT | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_mb_fini() - * - * Description: Cleanup the mailbox and unregister an event_handler, - * if it is registered. - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - mailbox key - * - * Return Values: returns 0 on success, otherwise any meaningful errno - * values are returned, some of the notable error values - * are given below. - * EINVAL - Invalid values. - * EBADF - Specified target_id is not OPEN. - */ -int -scf_mb_fini(target_id_t target_id, mkey_t mkey) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_mb_fini() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - int path_ret; /* SCF path status return value */ - int ret = 0; /* Return value */ - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_FINI | TC_IN, __LINE__, &mkey, sizeof (mkey)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_FINI | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_fini; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_FINI | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_fini; - } - - /* Get SCF path status */ - path_ret = scf_path_check(NULL); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_HALT) { - /* SCF path status is halt */ - if (mainp->status != SCF_ST_IDLE) { - /* TxDSC buffer release */ - scf_dscp_txdscbuff_free(mainp); - - /* RxDSC buffer release */ - scf_dscp_rxdscbuff_free(mainp); - - /* All queing event release */ - scf_dscp_event_queue_free(mainp); - - /* All receive buffer release */ - scf_dscp_rdata_free(mainp); - - /* event_handler and arg NULL */ - mainp->event_handler = NULL; - mainp->arg = NULL; - - /* Change main status (A0) */ - SCF_SET_STATUS(mainp, SCF_ST_IDLE); - } - goto END_mb_fini; - } - - /* Check main status */ - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_put]; - - /* Make Tx descriptor : FINI_REQ */ - dsc_p->dinfo.base.c_flag = DSC_FLAG_DEFAULT; - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - dsc_p->dinfo.base.length = 0; - dsc_p->dinfo.base.dscp_datap = NULL; - dsc_p->dinfo.bdcr.id = mainp->id & DSC_CNTL_MASK_ID; - dsc_p->dinfo.bdcr.code = DSC_CNTL_FINI_REQ; - - /* Update Tx descriptor offset */ - if (scf_dscp_comtbl.tx_put == scf_dscp_comtbl.tx_last) { - scf_dscp_comtbl.tx_put = scf_dscp_comtbl.tx_first; - } else { - scf_dscp_comtbl.tx_put++; - } - - /* Update Tx descriptor count */ - scf_dscp_comtbl.tx_dsc_count++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - - /* Call send matrix */ - scf_dscp_send_matrix(); - - /* Change main status (D0) */ - SCF_SET_STATUS(mainp, SCF_ST_CLOSE_TXEND_RECV_WAIT); - - /* INIT_REQ retry timer stop */ - scf_timer_stop(mainp->timer_code); - - /* TxEND(FINI) receive wait */ - SC_DBG_DRV_TRACE(TC_W_SIG, __LINE__, &mainp->fini_cv, - sizeof (kcondvar_t)); - mainp->fini_wait_flag = FLAG_ON; - while (mainp->fini_wait_flag == FLAG_ON) { - cv_wait(&mainp->fini_cv, &scf_comtbl.all_mutex); - } - - /* TxDSC buffer release */ - scf_dscp_txdscbuff_free(mainp); - - /* RxDSC buffer release */ - scf_dscp_rxdscbuff_free(mainp); - - /* All queing event release */ - scf_dscp_event_queue_free(mainp); - - /* All receive buffer release */ - scf_dscp_rdata_free(mainp); - - /* event_handler and arg NULL */ - mainp->event_handler = NULL; - mainp->arg = NULL; - - /* Change main status (A0) */ - SCF_SET_STATUS(mainp, SCF_ST_IDLE); - break; - - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - /* TxDSC buffer release */ - scf_dscp_txdscbuff_free(mainp); - - /* RxDSC buffer release */ - scf_dscp_rxdscbuff_free(mainp); - - /* All queing event release */ - scf_dscp_event_queue_free(mainp); - - /* All receive buffer release */ - scf_dscp_rdata_free(mainp); - - /* event_handler and arg NULL */ - mainp->event_handler = NULL; - mainp->arg = NULL; - - /* Change main status (A0) */ - SCF_SET_STATUS(mainp, SCF_ST_IDLE); - break; - - case SCF_ST_IDLE: /* Main status (A0) */ - /* Main status == A0 is NOP */ - break; - - default: - /* Not open */ - SC_DBG_DRV_TRACE(TC_MB_FINI | TC_ERRCD, __LINE__, - &mainp->status, TC_INFO_SIZE); - ret = EBADF; - break; - } - -/* - * END_mb_fini - */ - END_mb_fini: - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_MB_FINI | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_mb_putmsg() - * - * Description: Send a message via the mailbox identified by mkey. The message - * need to be sent either completely or none. That is, no partial - * messages should be sent. - * - * If a 0 timeout value is specified, then it should act as - * a non-blocking interface, that is, it should either send - * the message immediately or return appropriate error. - * If a timeout value is specified, then it can blocked - * until either the message is sent successfully or timedout. - * - * Arguments: - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - Unique key corresponding to a mailbox. - * data_len - Total length of the data to be sent. - * num_sg - Number of scatter/gather elements in the argument sgp. - * sgp - Scatter/gather list pointer. - * timeout - timeout value in milliseconds. If 0 specified, no waiting - * is required. - * - * Return Values: returns 0 on success, otherwise any meaningful errno - * values are returned, some of the notable error values - * are given below. - * - * EINVAL - Invalid values. - * EBADF - Specified target_id is not OPEN. - * EBUSY - Driver is BUSY. - * ENOSPC - Not enough space to send the message. - * EIO - DSCP I/F path not available. - */ -/* ARGSUSED */ -int -scf_mb_putmsg(target_id_t target_id, mkey_t mkey, uint32_t data_len, - uint32_t num_sg, mscat_gath_t *sgp, clock_t timeout) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_mb_putmsg() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* Current TxDSC address */ - caddr_t wkaddr; /* Working value : buffer address */ - uint32_t wkleng = 0; /* Working value : length */ - uint32_t wkoffset; /* Working value : Tx SRAM offset */ - int ii; /* Working value : counter */ - int path_ret; /* SCF path status return value */ - int ret = 0; /* Return value */ - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_IN, __LINE__, &mkey, sizeof (mkey)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_putmsg; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_putmsg; - } - - /* Get SCF path status */ - path_ret = scf_path_check(NULL); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_HALT) { - /* SCF path status halt */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, &path_ret, - sizeof (path_ret)); - ret = EIO; - goto END_mb_putmsg; - } - - /* Check main status */ - switch (mainp->status) { - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - /* Check "data_len" is "maxdatalen" */ - if (data_len > scf_dscp_comtbl.maxdatalen) { - /* Invalid "data_len" */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, - &data_len, sizeof (data_len)); - ret = EINVAL; - goto END_mb_putmsg; - } - - /* Check "data_len" is 0 */ - if (data_len == 0) { - goto END_mb_putmsg; - } - - /* - * Check "num_sg" is not 0, and "sgp" is not NULL - */ - if ((num_sg == 0) || (sgp == NULL)) { - /* Invalid "num_sg" or "sgp" */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, - &num_sg, sizeof (num_sg)); - ret = EINVAL; - goto END_mb_putmsg; - } - - /* Get total data length : "num_sg" */ - for (ii = 0; ii < num_sg; ii++) { - if ((sgp[ii].msc_len == 0) || - (sgp[ii].msc_dptr != NULL)) { - /* - * Add total data length - */ - wkleng += sgp[ii].msc_len; - } else { - /* Invalid "sgp" */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, - __LINE__, &ii, sizeof (ii)); - ret = EINVAL; - goto END_mb_putmsg; - } - } - - /* - * Check "data_len" and "wkleng" - */ - if (data_len != wkleng) { - /* Invalid "data_len" */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, - &data_len, sizeof (data_len)); - ret = EINVAL; - goto END_mb_putmsg; - } - - /* - * Check Tx SRAM space - */ - if (scf_dscp_comtbl.tx_dsc_count >= - scf_dscp_comtbl.txdsc_busycount) { - /* No space of Tx SRAM */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, - &scf_dscp_comtbl.tx_dsc_count, - sizeof (scf_dscp_comtbl.tx_dsc_count)); - - /* putmsg ENOSPC counter up */ - mainp->memo_putmsg_enospc_cnt++; - - mainp->putmsg_busy_flag = FLAG_ON; - ret = ENOSPC; - goto END_mb_putmsg; - } - - /* Tx buffer allocation */ - wkaddr = (caddr_t)kmem_zalloc(wkleng, KM_SLEEP); - - /* Get Tx SRAM offset */ - wkoffset = scf_dscp_sram_get(); - /* Check Tx SRAM offset */ - if (wkoffset == TX_SRAM_GET_ERROR) { - /* Tx SRAM offset failure */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, - &wkoffset, sizeof (wkoffset)); - - /* Send data release */ - kmem_free(wkaddr, wkleng); - - /* putmsg busy counter up */ - mainp->memo_putmsg_busy_cnt++; - - ret = EBUSY; - goto END_mb_putmsg; - } - - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_put]; - - /* Make Tx descriptor : DATA_REQ */ - dsc_p->dinfo.base.c_flag = DSC_FLAG_DEFAULT; - dsc_p->dinfo.base.offset = (uint16_t)wkoffset; - dsc_p->dinfo.base.length = wkleng; - dsc_p->dinfo.base.dscp_datap = wkaddr; - dsc_p->dinfo.bdcr.id = mainp->id & DSC_CNTL_MASK_ID; - dsc_p->dinfo.bdcr.code = DSC_CNTL_DATA_REQ; - - /* Data copy to Tx buffer */ - for (ii = 0; ii < num_sg; ii++) { - if (sgp[ii].msc_len != 0) { - bcopy(sgp[ii].msc_dptr, wkaddr, - sgp[ii].msc_len); - wkaddr += sgp[ii].msc_len; - } - } - - /* Update Tx descriptor offset */ - if (scf_dscp_comtbl.tx_put == scf_dscp_comtbl.tx_last) { - scf_dscp_comtbl.tx_put = scf_dscp_comtbl.tx_first; - } else { - scf_dscp_comtbl.tx_put++; - } - - /* Update Tx descriptor count */ - scf_dscp_comtbl.tx_dsc_count++; - - /* Change TxDSC status (SB0) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_SRAM_TRANS_WAIT); - - /* Call send matrix */ - scf_dscp_send_matrix(); - - /* Tx DATA_REQ counter */ - mainp->memo_tx_data_req_cnt++; - break; - - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - /* Main status == C1 is NOP */ - break; - - default: - /* Not open */ - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_ERRCD, __LINE__, - &mainp->status, TC_INFO_SIZE); - ret = EBADF; - break; - } - -/* - * END_mb_putmsg - */ - END_mb_putmsg: - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_MB_PUTMSG | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_mb_canget() - * - * Description: Checks if a message received in the specified mailbox. - * If there is a message received, then the length of the - * message is passed via the argument data_lenp. Otherwise, - * return an appropriate error value. - * - * Arguments: - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - Unique key corresponding to a mailbox. - * data_lenp - A pointer to uint32_t, in which the size of the message - * is returned. - * - * Return Values: returns 0 if a message is present, otherwise an appropriate - * errno value is returned. - * - * EINVAL - Invalid values. - * EBADF - Specified target_id is not OPEN. - * ENOMSG - No message available. - * EIO - DSCP I/F path not available. - */ -int -scf_mb_canget(target_id_t target_id, mkey_t mkey, uint32_t *data_lenp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_mb_canget() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_rdata_que_t *rdt_p; /* Current receive data queue address */ - int path_ret; /* SCF path status return value */ - int ret = 0; /* Return value */ - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_IN, __LINE__, &mkey, sizeof (mkey)); - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_canget; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_canget; - } - - /* Get SCF path status */ - path_ret = scf_path_check(NULL); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_HALT) { - /* SCF path status halt */ - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_ERRCD, __LINE__, &path_ret, - sizeof (path_ret)); - ret = EIO; - goto END_mb_canget; - } - - /* Check main status */ - switch (mainp->status) { - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - /* Check "data_lenp" address */ - if (data_lenp == NULL) { - /* Invalid "data_lenp" */ - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_ERRCD, __LINE__, - &data_lenp, sizeof (data_lenp)); - - ret = EINVAL; - goto END_mb_canget; - } - - /* Check receive data count */ - if (mainp->rd_count != 0) { - /* Set receive data length */ - rdt_p = &mainp->rd_datap[mainp->rd_get]; - *data_lenp = rdt_p->length; - } else { - /* Set receive data length is 0 : No messages */ - SC_DBG_DRV_TRACE(TC_MB_CANGET, __LINE__, - &mainp->rd_count, - sizeof (mainp->rd_count)); - *data_lenp = 0; - ret = ENOMSG; - } - break; - - default: - /* Not open */ - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_ERRCD, __LINE__, - &mainp->status, TC_INFO_SIZE); - ret = EBADF; - break; - } - -/* - * END_mb_canget - */ - END_mb_canget: - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - SC_DBG_DRV_TRACE(TC_MB_CANGET | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_mb_getmsg() - * - * Description: Get a message from the specified mailbox. A message need to - * be received either completely or none, that is, no partial - * messages should be received. - * - * If a 0 timeout value is specified, then it should act as a - * non-blocking interface, that is, it should either return - * a message from the mailbox or return appropriate error. - * If a timeout value is specified, then it can blocked - * until either the message is received successfully or timedout. - * - * Arguments: - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - Unique key corresponding to a mailbox. - * data_len - Total length of data buffers passed via scatter/gather list. - * num_sg - Number of scatter/gather elements in the argument sgp. - * sgp - Scatter/gather list pointer. - * timeout - timeout value in milliseconds. If 0 specified, no waiting - * is required. - * - * Return Values: returns 0 on success, otherwise any meaningful errno - * values are returned, some of the notable error values - * are given below. - * - * EINVAL - Invalid values. - * EBADF - Specified target_id is not OPEN. - * EMSGSIZE - Specified receive data size unmatched. - * ENOMSG - No message available. - * EIO - DSCP I/F path not available. - */ -/* ARGSUSED */ -int -scf_mb_getmsg(target_id_t target_id, mkey_t mkey, uint32_t data_len, - uint32_t num_sg, mscat_gath_t *sgp, clock_t timeout) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_mb_getmsg() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_rdata_que_t *rdt_p; /* Current receive data queue address */ - caddr_t wkaddr; /* Working value : buffer address */ - uint32_t wkleng = 0; /* Working value : length */ - int ii; /* Working value : counter */ - int path_ret; /* SCF path status return value */ - int ret = 0; /* Return value */ - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_IN, __LINE__, &mkey, sizeof (mkey)); - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_getmsg; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_getmsg; - } - - /* Get SCF path status */ - path_ret = scf_path_check(NULL); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_HALT) { - /* SCF path status halt */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, __LINE__, &path_ret, - sizeof (path_ret)); - ret = EIO; - goto END_mb_getmsg; - } - - switch (mainp->status) { - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - /* Check "data_len" */ - if ((data_len == 0) || - (data_len > scf_dscp_comtbl.maxdatalen)) { - /* Unmatched "data_len" */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, __LINE__, - &data_len, sizeof (data_len)); - ret = EMSGSIZE; - goto END_mb_getmsg; - } - - /* Is num_sg and sgp valid? */ - if ((num_sg == 0) || (sgp == NULL)) { - /* Invalid "num_sg" or "sgp" */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, - __LINE__, &num_sg, sizeof (num_sg)); - ret = EINVAL; - goto END_mb_getmsg; - } - /* Is there receive data? */ - if (mainp->rd_count == 0) { - /* No message */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG, __LINE__, - &mainp->rd_count, - sizeof (mainp->rd_count)); - ret = ENOMSG; - goto END_mb_getmsg; - } - - /* Get total data length : "num_sg" */ - for (ii = 0; ii < num_sg; ii++) { - if ((sgp[ii].msc_len == 0) || - (sgp[ii].msc_dptr != NULL)) { - /* - * Add total data length - */ - wkleng += sgp[ii].msc_len; - } else { - /* Invalid "sgp" */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, - __LINE__, &sgp, sizeof (sgp)); - ret = EINVAL; - goto END_mb_getmsg; - } - } - /* Check "data_len" and "wkleng" */ - if (data_len != wkleng) { - /* Unmatched "data_len" */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, __LINE__, - &data_len, sizeof (data_len)); - ret = EMSGSIZE; - goto END_mb_getmsg; - } - - /* Get receive data queue address */ - rdt_p = &mainp->rd_datap[mainp->rd_get]; - - /* Check "data_len" and receive data length */ - if (data_len != rdt_p->length) { - /* Unmatched data_len */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, - __LINE__, &data_len, sizeof (data_len)); - ret = EMSGSIZE; - goto END_mb_getmsg; - } - - /* Data copy to "sgp" */ - wkaddr = rdt_p->rdatap; - for (ii = 0; ii < num_sg; ii++) { - if (sgp[ii].msc_len != 0) { - bcopy(wkaddr, sgp[ii].msc_dptr, - sgp[ii].msc_len); - wkaddr += sgp[ii].msc_len; - } - } - /* Receve data release */ - kmem_free(rdt_p->rdatap, rdt_p->length); - rdt_p->rdatap = NULL; - - /* Update receive data queue */ - if (mainp->rd_get == mainp->rd_last) { - mainp->rd_get = mainp->rd_first; - } else { - mainp->rd_get++; - } - - /* Update receive data queue count */ - mainp->rd_count--; - break; - - default: - /* Not open */ - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_ERRCD, __LINE__, - &mainp->status, TC_INFO_SIZE); - ret = EBADF; - break; - } - -/* - * END_mb_getmsg - */ - END_mb_getmsg: - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - SC_DBG_DRV_TRACE(TC_MB_GETMSG | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_mb_flush() - * - * Description: Flush messages from a specified mailbox. - * - * Arguments: - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - Unique key corresponding to a mailbox. - * flush_type - Specifies what type of flush is desired. - * - * Return Values: returns 0 on success, otherwise any meaningful errno - * values are returned. - * EINVAL - Invalid values. - * EBADF - Specified target_id is not OPEN. - */ -int -scf_mb_flush(target_id_t target_id, mkey_t mkey, mflush_type_t flush_type) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_mb_flush() " - scf_dscp_main_t *mainp; /* Main table address */ - int ret = 0; /* Return value */ - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_FLUSH | TC_IN, __LINE__, &mkey, sizeof (mkey)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_FLUSH | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_flush; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_FLUSH | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_flush; - } - - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - switch (flush_type) { - case MB_FLUSH_SEND: - case MB_FLUSH_RECEIVE: - case MB_FLUSH_ALL: - if (flush_type != MB_FLUSH_RECEIVE) { - /* TxDSC buffer release */ - scf_dscp_txdscbuff_free(mainp); - } - if (flush_type != MB_FLUSH_SEND) { - /* RxDSC buffer release */ - scf_dscp_rxdscbuff_free(mainp); - - /* All queing event release */ - scf_dscp_event_queue_free(mainp); - - /* All receive buffer release */ - scf_dscp_rdata_free(mainp); - } - break; - - default: - - /* Invalid "flush_type" */ - SC_DBG_DRV_TRACE(TC_MB_FLUSH | TC_ERRCD, __LINE__, - &flush_type, sizeof (flush_type)); - ret = EINVAL; - break; - } - break; - - default: - /* Not open */ - SC_DBG_DRV_TRACE(TC_MB_FLUSH | TC_ERRCD, __LINE__, - &mainp->status, TC_INFO_SIZE); - ret = EBADF; - break; - } - -/* - * END_mb_flush - */ - END_mb_flush: - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - SC_DBG_DRV_TRACE(TC_MB_FLUSH | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_mb_ctrl() - * - * Description: This interface provides a way to obtain any specific - * properties of a mailbox, such as maximum size of the - * message which could be transmitted/received etc. - * - * Arguments: - * - * target_id - The target_id of the peer. It must be 0 on a Domain. - * mkey - Unique key corresponding to a mailbox. - * op - an operation. - * arg - argument specific to the operation. - * - * Return Values: returns 0 on success, otherwise any meaningful errno - * values are returned. - * - * EINVAL - Invalid values. - * EBADF - Specified target_id is not OPEN. - * ENOTSUP - Not supported. - */ -int -scf_mb_ctrl(target_id_t target_id, mkey_t mkey, uint32_t op, void *arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_mb_ctrl() " - scf_dscp_main_t *mainp; /* Main table address */ - uint32_t *wkarg; /* Working value : arg */ - int ret = 0; /* Return value */ - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start mkey = 0x%08x", - mkey); - SC_DBG_DRV_TRACE(TC_MB_CTRL | TC_IN, __LINE__, &mkey, sizeof (mkey)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check target_id */ - if (target_id != 0) { - /* Invalid "target_id" */ - SC_DBG_DRV_TRACE(TC_MB_CTRL | TC_ERRCD, __LINE__, &target_id, - sizeof (target_id)); - ret = EINVAL; - goto END_mb_ctrl; - } - - /* Get main table address from "mkey" */ - mainp = scf_dscp_mkey2mainp(mkey); - - /* Check mainp address */ - if (mainp == NULL) { - /* Invalid "mkey" */ - SC_DBG_DRV_TRACE(TC_MB_CTRL | TC_ERRCD, __LINE__, &mkey, - sizeof (mkey)); - ret = EINVAL; - goto END_mb_ctrl; - } - - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - /* Check "arg" address */ - if (arg == NULL) { - /* Invalid "arg" */ - SC_DBG_DRV_TRACE(TC_MB_CTRL | TC_ERRCD, __LINE__, - &arg, sizeof (arg)); - ret = EINVAL; - goto END_mb_ctrl; - } - - /* Check "op" */ - switch (op) { - case SCF_MBOP_MAXMSGSIZE: - /* - * Notifies max send/receive - * data size - */ - SC_DBG_DRV_TRACE(TC_MB_CTRL, __LINE__, - &scf_dscp_comtbl.maxdatalen, - sizeof (scf_dscp_comtbl.maxdatalen)); - - /* Setsend/receive data size */ - wkarg = (uint32_t *)arg; - *wkarg = scf_dscp_comtbl.maxdatalen; - break; - - default: - /* Not support */ - SC_DBG_DRV_TRACE(TC_MB_CTRL, __LINE__, &op, - sizeof (op)); - ret = ENOTSUP; - break; - } - break; - - default: - /* Not open */ - SC_DBG_DRV_TRACE(TC_MB_CTRL | TC_ERRCD, - __LINE__, &mainp->status, TC_INFO_SIZE); - ret = EBADF; - break; - } - -/* - * END_mb_ctrl - */ - END_mb_ctrl: - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - SC_DBG_DRV_TRACE(TC_MB_CTRL | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * SCF driver system control intafece function - */ - -/* - * scf_dscp_init() - * - * Description: DSCP control area initialization processing. - * - */ -void -scf_dscp_init(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_init() " - scf_dscp_main_t *mainp = NULL; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - scf_tx_sram_t *sram_p; /* Tx SRAM address */ - int ii; /* Working value : counter */ - int jj; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* - * DSCP common table initialization - */ - /* Set size value */ - scf_dscp_comtbl.maxdatalen = SCF_MB_MAXDATALEN; - scf_dscp_comtbl.total_buffsize = SCF_TOTAL_BUFFSIZE; - scf_dscp_comtbl.txbuffsize = SCF_TXBUFFSIZE; - scf_dscp_comtbl.rxbuffsize = SCF_RXBUFFSIZE; - - /* Set max count */ - scf_dscp_comtbl.txsram_maxcount = SCF_TX_SRAM_MAXCOUNT; - scf_dscp_comtbl.rxsram_maxcount = SCF_RX_SRAM_MAXCOUNT; - scf_dscp_comtbl.txdsc_maxcount = SCF_TXDSC_MAXCOUNT; - scf_dscp_comtbl.rxdsc_maxcount = SCF_RXDSC_MAXCOUNT; - scf_dscp_comtbl.txdsc_busycount = SCF_TXDSC_BUSYCOUNT; - scf_dscp_comtbl.rxdsc_busycount = SCF_RXDSC_BUSYCOUNT; - - /* Set re-try max count */ - scf_dscp_comtbl.tx_ackto_maxretry_cnt = SCF_TX_ACKTO_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_endto_maxretry_cnt = SCF_TX_ENDTO_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_busy_maxretry_cnt = SCF_TX_BUSY_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_interface_maxretry_cnt = SCF_TX_IF_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_nak_maxretry_cnt = SCF_TX_NAK_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_notsup_maxretry_cnt = SCF_TX_NOTSUP_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_prmerr_maxretry_cnt = SCF_TX_PRMERR_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_seqerr_maxretry_cnt = SCF_TX_SEQERR_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_other_maxretry_cnt = SCF_TX_OTHER_MAXRETRAYCOUNT; - scf_dscp_comtbl.tx_send_maxretry_cnt = SCF_TX_SEND_MAXRETRAYCOUNT; - - /* TxDSC/RxDSC table allocation */ - scf_dscp_comtbl.tx_dscsize = - sizeof (scf_dscp_dsc_t) * (scf_dscp_comtbl.txdsc_maxcount + - SCF_TXDSC_LOCALCOUNT); - scf_dscp_comtbl.tx_dscp = - (scf_dscp_dsc_t *)kmem_zalloc(scf_dscp_comtbl.tx_dscsize, - KM_SLEEP); - - scf_dscp_comtbl.rx_dscsize = - sizeof (scf_dscp_dsc_t) * (scf_dscp_comtbl.rxdsc_maxcount); - scf_dscp_comtbl.rx_dscp = - (scf_dscp_dsc_t *)kmem_zalloc(scf_dscp_comtbl.rx_dscsize, - KM_SLEEP); - - /* Tx SRAM table allocation */ - scf_dscp_comtbl.tx_sramsize = - sizeof (scf_tx_sram_t) * scf_dscp_comtbl.txsram_maxcount; - scf_dscp_comtbl.tx_sramp = - (scf_tx_sram_t *)kmem_zalloc(scf_dscp_comtbl.tx_sramsize, - KM_SLEEP); - - /* - * TxDSC table initialization - */ - /* Get TxDSC table address */ - dsc_p = scf_dscp_comtbl.tx_dscp; - for (ii = 0; ii < scf_dscp_comtbl.txdsc_maxcount; ii++, dsc_p++) { - /* Init SRAM offset */ - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - } - - /* Set Tx offset */ - scf_dscp_comtbl.tx_first = 0; - scf_dscp_comtbl.tx_last = - (uint16_t)(scf_dscp_comtbl.txdsc_maxcount - 1); - scf_dscp_comtbl.tx_put = 0; - scf_dscp_comtbl.tx_get = 0; - scf_dscp_comtbl.tx_local = (uint16_t)scf_dscp_comtbl.txdsc_maxcount; - scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local].dinfo.base.offset = - DSC_OFFSET_NOTHING; - - /* - * Tx STAM offset initialization - */ - /* Get Tx SRAM table address */ - sram_p = scf_dscp_comtbl.tx_sramp; - for (ii = 0; ii < scf_dscp_comtbl.txsram_maxcount; ii++, sram_p++) { - /* Init SRAM offset */ - sram_p->offset = - (uint16_t)(scf_dscp_comtbl.txbuffsize * ii / - DSC_OFFSET_CONVERT); - } - - /* Set Tx SRAM offset */ - scf_dscp_comtbl.tx_sram_first = 0; - scf_dscp_comtbl.tx_sram_last = (scf_dscp_comtbl.txsram_maxcount - 1); - scf_dscp_comtbl.tx_sram_put = 0; - - /* - * RxDSC table initialization - */ - /* Set Rx offset */ - scf_dscp_comtbl.rx_first = 0; - scf_dscp_comtbl.rx_last = - (uint16_t)(scf_dscp_comtbl.rxdsc_maxcount - 1); - scf_dscp_comtbl.rx_put = 0; - scf_dscp_comtbl.rx_get = 0; - - /* - * Main table initialization - */ - /* Get Top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - - /* Check main table */ - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* Set table id */ - mainp->id = ii & DSC_CNTL_MASK_ID; - - /* Set event/recive queue max count */ - mainp->ev_maxcount = SCF_MB_EVQUE_MAXCOUNT; - mainp->rd_maxcount = SCF_RDQUE_MAXCOUNT; - mainp->rd_busycount = SCF_RDQUE_BUSYCOUNT; - - /* Set fint() condition variable */ - cv_init(&mainp->fini_cv, NULL, CV_DRIVER, NULL); - mainp->cv_init_flag = FLAG_ON; - - /* event/receive data queue table allocation */ - mainp->ev_quesize = - sizeof (scf_event_que_t) * mainp->ev_maxcount; - mainp->ev_quep = - (scf_event_que_t *)kmem_zalloc(mainp->ev_quesize, - KM_SLEEP); - mainp->rd_datasize = - sizeof (scf_rdata_que_t) * mainp->ev_maxcount; - mainp->rd_datap = - (scf_rdata_que_t *)kmem_zalloc(mainp->rd_datasize, - KM_SLEEP); - - /* Event queue initialization */ - for (jj = 0; jj < mainp->ev_maxcount; jj++) { - mainp->ev_quep[jj].mevent = (scf_event_t)(-1); - } - mainp->ev_first = 0; - mainp->ev_last = (uint16_t)(mainp->ev_maxcount - 1); - mainp->ev_put = 0; - mainp->ev_get = 0; - - /* Receive data queue initialization */ - mainp->rd_first = 0; - mainp->rd_last = (uint16_t)(mainp->rd_maxcount - 1); - mainp->rd_put = 0; - mainp->rd_get = 0; - - /* Set DSCP INIT_REQ retry timer code */ - if (mainp->id == MBIF_DSCP) { - mainp->timer_code = SCF_TIMERCD_DSCP_INIT; - } else { - mainp->timer_code = SCF_TIMERCD_DKMD_INIT; - } - } - - /* Initialize success flag ON */ - scf_dscp_comtbl.dscp_init_flag = FLAG_ON; - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_fini() - * - * Description: DSCP control area release processing. - * - */ -void -scf_dscp_fini(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_fini() " - scf_dscp_main_t *mainp; /* Main table address */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* - * Main table resources release - */ - /* Get Top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - - /* Check main table */ - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* All receive buffer release */ - scf_dscp_rdata_free(mainp); - - /* Check fint() condition variable */ - if (mainp->cv_init_flag == FLAG_ON) { - /* Destroy fint() condition variable */ - cv_destroy(&mainp->fini_cv); - mainp->cv_init_flag = FLAG_OFF; - } - - /* Check event queue table allocation */ - if (mainp->ev_quep != NULL) { - /* Event queue table release */ - kmem_free(mainp->ev_quep, mainp->ev_quesize); - mainp->ev_quep = NULL; - } - - /* Check receive data table queue allocation */ - if (mainp->rd_datap != NULL) { - /* Receive data queue table release */ - kmem_free(mainp->rd_datap, mainp->rd_datasize); - mainp->rd_datap = NULL; - } - } - - /* - * DSCP common table resources release - */ - /* All timer stop */ - scf_timer_stop(SCF_TIMERCD_DSCP_ACK); - scf_timer_stop(SCF_TIMERCD_DSCP_END); - scf_timer_stop(SCF_TIMERCD_DSCP_CALLBACK); - scf_timer_stop(SCF_TIMERCD_DSCP_BUSY); - scf_timer_stop(SCF_TIMERCD_DSCP_INIT); - scf_timer_stop(SCF_TIMERCD_DKMD_INIT); - - /* All DSC buffer release */ - scf_dscp_dscbuff_free_all(); - - /* Check TxDSC table allocation */ - if (scf_dscp_comtbl.tx_dscp != NULL) { - /* TxDSC table release */ - kmem_free(scf_dscp_comtbl.tx_dscp, - scf_dscp_comtbl.tx_dscsize); - scf_dscp_comtbl.tx_dscp = NULL; - } - - /* Check RxDSC table allocation */ - if (scf_dscp_comtbl.rx_dscp != NULL) { - /* RxDSC table release */ - kmem_free(scf_dscp_comtbl.rx_dscp, - scf_dscp_comtbl.rx_dscsize); - scf_dscp_comtbl.rx_dscp = NULL; - } - - /* Check Tx SRAM table allocation */ - if (scf_dscp_comtbl.tx_sramp != NULL) { - /* Tx SRAM table release */ - kmem_free(scf_dscp_comtbl.tx_sramp, - scf_dscp_comtbl.tx_sramsize); - scf_dscp_comtbl.tx_sramp = NULL; - } - - /* Initialize success flag ON */ - scf_dscp_comtbl.dscp_init_flag = FLAG_OFF; - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_start() - * - * Description: DSCP interface start processing. - * - */ -void -scf_dscp_start(uint32_t factor) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_start() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start factor = 0x%08x", - factor); - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_ON) { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - - /* Change TxDSC status (SA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_IDLE); - - /* TxREQ send exec flag OFF */ - scf_dscp_comtbl.tx_exec_flag = FLAG_OFF; - } - - /* Check pending send TxDSC */ - if (scf_dscp_comtbl.tx_dsc_count != 0) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - - /* Check TxDSC status */ - switch (dsc_p->status) { - case SCF_TX_ST_TXREQ_SEND_WAIT: /* TxDSC status (SB2) */ - /* Check send data length */ - if (dsc_p->dinfo.base.length != 0) { - /* Try again SRAM transfer */ - - /* Change TxDSC status (SB0) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_SRAM_TRANS_WAIT); - } - break; - - case SCF_TX_ST_TXACK_RECV_WAIT: /* TxDSC status (SC0) */ - case SCF_TX_ST_TXEND_RECV_WAIT: /* TxDSC status (SC1) */ - /* Try again TxREQ send */ - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - break; - - default: - /* TxDSC status != SB2 or SC0 or SC1 is NOP */ - break; - } - } - - /* Check pending RxDSC */ - while (scf_dscp_comtbl.rx_dsc_count != 0) { - /* Get RxDSC address */ - dsc_p = &scf_dscp_comtbl.rx_dscp[scf_dscp_comtbl.rx_get]; - - /* Check receive data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Receive data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Change RxDSC status (RA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_IDLE); - - /* Update Rx descriptor offset */ - if (scf_dscp_comtbl.rx_get == scf_dscp_comtbl.rx_last) { - scf_dscp_comtbl.rx_get = scf_dscp_comtbl.rx_first; - } else { - scf_dscp_comtbl.rx_get++; - } - - /* Update Rx descriptor count */ - scf_dscp_comtbl.rx_dsc_count--; - - /* RxREQ receive exec flag OFF */ - scf_dscp_comtbl.rx_exec_flag = FLAG_OFF; - } - - /* Check SCF path change */ - if (factor == FACTOR_PATH_CHG) { - /* Tx re-try counter initialization */ - scf_dscp_comtbl.tx_ackto_retry_cnt = 0; - scf_dscp_comtbl.tx_endto_retry_cnt = 0; - - scf_dscp_comtbl.tx_busy_retry_cnt = 0; - scf_dscp_comtbl.tx_interface_retry_cnt = 0; - scf_dscp_comtbl.tx_nak_retry_cnt = 0; - scf_dscp_comtbl.tx_notsuop_retry_cnt = 0; - scf_dscp_comtbl.tx_prmerr_retry_cnt = 0; - scf_dscp_comtbl.tx_seqerr_retry_cnt = 0; - scf_dscp_comtbl.tx_other_retry_cnt = 0; - scf_dscp_comtbl.tx_send_retry_cnt = 0; - - /* - * SCF path change flag ON : - * local control data send(DSCP_PATH) - */ - scf_dscp_comtbl.dscp_path_flag = FLAG_ON; - } else { - /* SCF online processing */ - - /* Get Top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - - /* Check main table */ - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* Check main status */ - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - /* - * Connect check flag ON : - * local control data send(CONN_CHK) - */ - mainp->conn_chk_flag = FLAG_ON; - break; - - default: - /* Connect check flag OFF */ - mainp->conn_chk_flag = FLAG_OFF; - break; - } - } - } - - /* Call send matrix */ - scf_dscp_send_matrix(); - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_stop() - * - * Description: DSCP interface stop processing. - * - */ -void -scf_dscp_stop(uint32_t factor) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_stop() " - scf_dscp_main_t *mainp; /* Main table address */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start factor = 0x%08x", - factor); - - /* Check stop factor */ - if ((factor == FACTOR_PATH_HALT) || (factor == FACTOR_PATH_STOP)) { - /* memo counter up */ - scf_dscp_comtbl.scf_stop_memo_cnt++; - - /* Get Top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - - /* Check main table */ - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* Check main status */ - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - /* SCF_MB_DISC_ERROR event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_DISC_ERROR); - - /* Change main status (C1) */ - SCF_SET_STATUS(mainp, SCF_ST_EST_FINI_WAIT); - - break; - - case SCF_ST_CLOSE_TXEND_RECV_WAIT: - /* Main status (D0) */ - /* Signal to fini() wait */ - mainp->fini_wait_flag = FLAG_OFF; - cv_signal(&mainp->fini_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &mainp->fini_cv, sizeof (kcondvar_t)); - break; - - default: - /* Main status != B0 or C0 or D0 is NOP */ - break; - } - } - } - - /* Tx timer stop */ - scf_timer_stop(SCF_TIMERCD_DSCP_ACK); - scf_timer_stop(SCF_TIMERCD_DSCP_END); - scf_timer_stop(SCF_TIMERCD_DSCP_BUSY); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_intr() - * - * Description: The corresponding function is called according to the - * interruption factor from SCF. - * - */ -void -scf_dscp_intr(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_intr() " - /* Working value : Interrupt check flag */ - int interrupt = FLAG_OFF; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get DSR register */ - statep->reg_dsr = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR); - SC_DBG_DRV_TRACE(TC_R_DSR, __LINE__, &statep->reg_dsr, - sizeof (statep->reg_dsr)); - - /* DSR register interrupt clear */ - SCF_DDI_PUT8(statep, statep->scf_regs_handle, &statep->scf_regs->DSR, - statep->reg_dsr); - SC_DBG_DRV_TRACE(TC_W_DSR, __LINE__, &statep->reg_dsr, - sizeof (statep->reg_dsr)); - - /* Regster read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR); - - SCF_DBG_TEST_INTR_DSCP_DSR(statep); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "DSR = 0x%02x", statep->reg_dsr); - - if ((statep->reg_dsr & DSR_TxACK) != 0) { /* TxACK interrupt */ - SCFDBGMSG(SCF_DBGFLAG_DSCP, "TxACK interrupt"); - - interrupt = FLAG_ON; - - SC_DBG_DRV_TRACE(TC_TxACK, __LINE__, NULL, 0); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_TXACK); - - /* Call TxACK interrupt processing */ - scf_dscp_txack_recv(statep); - } - - if ((statep->reg_dsr & DSR_TxEND) != 0) { /* TxEND interrupt */ - SCFDBGMSG(SCF_DBGFLAG_DSCP, "TxEND interrupt"); - - interrupt = FLAG_ON; - - /* Get TxDSR register */ - statep->reg_txdsr_c_flag = - SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->TxDSR_C_FLAG); - SC_DBG_DRV_TRACE(TC_R_TxDSR_C_FLAG, __LINE__, - &statep->reg_txdsr_c_flag, - sizeof (statep->reg_txdsr_c_flag)); - - statep->reg_txdsr_c_offset = - SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->TxDSR_OFFSET); - SC_DBG_DRV_TRACE(TC_R_TxDSR_OFFSET, __LINE__, - &statep->reg_txdsr_c_offset, - sizeof (statep->reg_txdsr_c_offset)); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_TXEND); - - SCF_DBG_TEST_INTR_DSCP_RXTX(statep, DSR_TxEND); - - SC_DBG_DRV_TRACE(TC_TxEND, __LINE__, - &statep->reg_txdsr_c_flag, 4); - - SCFDBGMSG2(SCF_DBGFLAG_REG, "TxDSR = 0x%04x 0x%04x", - statep->reg_txdsr_c_flag, statep->reg_txdsr_c_offset); - - /* Call TxEND interrupt processing */ - scf_dscp_txend_recv(statep); - } - - if ((statep->reg_dsr & DSR_RxREQ) != 0) { /* RxREQ interrupt */ - SCFDBGMSG(SCF_DBGFLAG_DSCP, "RxREQ interrupt"); - - interrupt = FLAG_ON; - /* Get RxDCR register */ - statep->reg_rxdcr_c_flag = - SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->RxDCR_C_FLAG); - SC_DBG_DRV_TRACE(TC_R_RxDCR_C_FLAG, __LINE__, - &statep->reg_rxdcr_c_flag, - sizeof (statep->reg_rxdcr_c_flag)); - - statep->reg_rxdcr_c_offset = - SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->RxDCR_OFFSET); - SC_DBG_DRV_TRACE(TC_R_RxDCR_OFFSET, __LINE__, - &statep->reg_rxdcr_c_offset, - sizeof (statep->reg_rxdcr_c_offset)); - - statep->reg_rxdcr_c_length = - SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->RxDCR_LENGTH); - SC_DBG_DRV_TRACE(TC_R_RxDCR_LENGTH, __LINE__, - &statep->reg_rxdcr_c_length, - sizeof (statep->reg_rxdcr_c_length)); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_RXREQ); - - SCF_DBG_TEST_INTR_DSCP_RXTX(statep, statep->reg_dsr); - - SC_DBG_DRV_TRACE(TC_RxREQ, __LINE__, - &statep->reg_rxdcr_c_flag, 8); - - SCFDBGMSG3(SCF_DBGFLAG_REG, "RxDCR = 0x%04x 0x%04x 0x%08x", - statep->reg_rxdcr_c_flag, statep->reg_rxdcr_c_offset, - statep->reg_rxdcr_c_length); - - /* Call RxRERQ interrupt processing */ - scf_dscp_rxreq_recv(statep); - } - - if (interrupt == FLAG_OFF) { - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, &statep->reg_dsr, - sizeof (statep->reg_dsr)); - statep->no_int_dsr_cnt++; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * Timeout function : from SCF driver timer contorol function - */ - -/* - * scf_dscp_ack_tout() - * - * Description: TxACK reception surveillance timeout processing is performed. - * SCF path change factor. - * - */ -void -scf_dscp_ack_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_ack_tout() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - scf_state_t *statep; /* Soft state pointer */ - int path_ret; /* SCF path status return value */ - uchar_t cmd; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check TxREQ send exec */ - if (scf_dscp_comtbl.tx_exec_flag == FLAG_OFF) { - goto END_dscp_ack_tout; - } - - /* memo counter up */ - scf_dscp_comtbl.tx_ackto_memo_cnt++; - - /* TxREQ send exec flag OFF */ - scf_dscp_comtbl.tx_exec_flag = FLAG_OFF; - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - } - - /* Check TxDSC status */ - if (dsc_p->status == SCF_TX_ST_TXACK_RECV_WAIT) { - /* TxDSC status (SC0) */ - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_ackto_retry_cnt < - scf_dscp_comtbl.tx_ackto_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_ackto_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - - /* Call send matrix */ - scf_dscp_send_matrix(); - } else { - /* TxACK re-try timeout error */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &scf_dscp_comtbl.tx_ackto_retry_cnt, - sizeof (scf_dscp_comtbl.tx_ackto_retry_cnt)); - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_ONLINE) { - cmd = (uchar_t)(dsc_p->dinfo.base.c_flag >> 8); - cmn_err(CE_WARN, - "%s,DSCP ack response timeout " - "occurred. " - "DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_ACKTO); - - /* SCF path change */ - statep->scf_herr |= HERR_DSCP_ACKTO; - scf_path_change(statep); - } - } - } - -/* - * END_dscp_ack_tout - */ - END_dscp_ack_tout: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_end_tout() - * - * Description: TxEND reception surveillance timeout processing is performed. - * SCF path change factor. - * - */ -void -scf_dscp_end_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_end_tout() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - scf_state_t *statep; /* Soft state pointer */ - int path_ret; /* SCF path status return value */ - uchar_t cmd; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check TxREQ send exec */ - if (scf_dscp_comtbl.tx_exec_flag == FLAG_OFF) { - goto END_dscp_end_tout; - } - - /* memo counter up */ - scf_dscp_comtbl.tx_endto_memo_cnt++; - - /* TxREQ send exec flag OFF */ - scf_dscp_comtbl.tx_exec_flag = FLAG_OFF; - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - } - - /* Check TxDSC status */ - if (dsc_p->status == SCF_TX_ST_TXEND_RECV_WAIT) { - /* TxDSC status (SC1) */ - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_endto_retry_cnt < - scf_dscp_comtbl.tx_endto_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_endto_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - - /* Call send matrix */ - scf_dscp_send_matrix(); - } else { - /* TxEND re-try timeout error */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &scf_dscp_comtbl.tx_endto_retry_cnt, - sizeof (scf_dscp_comtbl.tx_endto_retry_cnt)); - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - - /* Check SCF path status */ - if (path_ret == SCF_PATH_ONLINE) { - cmd = (uchar_t)(dsc_p->dinfo.base.c_flag >> 8); - cmn_err(CE_WARN, - "%s,DSCP end response timeout " - "occurred. " - "DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_ENDTO); - - /* SCF path change */ - statep->scf_herr |= HERR_DSCP_ENDTO; - scf_path_change(statep); - } - } - } - -/* - * END_dscp_end_tout - */ - END_dscp_end_tout: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_busy_tout() - * - * Description: Busy timeout performs TxREQ transmission again. - * - */ -void -scf_dscp_busy_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_busy_tout() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check pending send TxDSC or local control TxDSC */ - if ((scf_dscp_comtbl.tx_dsc_count == 0) && - (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF)) { - goto END_dscp_busy_tout; - } - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - } - - /* Check TxDSC status */ - if (dsc_p->status == SCF_TX_ST_TXREQ_SEND_WAIT) { - /* TxDSC status (SB2) */ - /* Call send matrix */ - scf_dscp_send_matrix(); - } - -/* - * END_dscp_busy_tout - */ - END_dscp_busy_tout: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_callback_tout() - * - * Description: Callbak timeout performs soft interrupt again. - * - */ -void -scf_dscp_callback_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_callback_tout() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Soft interrupt : call scf_dscp_callback() */ - if (mutex_tryenter(&scf_comtbl.si_mutex) != 0) { - scf_comtbl.scf_softintr_dscp_kicked = FLAG_ON; - ddi_trigger_softintr(scf_comtbl.scf_softintr_id); - mutex_exit(&scf_comtbl.si_mutex); - } - - /* Callback timer start */ - scf_timer_start(SCF_TIMERCD_DSCP_CALLBACK); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_init_tout() - * - * Description: INIT_REQ retry timeout performs TxREQ transmission again. - * - */ -void -scf_dscp_init_tout(uint8_t id) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_init_tout() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get main table address */ - mainp = scf_dscp_id2mainp(id); - - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_put]; - - /* Make Tx descriptor : INIT_REQ */ - dsc_p->dinfo.base.c_flag = DSC_FLAG_DEFAULT; - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - dsc_p->dinfo.base.length = 0; - dsc_p->dinfo.base.dscp_datap = NULL; - dsc_p->dinfo.bdcr.id = mainp->id & DSC_CNTL_MASK_ID; - dsc_p->dinfo.bdcr.code = DSC_CNTL_INIT_REQ; - - /* Update Tx descriptor offset */ - if (scf_dscp_comtbl.tx_put == scf_dscp_comtbl.tx_last) { - scf_dscp_comtbl.tx_put = scf_dscp_comtbl.tx_first; - } else { - scf_dscp_comtbl.tx_put++; - } - - /* Update Tx descriptor count */ - scf_dscp_comtbl.tx_dsc_count++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - - /* Call send matrix */ - scf_dscp_send_matrix(); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_callback() - * - * Description: Event queue is taken out and a callback entry is called. - * - */ -void -scf_dscp_callback(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_callback() " - scf_dscp_main_t *mainp; /* Main table address */ - /* Working value : event_handler */ - void (*wkevent_handler)(scf_event_t, void *); - scf_event_t wkmevent; /* Working value : mevent */ - void *wkarg; /* Working value : arg */ - /* Working value : next event processing check flag */ - int event_flag = FLAG_OFF; - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check callback entry exec flag */ - if (scf_dscp_comtbl.callback_exec_flag == FLAG_ON) { - goto END_dscp_callback; - } - - /* Set callback entry exec flag */ - scf_dscp_comtbl.callback_exec_flag = FLAG_ON; - -/* - * CALLBACK_START - */ - CALLBACK_START: - - /* Get Top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - /* Check all main table */ - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* Check event count */ - if (mainp->ev_count != 0) { - /* Next event processing flag ON */ - event_flag = FLAG_ON; - - /* Get event info */ - wkmevent = mainp->ev_quep[mainp->ev_get].mevent; - - /* Update event queue offset */ - if (mainp->ev_get == mainp->ev_last) { - mainp->ev_get = mainp->ev_first; - } else { - mainp->ev_get++; - } - - /* Update event queue count */ - mainp->ev_count--; - - /* Get callback enntry and arg */ - wkevent_handler = mainp->event_handler; - wkarg = mainp->arg; - - /* Check event_handler address */ - if (wkevent_handler != NULL) { - /* Check main status */ - switch (mainp->status) { - case SCF_ST_ESTABLISHED: - /* Main status (C0) */ - case SCF_ST_EST_FINI_WAIT: - /* Main status (C1) */ - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Call event handler */ - wkevent_handler(wkmevent, wkarg); - - SC_DBG_DRV_TRACE(TC_MB_CALLBACK, - __LINE__, &wkmevent, - sizeof (wkmevent)); - SCFDBGMSG1(SCF_DBGFLAG_DSCP, - "DSCP callback mevent = %d", - wkmevent); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - break; - - default: - /* - * Main status != C0 or C1 is NOP - */ - break; - } - } - } - } - - /* Check next event processing */ - if (event_flag == FLAG_ON) { - event_flag = FLAG_OFF; - goto CALLBACK_START; - } - - /* Clear callback entry exec flag */ - scf_dscp_comtbl.callback_exec_flag = FLAG_OFF; - -/* - * END_dscp_callback - */ - END_dscp_callback: - - /* CALLBACK timer stop */ - scf_timer_stop(SCF_TIMERCD_DSCP_CALLBACK); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - - -/* - * Interrupt function : from scf_dscp_intr() - */ - -/* - * scf_dscp_txack_recv() - * - * Description: TxACK reception processing is performed. - * - */ -/* ARGSUSED */ -void -scf_dscp_txack_recv(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_txack_recv() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check TxREQ send exec */ - if (scf_dscp_comtbl.tx_exec_flag == FLAG_OFF) { - goto END_dscp_txack_recv; - } - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - } - - /* Check TxDSC status */ - if (dsc_p->status == SCF_TX_ST_TXACK_RECV_WAIT) { - /* TxDSC status (SC0) */ - /* Error counter initialization */ - scf_dscp_comtbl.tx_ackto_retry_cnt = 0; - - /* TxACK timer stop */ - scf_timer_stop(SCF_TIMERCD_DSCP_ACK); - - /* TxEND timer start */ - scf_timer_start(SCF_TIMERCD_DSCP_END); - - /* Change TxDSC status (SC1) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXEND_RECV_WAIT); - } - -/* - * END_dscp_txack_recv - */ - END_dscp_txack_recv: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_txend_recv() - * - * Description: TxEND reception is received and processing is carried out by - * completion information. - * - */ -void -scf_dscp_txend_recv(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_txend_recv() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - scf_dscreg_t wk_dsc; /* Work TxDSC */ - /* Working value : TxDSC release check flag */ - int norel_txdsc = FLAG_OFF; - /* Working value : SCF path change flag */ - int path_change = FLAG_OFF; - int ii; /* Working value : counter */ - uchar_t cmd; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check TxREQ send exec */ - if (scf_dscp_comtbl.tx_exec_flag == FLAG_OFF) { - goto END_dscp_txend_recv; - } - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - } - - /* Save TxDSR status information in TxDSC */ - wk_dsc.base.c_flag = statep->reg_txdsr_c_flag; - dsc_p->dinfo.bdsr.status = wk_dsc.bdsr.status; - SCFDBGMSG1(SCF_DBGFLAG_DSCP, "TxEND status = 0x%02x", - dsc_p->dinfo.bdsr.status); - - /* Check TxREQ offset and TxEND offset */ - if (dsc_p->dinfo.base.offset != statep->reg_txdsr_c_offset) { - goto END_dscp_txend_recv; - } - - /* TxACK and TxEND timer stop */ - scf_timer_stop(SCF_TIMERCD_DSCP_ACK); - scf_timer_stop(SCF_TIMERCD_DSCP_END); - - /* Get main table address from "id" */ - mainp = scf_dscp_id2mainp(dsc_p->dinfo.bdcr.id); - - /* - * Check mainp address or local control data(DSCP_PATH) - */ - if ((mainp == NULL) && - (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL)) { - goto END_dscp_txend_recv; - } - - cmd = (uchar_t)(dsc_p->dinfo.base.c_flag >> 8); - - /* Check TxDSC status */ - switch (dsc_p->status) { - case SCF_TX_ST_TXACK_RECV_WAIT: - /* TxDSC status (SC0) */ - case SCF_TX_ST_TXEND_RECV_WAIT: - /* TxDSC status (SC1) */ - /* Check TxREQ end status */ - switch (dsc_p->dinfo.bdsr.status) { - case DSC_STATUS_NORMAL: /* Normal end */ - /* Error counter initialization */ - scf_dscp_comtbl.tx_ackto_retry_cnt = 0; - scf_dscp_comtbl.tx_endto_retry_cnt = 0; - scf_dscp_comtbl.tx_busy_retry_cnt = 0; - scf_dscp_comtbl.tx_interface_retry_cnt = 0; - scf_dscp_comtbl.tx_nak_retry_cnt = 0; - scf_dscp_comtbl.tx_notsuop_retry_cnt = 0; - scf_dscp_comtbl.tx_prmerr_retry_cnt = 0; - scf_dscp_comtbl.tx_seqerr_retry_cnt = 0; - scf_dscp_comtbl.tx_other_retry_cnt = 0; - scf_dscp_comtbl.tx_send_retry_cnt = 0; - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } - break; - - case DSC_STATUS_BUF_BUSY: /* Buffer busy */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_busy_memo_cnt++; - - /* TxREQ code check */ - if (dsc_p->dinfo.bdcr.code == DSC_CNTL_INIT_REQ) { - /* Check main status */ - if (mainp->status == - SCF_ST_EST_TXEND_RECV_WAIT) { - /* INIT_REQ retry timer start */ - scf_timer_start(mainp->timer_code); - } - break; - } - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_busy_retry_cnt < - scf_dscp_comtbl.tx_busy_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_busy_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* TxREQ busy timer start */ - scf_timer_start(SCF_TIMERCD_DSCP_BUSY); - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Buffer busy end re-try error */ - cmn_err(CE_WARN, - "%s,Buffer busy occurred in XSCF. " - "DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } else { - /* DSCP path change send flag ON */ - scf_dscp_comtbl.dscp_path_flag = - FLAG_ON; - } - } - break; - - case DSC_STATUS_INTERFACE: /* Interface error */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_interface_memo_cnt++; - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_interface_retry_cnt < - scf_dscp_comtbl.tx_interface_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_interface_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Interface error end re-try error */ - cmn_err(CE_WARN, - "%s,Detected the interface error by " - "XSCF. DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* Set hard error flag */ - statep->scf_herr |= HERR_DSCP_INTERFACE; - - /* SCF path change flag ON */ - path_change = FLAG_ON; - } - break; - - case DSC_STATUS_CONN_NAK: /* Connection refusal */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_nak_memo_cnt++; - - /* TxREQ code check */ - if (dsc_p->dinfo.bdcr.code == DSC_CNTL_INIT_REQ) { - /* Check main status */ - if (mainp->status == - SCF_ST_EST_TXEND_RECV_WAIT) { - /* INIT_REQ retry timer start */ - scf_timer_start(mainp->timer_code); - } - break; - } - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_nak_retry_cnt < - scf_dscp_comtbl.tx_nak_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_nak_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Connection refusal end re-try error */ - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } else { - /* Set hard error flag */ - statep->scf_herr |= HERR_DSCP_INTERFACE; - - /* SCF path change flag ON */ - path_change = FLAG_ON; - } - } - break; - - case DSC_STATUS_E_NOT_SUPPORT: /* Not support */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_notsuop_memo_cnt++; - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_notsuop_retry_cnt < - scf_dscp_comtbl.tx_notsup_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_notsuop_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Not support end re-try error */ - cmn_err(CE_WARN, - "%s,Detected the not support command " - "by XSCF. DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } else { - /* DSCP path change send flag ON */ - scf_dscp_comtbl.dscp_path_flag = - FLAG_ON; - } - } - break; - - case DSC_STATUS_E_PARAM: /* Parameter error */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_prmerr_memo_cnt++; - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_prmerr_retry_cnt < - scf_dscp_comtbl.tx_prmerr_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_prmerr_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Parameter error end re-try error */ - cmn_err(CE_WARN, - "%s,Detected the invalid parameter by " - "XSCF. DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } else { - /* DSCP path change send flag ON */ - scf_dscp_comtbl.dscp_path_flag = - FLAG_ON; - } - } - break; - - case DSC_STATUS_E_SEQUENCE: /* Sequence error */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_seqerr_memo_cnt++; - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_seqerr_retry_cnt < - scf_dscp_comtbl.tx_seqerr_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_seqerr_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Sequence error end re-try error */ - cmn_err(CE_WARN, - "%s,Detected the sequence error by " - "XSCF. DSCP command = 0x%02x\n", - &statep->pathname[0], cmd); - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } else { - /* DSCP path change send flag ON */ - scf_dscp_comtbl.dscp_path_flag = - FLAG_ON; - } - } - break; - - default: /* Other status */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - - /* memo counter up */ - scf_dscp_comtbl.tx_other_memo_cnt++; - - /* Check re-try counter */ - if ((scf_dscp_comtbl.tx_other_retry_cnt < - scf_dscp_comtbl.tx_other_maxretry_cnt) && - (scf_dscp_comtbl.tx_send_retry_cnt < - scf_dscp_comtbl.tx_send_maxretry_cnt)) { - /* re-try count up */ - scf_dscp_comtbl.tx_other_retry_cnt++; - scf_dscp_comtbl.tx_send_retry_cnt++; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - - /* TxDSC not release */ - norel_txdsc = FLAG_ON; - } else { - /* Other error end re-try error */ - cmn_err(CE_WARN, - "%s,Invalid status value was notified " - "from XSCF. DSCP command = 0x%02x, " - "Status value = 0x%02x\n", - &statep->pathname[0], cmd, - (uchar_t) - dsc_p->dinfo.base.c_flag); - - /* Check local control data(DSCP_PATH) */ - if (dsc_p->dinfo.bdcr.id != DSC_CNTL_LOCAL) { - /* TxEND notice to main matrix */ - scf_dscp_txend_notice(mainp); - } else { - /* DSCP path change send flag ON */ - scf_dscp_comtbl.dscp_path_flag = - FLAG_ON; - } - } - break; - } - break; - - default: - /* TxDSC status != SC0 or SC1 is NOP */ - break; - } - - /* Check TxDSC not release */ - if (norel_txdsc == FLAG_OFF) { - /* Check send data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Send data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Check SRAM data */ - if (dsc_p->dinfo.base.offset != DSC_OFFSET_NOTHING) { - /* Send SRAM data release */ - scf_dscp_sram_free(dsc_p->dinfo.base.offset); - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - } - - /* Change TxDSC status (SA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_IDLE); - - /* Check use local control TxDSC flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Update Tx descriptor offset */ - if (scf_dscp_comtbl.tx_get == scf_dscp_comtbl.tx_last) { - scf_dscp_comtbl.tx_get = - scf_dscp_comtbl.tx_first; - } else { - scf_dscp_comtbl.tx_get++; - } - - /* Update Tx descriptor count */ - scf_dscp_comtbl.tx_dsc_count--; - - /* Get Top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - /* Check main table */ - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* Check putmsg busy release */ - if ((mainp->putmsg_busy_flag == FLAG_ON) && - (scf_dscp_comtbl.tx_dsc_count < - scf_dscp_comtbl.txdsc_busycount)) { - /* putmsg busy flag OFF */ - mainp->putmsg_busy_flag = FLAG_OFF; - - /* TxREL_BUSY notice to main matrix */ - scf_dscp_txrelbusy_notice(mainp); - } - } - } else { - /* Initialize use local control TxDSC flag */ - scf_dscp_comtbl.tx_local_use_flag = FLAG_OFF; - - /* DSCP path change send flag OFF */ - scf_dscp_comtbl.dscp_path_flag = FLAG_OFF; - } - } - /* TxREQ send exec flag OFF */ - scf_dscp_comtbl.tx_exec_flag = FLAG_OFF; - - /* Check SCF path change flag */ - if (path_change == FLAG_OFF) { - /* Call send matrix */ - scf_dscp_send_matrix(); - } else { - /* SCF path change */ - scf_path_change(statep); - } - -/* - * END_dscp_txend_recv - */ - END_dscp_txend_recv: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rxreq_recv() - * - * Description: TxREQ reception notifies to a main control matrix. - * - */ -void -scf_dscp_rxreq_recv(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rxreq_recv() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* RxDSC address */ - uint16_t offset_low; /* Working value : offset */ - uint16_t offset_hight; /* Working value : offset */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check pending RxDSC */ - if (scf_dscp_comtbl.rx_dsc_count == 0) { - /* Get RxDSC address */ - dsc_p = &scf_dscp_comtbl.rx_dscp[scf_dscp_comtbl.rx_put]; - - /* Save RxDCR information in RxDSC */ - dsc_p->dinfo.base.c_flag = statep->reg_rxdcr_c_flag; - dsc_p->dinfo.base.offset = statep->reg_rxdcr_c_offset; - dsc_p->dinfo.base.length = statep->reg_rxdcr_c_length; - dsc_p->dinfo.bdsr.status = DSC_STATUS_NORMAL; - dsc_p->dinfo.base.dscp_datap = NULL; - - /* Update Rx descriptor offset */ - if (scf_dscp_comtbl.rx_put == scf_dscp_comtbl.rx_last) { - scf_dscp_comtbl.rx_put = scf_dscp_comtbl.rx_first; - } else { - scf_dscp_comtbl.rx_put++; - } - - /* Update Rx descriptor count */ - scf_dscp_comtbl.rx_dsc_count++; - - /* RxREQ receive exec flag ON */ - scf_dscp_comtbl.rx_exec_flag = FLAG_ON; - - /* Get main table address from "id" */ - mainp = scf_dscp_id2mainp(dsc_p->dinfo.bdcr.id); - - offset_low = (uint16_t)(scf_dscp_comtbl.txbuffsize * - scf_dscp_comtbl.txsram_maxcount / DSC_OFFSET_CONVERT); - - SCF_DBG_MAKE_LOOPBACK(offset_low); - - offset_hight = - (uint16_t)(offset_low + scf_dscp_comtbl.rxbuffsize * - scf_dscp_comtbl.rxsram_maxcount / DSC_OFFSET_CONVERT); - - /* Check mainp address and offset */ - if ((mainp != NULL) && - (((dsc_p->dinfo.base.offset >= offset_low) && - (dsc_p->dinfo.base.offset < offset_hight)) || - ((dsc_p->dinfo.base.offset == DSC_OFFSET_NOTHING) && - (dsc_p->dinfo.bdcr.code != DSC_CNTL_DATA_REQ)))) { - /* RxREQ notice to main matrix */ - scf_dscp_rxreq_notice(mainp); - } else { - /* Invalid "id" or "offset" */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - SCFDBGMSG(SCF_DBGFLAG_DSCP, "Invalid id or offset"); - - /* Set end status : Parameter error */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_E_PARAM; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - } - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * Main and Tx/Rx interface function - */ - -/* - * scf_dscp_txend_notice() - * - * Description: The TxEND reception is notified of by Tx matrix and handle it - * with data code. - * - */ -void -scf_dscp_txend_notice(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_txend_notice() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check local control data flag */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_local]; - } - - /* TxREQ code check */ - switch (dsc_p->dinfo.bdcr.code) { - case DSC_CNTL_INIT_REQ: /* INIT_REQ */ - /* Check main status */ - if (mainp->status == SCF_ST_EST_TXEND_RECV_WAIT) { - /* Main status (B0) */ - /* Check end status */ - if (dsc_p->dinfo.bdsr.status == DSC_STATUS_NORMAL) { - /* SCF_MB_CONN_OK event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_CONN_OK); - - /* Change main status (C0) */ - SCF_SET_STATUS(mainp, SCF_ST_ESTABLISHED); - } else { - /* Not normal end status */ - - /* SCF_MB_DISC_ERROR event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_DISC_ERROR); - - /* Change main status (C1) */ - SCF_SET_STATUS(mainp, SCF_ST_EST_FINI_WAIT); - } - } - break; - - case DSC_CNTL_FINI_REQ: /* FINI_REQ */ - /* Check main status */ - if (mainp->status == SCF_ST_CLOSE_TXEND_RECV_WAIT) { - /* Main status (D0) */ - /* Signal to fini() wait */ - mainp->fini_wait_flag = FLAG_OFF; - cv_signal(&mainp->fini_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &mainp->fini_cv, - sizeof (kcondvar_t)); - } - break; - - case DSC_CNTL_CONN_CHK: /* CONN_CHK */ - /* Check main status */ - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - /* CONN_CHK flag OFF */ - mainp->conn_chk_flag = FLAG_OFF; - /* Check end status */ - if (dsc_p->dinfo.bdsr.status != DSC_STATUS_NORMAL) { - /* SCF_MB_DISC_ERROR event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_DISC_ERROR); - - /* Change main status (C1) */ - SCF_SET_STATUS(mainp, SCF_ST_EST_FINI_WAIT); - } - break; - - default: - /* Main status != B0 or C0 is NOP */ - break; - } - break; - - case DSC_CNTL_DATA_REQ: /* DATA_REQ */ - /* Tx DATA_REQ ok counter up */ - mainp->memo_tx_data_req_ok_cnt++; - break; - - default: - /* Undefine TxREQ code is NOP */ - break; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_txrelbusy_notice() - * - * Description: Tx busy release is notified of by Tx matrix and perform event - * queue processing. - * - */ -void -scf_dscp_txrelbusy_notice(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_txrelbusy_notice() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check main status */ - if (mainp->status == SCF_ST_ESTABLISHED) { /* Main status (C0) */ - /* SCF_MB_SPACE event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_SPACE); - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rxreq_notice() - * - * Description: The RxREQ reception is notified of by Rx matrix and handle it - * with data code. - * - */ -void -scf_dscp_rxreq_notice(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rxreq_notice() " - scf_dscp_dsc_t *dsc_p; /* RxDSC address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get RxDSC address */ - dsc_p = &scf_dscp_comtbl.rx_dscp[scf_dscp_comtbl.rx_get]; - - /* RxREQ code check */ - switch (dsc_p->dinfo.bdcr.code) { - case DSC_CNTL_INIT_REQ: /* INIT_REQ */ - /* Set end status : Not support */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_E_NOT_SUPPORT; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - break; - - case DSC_CNTL_FINI_REQ: /* FINI_REQ */ - /* Check main status */ - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: /* Main status (B0) */ - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - /* SCF_MB_DISC_ERROR event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_DISC_ERROR); - - /* Change main status (C1) */ - SCF_SET_STATUS(mainp, SCF_ST_EST_FINI_WAIT); - break; - - default: - /* Main status != B0 or C0 is NOP */ - break; - } - - /* Set end status : Normal end */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_NORMAL; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - break; - - case DSC_CNTL_DATA_REQ: /* DATA_REQ */ - /* Rx DATA_REQ counter up */ - mainp->memo_rx_data_req_cnt++; - - /* Check receive data length */ - if (dsc_p->dinfo.base.length <= scf_dscp_comtbl.maxdatalen) { - /* Check receive data queue space */ - if (mainp->rd_count < mainp->rd_busycount) { - /* Set end status : Normal end */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_NORMAL; - - /* Check main status */ - if (mainp->status == SCF_ST_ESTABLISHED) { - /* Main status (C0) */ - /* Change RxDSC status (RB0) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_RX_ST_RXACK_SEND_WAIT); - } else { - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_RX_ST_RXEND_SEND_WAIT); - } - } else { - /* No space of receive data queue */ - - /* Set end status : Buffer busy */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_BUF_BUSY; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_RX_ST_RXEND_SEND_WAIT); - } - } else { - /* Invalid deta length */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.length, - sizeof (dsc_p->dinfo.base.length)); - - /* Set end status : Parameter error */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_E_PARAM; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - } - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - break; - - case DSC_CNTL_CONN_CHK: /* CONN_CHK */ - /* Check main status */ - if (mainp->status == SCF_ST_ESTABLISHED) { - /* Main status (C0) */ - /* Set end status : Normal end */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_NORMAL; - } else { - /* Set end status : Connection refusal */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_CONN_NAK; - } - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - break; - - default: - /* Invalid RxREQ code */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, &dsc_p->dinfo.base.c_flag, - TC_INFO_SIZE); - - /* Set end status : Parameter error */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_E_PARAM; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - - /* Call receive matrix */ - scf_dscp_recv_matrix(); - break; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rxdata_notice() - * - * Description: It is notified from a Rx control matrix, the received data are - * read from SRAM, - * and the notice of a receive data event is performed. - * - */ -void -scf_dscp_rxdata_notice(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rxdata_notice() " - scf_dscp_dsc_t *dsc_p; /* RxDSC address */ - scf_rdata_que_t *rdt_p; /* Receive data queue address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get RxDSC address */ - dsc_p = &scf_dscp_comtbl.rx_dscp[scf_dscp_comtbl.rx_get]; - - /* Check main status */ - switch (mainp->status) { - case SCF_ST_ESTABLISHED: /* Main status (C0) */ - case SCF_ST_EST_FINI_WAIT: /* Main status (C1) */ - /* Check receive data queue space */ - if (mainp->rd_count < mainp->rd_busycount) { - /* Receive data queing */ - rdt_p = &mainp->rd_datap[mainp->rd_put]; - rdt_p->rdatap = dsc_p->dinfo.base.dscp_datap; - dsc_p->dinfo.base.dscp_datap = NULL; - rdt_p->length = dsc_p->dinfo.base.length; - - /* Update receive data queue offset */ - if (mainp->rd_put == mainp->rd_last) { - mainp->rd_put = mainp->rd_first; - } else { - mainp->rd_put++; - } - - /* Update receive data queue count */ - mainp->rd_count++; - - /* SCF_MB_MSG_DATA event queuing */ - scf_dscp_event_queue(mainp, SCF_MB_MSG_DATA); - - /* Rx DATA_REQ ok counter up */ - mainp->memo_rx_data_req_ok_cnt++; - } else { - /* No space of receive data queue */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, &mainp->rd_count, - sizeof (mainp->rd_count)); - SCFDBGMSG(SCF_DBGFLAG_DSCP, - "No space of receive data queue"); - - /* Check receive data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Receive data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Set end status : Buffer busy */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_BUF_BUSY; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - } - break; - - case SCF_ST_CLOSE_TXEND_RECV_WAIT: /* Main status (D0) */ - /* Check receive data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Receive data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Set end status : Normal end */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_NORMAL; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - break; - - default: - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, &mainp->status, - TC_INFO_SIZE); - SCFDBGMSG(SCF_DBGFLAG_DSCP, "Sequence error"); - - /* Check receive data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Receive data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Set end status : Sequence error */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_E_SEQUENCE; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - break; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * Tx subroutine function - */ - -/* - * scf_dscp_send_matrix() - * - * Description: The Request to Send by a Tx descriptor state is performed. - * - */ -void -scf_dscp_send_matrix(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_send_matrix() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - scf_state_t *statep; /* Soft state pointer */ - uint8_t *wk_in_p; /* Working value : input address */ - uint8_t *wk_out_p; /* Working value : output address */ - /* Working value : next processing check flag */ - int next_send_req = FLAG_OFF; - int path_ret; /* SCF path status return value */ - int timer_ret; /* Timer check return value */ - int ii; /* Working value : counter */ - uint16_t tx_local = scf_dscp_comtbl.tx_local; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - SCF_DBG_MAKE_NO_DSCP_PATH(scf_dscp_comtbl.dscp_path_flag); - -/* - * SEND_MATRIX_START - */ - SEND_MATRIX_START: - - /* Check use local control TxDSC send */ - if ((scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) && - /* Check DSCP path change data send */ - (scf_dscp_comtbl.dscp_path_flag == FLAG_ON)) { - /* Set use local control TxDSC flag */ - scf_dscp_comtbl.tx_local_use_flag = FLAG_ON; - - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[tx_local]; - - /* Make Tx descriptor : DSCP_PATH */ - dsc_p->dinfo.base.c_flag = DSC_FLAG_DEFAULT; - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - dsc_p->dinfo.base.length = 0; - dsc_p->dinfo.base.dscp_datap = NULL; - dsc_p->dinfo.bdcr.id = DSC_CNTL_LOCAL; - dsc_p->dinfo.bdcr.code = DSC_CNTL_DSCP_PATH; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - } else if ((scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) && - (scf_dscp_comtbl.dscp_path_flag == FLAG_OFF)) { - /* Initialize use local control TxDSC flag */ - scf_dscp_comtbl.tx_local_use_flag = FLAG_OFF; - - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[scf_dscp_comtbl.tx_get]; - - /* Get top main table address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[0]; - for (ii = 0; ii < MBIF_MAX; ii++, mainp++) { - /* - * Check DSCP connect data send and not local - * control TxDSC send - */ - if ((mainp->conn_chk_flag == FLAG_OFF) || - (scf_dscp_comtbl.tx_local_use_flag == - FLAG_ON)) { - break; - } - /* Check main status */ - switch (mainp->status) { - case SCF_ST_EST_TXEND_RECV_WAIT: - /* Main status (B0) */ - case SCF_ST_ESTABLISHED: - /* Main status (C0) */ - /* - * Set use local control TxDSC flag - */ - scf_dscp_comtbl.tx_local_use_flag = FLAG_ON; - - /* - * Get local data TxDSC address - */ - dsc_p = &scf_dscp_comtbl.tx_dscp[tx_local]; - - /* - * Make Tx descriptor : CONN_CHK - */ - dsc_p->dinfo.base.c_flag = DSC_FLAG_DEFAULT; - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - dsc_p->dinfo.base.length = 0; - dsc_p->dinfo.base.dscp_datap = NULL; - dsc_p->dinfo.bdcr.id = mainp->id & 0x0f; - dsc_p->dinfo.bdcr.code = DSC_CNTL_CONN_CHK; - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXREQ_SEND_WAIT); - break; - - default: - /* - * Clear DSCP connect check flag - */ - mainp->conn_chk_flag = FLAG_OFF; - break; - } - } - } else { - /* Get local data TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[tx_local]; - } - - /* Check pending send TxDSC or local control TxDSC */ - if ((scf_dscp_comtbl.tx_dsc_count == 0) && - (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF)) { - goto END_dscp_send_matrix; - } - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - /* Check TxDSC status */ - switch (dsc_p->status) { - case SCF_TX_ST_IDLE: /* TxDSC status (SA0) */ - /* TxDSC status == SA0 is next processing */ - if (scf_dscp_comtbl.tx_local_use_flag == FLAG_OFF) { - /* Update Tx descriptor offset */ - if (scf_dscp_comtbl.tx_get == scf_dscp_comtbl.tx_last) { - scf_dscp_comtbl.tx_get = - scf_dscp_comtbl.tx_first; - } else { - scf_dscp_comtbl.tx_get++; - } - - /* Update Tx descriptor count */ - scf_dscp_comtbl.tx_dsc_count--; - } else { - /* Initialize use local control TxDSC flag */ - scf_dscp_comtbl.tx_local_use_flag = FLAG_OFF; - } - - /* Next processing flag ON */ - next_send_req = FLAG_ON; - break; - - case SCF_TX_ST_SRAM_TRANS_WAIT: /* TxDSC status (SB0) */ - /* Check SCF path status */ - if (path_ret != SCF_PATH_ONLINE) { - break; - } - /* Data copy to SRAM */ - ii = dsc_p->dinfo.base.offset * DSC_OFFSET_CONVERT; - wk_in_p = (uint8_t *)dsc_p->dinfo.base.dscp_datap; - wk_out_p = (uint8_t *)&statep->scf_dscp_sram->DATA[ii]; - for (ii = 0; ii < dsc_p->dinfo.base.length; - ii++, wk_in_p++, wk_out_p++) { - SCF_DDI_PUT8(statep, statep->scf_dscp_sram_handle, - wk_out_p, *wk_in_p); - } - - /* Change TxDSC status (SB2) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_TXREQ_SEND_WAIT); - - /* Next processing flag ON */ - next_send_req = FLAG_ON; - break; - - case SCF_TX_ST_TXREQ_SEND_WAIT: /* TxDSC status (SB2) */ - /* Get timer status */ - timer_ret = scf_timer_check(SCF_TIMERCD_DSCP_BUSY); - /* Check TxREQ busy timer exec */ - if (timer_ret == SCF_TIMER_EXEC) { - break; - } - /* Check SCF path status */ - if (path_ret != SCF_PATH_ONLINE) { - break; - } - /* Check TxREQ send exec */ - if (scf_dscp_comtbl.tx_exec_flag == FLAG_OFF) { - /* TxREQ send */ - scf_dscp_txreq_send(statep, dsc_p); - - /* Check send data length */ - if (dsc_p->dinfo.base.length != 0) { - /* TxACK timer start */ - scf_timer_start(SCF_TIMERCD_DSCP_ACK); - - /* - * Change TxDSC status (SC0) - */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXACK_RECV_WAIT); - } else { - /* TxEND timer start */ - scf_timer_start(SCF_TIMERCD_DSCP_END); - - /* - * Change TxDSC status (SC1) - */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_TX_ST_TXEND_RECV_WAIT); - } - } - break; - - default: - /* TxDSC status != SA0 or SB0 or SB2 is NOP */ - break; - } - - /* Check next send processing */ - if (next_send_req == FLAG_ON) { - next_send_req = FLAG_OFF; - goto SEND_MATRIX_START; - } - -/* - * END_dscp_send_matrix - */ - END_dscp_send_matrix: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_txreq_send() - * - * Description: TxREQ is transmitted by hard access. - * - */ -void -scf_dscp_txreq_send(scf_state_t *statep, scf_dscp_dsc_t *dsc_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_txreq_send() " - uint8_t *wk_in_p; /* Working value : input address */ - uint8_t *wk_out_p; /* Working value : output address */ - uint32_t wkleng; /* Working value : length */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Set control flag */ - dsc_p->dinfo.bdsr.status = 0; - dsc_p->dinfo.base.c_flag |= DSC_FLAG_DEFAULT; - - /* Write TxDCR register */ - statep->reg_txdcr_c_flag = dsc_p->dinfo.base.c_flag; - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->TxDCR_C_FLAG, statep->reg_txdcr_c_flag); - SC_DBG_DRV_TRACE(TC_W_TxDCR_C_FLAG, __LINE__, - &statep->reg_txdcr_c_flag, sizeof (statep->reg_txdcr_c_flag)); - - statep->reg_txdcr_c_offset = dsc_p->dinfo.base.offset; - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->TxDCR_OFFSET, statep->reg_txdcr_c_offset); - SC_DBG_DRV_TRACE(TC_W_TxDCR_OFFSET, __LINE__, - &statep->reg_txdcr_c_offset, - sizeof (statep->reg_txdcr_c_offset)); - - statep->reg_txdcr_c_length = dsc_p->dinfo.base.length; - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->TxDCR_LENGTH, statep->reg_txdcr_c_length); - SC_DBG_DRV_TRACE(TC_W_TxDCR_LENGTH, __LINE__, - &statep->reg_txdcr_c_length, - sizeof (statep->reg_txdcr_c_length)); - - /* Write DCR register : TxREQ interrupt */ - statep->reg_dcr = DCR_TxREQ; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DCR, statep->reg_dcr); - SC_DBG_DRV_TRACE(TC_W_DCR, __LINE__, &statep->reg_dcr, - sizeof (statep->reg_dcr)); - - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DCR); - - SC_DBG_DRV_TRACE(TC_TxREQ, __LINE__, &statep->reg_txdcr_c_flag, 8); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "DCR = 0x%02x", statep->reg_dcr); - SCFDBGMSG3(SCF_DBGFLAG_REG, "TxDCR = 0x%04x 0x%04x 0x%08x", - statep->reg_txdcr_c_flag, statep->reg_txdcr_c_offset, - statep->reg_txdcr_c_length); - - /* TxREQ send exec flag ON */ - scf_dscp_comtbl.tx_exec_flag = FLAG_ON; - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_TXREQ); - if (dsc_p->dinfo.base.length != 0) { - wk_in_p = (uint8_t *)dsc_p->dinfo.base.dscp_datap; - wk_out_p = (uint8_t *)&statep->memo_scf_drvtrc.INFO[0]; - if (dsc_p->dinfo.base.length > - sizeof (statep->memo_scf_drvtrc.INFO)) { - wkleng = sizeof (statep->memo_scf_drvtrc.INFO); - } else { - wkleng = dsc_p->dinfo.base.length; - } - bcopy(wk_in_p, wk_out_p, wkleng); - SCF_SRAM_TRACE(statep, DTC_DSCP_SENDDATA); - } - - SCF_DBG_TEST_TXREQ_SEND(statep, dsc_p); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * Rx subroutine function - */ - -/* - * scf_dscp_recv_matrix() - * - * Description: TxREQ received performs the corresponding response request. - * - */ -void -scf_dscp_recv_matrix(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_recv_matrix() " - scf_dscp_main_t *mainp; /* Main table address */ - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - scf_state_t *statep; /* Soft state pointer */ - caddr_t wkaddr; /* Working value : buffer address */ - uint8_t *wk_in_p; /* Working value : input address */ - uint8_t *wk_out_p; /* Working value : output address */ - uint32_t wkleng; /* Working value : length */ - uint32_t info_size; - /* Working value : next receive processing check flag */ - int next_resp_req = FLAG_OFF; - int path_ret; /* SCF path status return value */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - -/* - * RECV_MATRIX_START - */ - RECV_MATRIX_START: - - /* Check pending RxDSC */ - if (scf_dscp_comtbl.rx_dsc_count == 0) { - goto END_dscp_recv_matrix; - } - - /* Get RxDSC address */ - dsc_p = &scf_dscp_comtbl.rx_dscp[scf_dscp_comtbl.rx_get]; - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - - /* Check RxDSC status */ - switch (dsc_p->status) { - case SCF_RX_ST_RXACK_SEND_WAIT: /* RxDSC status (RB0) */ - /* Check SCF path status */ - if (path_ret != SCF_PATH_ONLINE) { - break; - } - /* Check receive data length */ - if (dsc_p->dinfo.base.length != 0) { - /* Rx buffer allocation */ - wkaddr = (caddr_t)kmem_zalloc(dsc_p->dinfo.base.length, - KM_NOSLEEP); - - /* Set Rx buffer address */ - dsc_p->dinfo.base.dscp_datap = wkaddr; - - /* RxACK send */ - scf_dscp_rxack_send(statep); - - /* Change RxDSC status (RB1) */ - SCF_SET_DSC_STATUS(dsc_p, - SCF_RX_ST_SRAM_TRANS_WAIT); - } else { - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - break; - } - /* Next receive processing flag ON */ - next_resp_req = FLAG_ON; - - break; - - case SCF_RX_ST_SRAM_TRANS_WAIT: /* RxDSC status (RB1) */ - /* Check SCF path status */ - if (path_ret != SCF_PATH_ONLINE) { - break; - } - /* Get main table address from "id" */ - mainp = scf_dscp_id2mainp(dsc_p->dinfo.bdcr.id); - - /* Check mainp address */ - if (mainp != NULL) { - /* Data copy from SRAM */ - ii = dsc_p->dinfo.base.offset * DSC_OFFSET_CONVERT; - wk_in_p = &statep->scf_dscp_sram->DATA[ii]; - wk_out_p = (uint8_t *)dsc_p->dinfo.base.dscp_datap; - for (ii = 0; ii < dsc_p->dinfo.base.length; ii++, - wk_in_p++, wk_out_p++) { - *wk_out_p = SCF_DDI_GET8(statep, - statep->scf_dscp_sram_handle, wk_in_p); - } - - /* Set end status : Normal end */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_NORMAL; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - - /* STAM trace */ - info_size = sizeof (statep->memo_scf_drvtrc.INFO); - if (dsc_p->dinfo.base.length != 0) { - wk_in_p = - (uint8_t *)dsc_p->dinfo.base.dscp_datap; - wk_out_p = &statep->memo_scf_drvtrc.INFO[0]; - if (dsc_p->dinfo.base.length > info_size) { - wkleng = info_size; - } else { - wkleng = dsc_p->dinfo.base.length; - } - bcopy(wk_in_p, wk_out_p, wkleng); - SCF_SRAM_TRACE(statep, DTC_DSCP_RECVDATA); - } - - /* Receive data notice to main matrix */ - scf_dscp_rxdata_notice(mainp); - } else { - /* Invalid "id" */ - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, - &dsc_p->dinfo.base.c_flag, TC_INFO_SIZE); - SCFDBGMSG(SCF_DBGFLAG_DSCP, "Invalid id"); - - /* Set end status : Parameter error */ - dsc_p->dinfo.bdsr.status = DSC_STATUS_E_PARAM; - - /* Change RxDSC status (RB3) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_RXEND_SEND_WAIT); - } - - /* Next receive processing flag ON */ - next_resp_req = FLAG_ON; - break; - - case SCF_RX_ST_RXEND_SEND_WAIT: /* RxDSC status (RB3) */ - /* Is SCF path online? */ - if (path_ret != SCF_PATH_ONLINE) { - break; - } - /* RxEND send */ - scf_dscp_rxend_send(statep, dsc_p); - - /* Change RxDSC status (RA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_IDLE); - - /* Update Rx descriptor offset */ - if (scf_dscp_comtbl.rx_get == scf_dscp_comtbl.rx_last) { - scf_dscp_comtbl.rx_get = scf_dscp_comtbl.rx_first; - } else { - scf_dscp_comtbl.rx_get++; - } - - /* Update Rx descriptor count */ - scf_dscp_comtbl.rx_dsc_count--; - - /* RxREQ receive exec flag OFF */ - scf_dscp_comtbl.rx_exec_flag = FLAG_OFF; - break; - - default: - /* RxDSC status == RA0 is NOP */ - break; - } - - /* Check next receive processing */ - if (next_resp_req == FLAG_ON) { - next_resp_req = FLAG_OFF; - goto RECV_MATRIX_START; - } - -/* - * END_dscp_recv_matrix - */ - END_dscp_recv_matrix: - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rxack_send() - * - * Description: RxACK is transmitted by hard access. - * - */ -void -scf_dscp_rxack_send(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rxack_send() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Write DCR register : RxACK interrupt */ - statep->reg_dcr = DCR_RxACK; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DCR, statep->reg_dcr); - SC_DBG_DRV_TRACE(TC_W_DCR, __LINE__, &statep->reg_dcr, - sizeof (statep->reg_dcr)); - - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DCR); - - SC_DBG_DRV_TRACE(TC_RxACK, __LINE__, NULL, 0); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "DCR = 0x%02x", statep->reg_dcr); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_RXACK); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rxend_send() - * - * Description: RxEND is transmitted by hard access. - * - */ -void -scf_dscp_rxend_send(scf_state_t *statep, scf_dscp_dsc_t *dsc_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rxend_send() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Write RxDSR register */ - statep->reg_rxdsr_c_flag = dsc_p->dinfo.base.c_flag; - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->RxDSR_C_FLAG, statep->reg_rxdsr_c_flag); - SC_DBG_DRV_TRACE(TC_W_RxDSR_C_FLAG, __LINE__, &statep->reg_rxdsr_c_flag, - sizeof (statep->reg_rxdsr_c_flag)); - - statep->reg_rxdsr_c_offset = dsc_p->dinfo.base.offset; - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->RxDSR_OFFSET, statep->reg_rxdsr_c_offset); - SC_DBG_DRV_TRACE(TC_W_RxDSR_OFFSET, __LINE__, - &statep->reg_rxdsr_c_offset, - sizeof (statep->reg_rxdsr_c_offset)); - - /* Write DCR register : RxEND interrupt */ - statep->reg_dcr = DCR_RxEND; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DCR, statep->reg_dcr); - SC_DBG_DRV_TRACE(TC_W_DCR, __LINE__, &statep->reg_dcr, - sizeof (statep->reg_dcr)); - - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DCR); - - SC_DBG_DRV_TRACE(TC_RxEND, __LINE__, &statep->reg_rxdsr_c_flag, 4); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "DCR = 0x%02x", statep->reg_dcr); - SCFDBGMSG2(SCF_DBGFLAG_REG, "RxDSR = 0x%04x 0x%04x", - statep->reg_rxdsr_c_flag, statep->reg_rxdsr_c_offset); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_DSCP_RXEND); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * subroutine function - */ - -/* - * scf_dscp_dscbuff_free_all() - * - * Description: All descripter buffer release processing. - * - */ -void -scf_dscp_dscbuff_free_all(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_dscbuff_free_all() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get TxDSC address */ - dsc_p = scf_dscp_comtbl.tx_dscp; - - if (dsc_p != NULL) { - /* Check TxDSC */ - for (ii = 0; ii < scf_dscp_comtbl.txdsc_maxcount; ii++, - dsc_p++) { - /* Check TxDSC status */ - if (dsc_p->status == SCF_TX_ST_IDLE) { - continue; - } - /* TxDSC status not (SA0) */ - /* Check send data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Send data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Check SRAM data */ - if (dsc_p->dinfo.base.offset != DSC_OFFSET_NOTHING) { - /* Send SRAM data release */ - scf_dscp_sram_free(dsc_p->dinfo.base.offset); - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - } - - /* Change TxDSC status (SA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_IDLE); - } - - /* Tx flag initialization */ - scf_dscp_comtbl.tx_exec_flag = FLAG_OFF; - scf_dscp_comtbl.dscp_path_flag = FLAG_OFF; - scf_dscp_comtbl.tx_local_use_flag = FLAG_OFF; - - /* TxDSC counter/offset initialization */ - scf_dscp_comtbl.tx_get = scf_dscp_comtbl.tx_put; - scf_dscp_comtbl.tx_dsc_count = 0; - - /* Tx re-try counter initialization */ - scf_dscp_comtbl.tx_ackto_retry_cnt = 0; - scf_dscp_comtbl.tx_endto_retry_cnt = 0; - - scf_dscp_comtbl.tx_busy_retry_cnt = 0; - scf_dscp_comtbl.tx_interface_retry_cnt = 0; - scf_dscp_comtbl.tx_nak_retry_cnt = 0; - scf_dscp_comtbl.tx_notsuop_retry_cnt = 0; - scf_dscp_comtbl.tx_prmerr_retry_cnt = 0; - scf_dscp_comtbl.tx_seqerr_retry_cnt = 0; - scf_dscp_comtbl.tx_other_retry_cnt = 0; - scf_dscp_comtbl.tx_send_retry_cnt = 0; - } - - /* Get RxDSC address */ - dsc_p = scf_dscp_comtbl.rx_dscp; - - if (dsc_p != NULL) { - /* Check RxDSC */ - for (ii = 0; ii < scf_dscp_comtbl.rxdsc_maxcount; ii++, - dsc_p++) { - /* Check RxDSC status */ - if (dsc_p->status == SCF_RX_ST_IDLE) { - continue; - } - /* RxDSC status not (RA0) */ - /* Check receive data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Receive data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Change RxDSC status (RA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_IDLE); - } - - /* Rx flag initialization */ - scf_dscp_comtbl.rx_exec_flag = FLAG_OFF; - - /* RxDSC counter/offset initialization */ - scf_dscp_comtbl.rx_get = scf_dscp_comtbl.rx_put; - scf_dscp_comtbl.rx_dsc_count = 0; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_txdscbuff_free() - * - * Description: Tx descripter buffer release processing. - * - */ -void -scf_dscp_txdscbuff_free(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_txdscbuff_free() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - uint16_t wkget; /* Working value : get offset */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get TxDSC offser */ - wkget = scf_dscp_comtbl.tx_get; - - /* Check TxDSC */ - for (ii = 0; ii < scf_dscp_comtbl.tx_dsc_count; ii++) { - /* Get TxDSC address */ - dsc_p = &scf_dscp_comtbl.tx_dscp[wkget]; - - /* Update Tx descriptor offset */ - if (wkget == scf_dscp_comtbl.tx_last) { - wkget = scf_dscp_comtbl.tx_first; - } else { - wkget++; - } - - /* Check main use data */ - if (mainp->id != dsc_p->dinfo.bdcr.id) { - continue; - } - /* Check TxDSC status */ - switch (dsc_p->status) { - case SCF_TX_ST_SRAM_TRANS_WAIT: - /* TxDSC status not (SB0) */ - case SCF_TX_ST_TXREQ_SEND_WAIT: - /* TxDSC status not (SB2) */ - /* Check send data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Send data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Check SRAM data */ - if (dsc_p->dinfo.base.offset != DSC_OFFSET_NOTHING) { - /* Send SRAM data release */ - scf_dscp_sram_free(dsc_p->dinfo.base.offset); - dsc_p->dinfo.base.offset = DSC_OFFSET_NOTHING; - } - - /* Change TxDSC status (SA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_TX_ST_IDLE); - break; - - default: - /* TxDSC status != SB0 or SB2 is NOP */ - break; - } - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rxdscbuff_free() - * - * Description: Rx descripter buffer release processing. - * - */ -void -scf_dscp_rxdscbuff_free(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rxdscbuff_free() " - scf_dscp_dsc_t *dsc_p; /* TxDSC address */ - uint16_t wkget; /* Working value : get offset */ - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Get RxDSC offser */ - wkget = scf_dscp_comtbl.rx_get; - - /* Check RxDSC */ - for (ii = 0; ii < scf_dscp_comtbl.rx_dsc_count; ii++) { - /* Get RxDSC address */ - dsc_p = &scf_dscp_comtbl.rx_dscp[wkget]; - - /* Update Rx descriptor offset */ - if (wkget == scf_dscp_comtbl.rx_last) { - wkget = scf_dscp_comtbl.rx_first; - } else { - wkget++; - } - - /* Check main use data */ - if (mainp->id != dsc_p->dinfo.bdcr.id) { - continue; - } - /* Check RxDSC status */ - if (dsc_p->status != SCF_RX_ST_IDLE) { - /* TxDSC status not (RA0) */ - /* Check receive data */ - if (dsc_p->dinfo.base.dscp_datap != NULL) { - /* Receive data release */ - kmem_free(dsc_p->dinfo.base.dscp_datap, - dsc_p->dinfo.base.length); - dsc_p->dinfo.base.dscp_datap = NULL; - } - - /* Change RxDSC status (RA0) */ - SCF_SET_DSC_STATUS(dsc_p, SCF_RX_ST_IDLE); - - /* Rx flag initialization */ - scf_dscp_comtbl.rx_exec_flag = FLAG_OFF; - - /* RxDSC counter/offset initialization */ - scf_dscp_comtbl.rx_get = scf_dscp_comtbl.rx_put; - scf_dscp_comtbl.rx_dsc_count = 0; - break; - } - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_rdata_free() - * - * Description: All receive data buffer release processing. - * - */ -void -scf_dscp_rdata_free(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_rdata_free() " - /* Current receive data queue address */ - scf_rdata_que_t *rdt_p; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - while (mainp->rd_count != 0) { - /* Get receive data queue address */ - rdt_p = &mainp->rd_datap[mainp->rd_get]; - - /* Check receive data buffer */ - if (rdt_p->rdatap != NULL) { - /* Receve data release */ - kmem_free(rdt_p->rdatap, rdt_p->length); - rdt_p->rdatap = NULL; - } - - /* Update receive data queue */ - if (mainp->rd_get == mainp->rd_last) { - mainp->rd_get = mainp->rd_first; - } else { - mainp->rd_get++; - } - - /* Update receive data queue count */ - mainp->rd_count--; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_event_queue() - * - * Description: Event queueing processing. - * - */ -void -scf_dscp_event_queue(scf_dscp_main_t *mainp, scf_event_t mevent) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_event_queue() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check DISC ERROR event */ - if (mevent == SCF_MB_DISC_ERROR) { - /* INIT_REQ retry timer stop */ - scf_timer_stop(mainp->timer_code); - - /* TxDSC buffer release */ - scf_dscp_txdscbuff_free(mainp); - - /* RxDSC buffer release */ - scf_dscp_rxdscbuff_free(mainp); - - /* All queing event release */ - scf_dscp_event_queue_free(mainp); - - /* All receive buffer release */ - scf_dscp_rdata_free(mainp); - } - - /* Event queing */ - mainp->ev_quep[mainp->ev_put].mevent = mevent; - - /* Update event queue offset */ - if (mainp->ev_put == mainp->ev_last) { - mainp->ev_put = mainp->ev_first; - } else { - mainp->ev_put++; - } - - /* Update event queue count */ - mainp->ev_count++; - - /* Soft interrupt : call scf_dscp_callback() */ - if (mutex_tryenter(&scf_comtbl.si_mutex) != 0) { - scf_comtbl.scf_softintr_dscp_kicked = FLAG_ON; - ddi_trigger_softintr(scf_comtbl.scf_softintr_id); - mutex_exit(&scf_comtbl.si_mutex); - } - - /* Callback timer start */ - scf_timer_start(SCF_TIMERCD_DSCP_CALLBACK); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_event_queue_free() - * - * Description: Event queue release processing. - * - */ -void -scf_dscp_event_queue_free(scf_dscp_main_t *mainp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_event_queue_free() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* All queing event release */ - mainp->ev_get = mainp->ev_put; - mainp->ev_count = 0; - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_dscp_mkey2mainp() - * - * Description: Get MAIN control table address processing by mkey. - * - */ -scf_dscp_main_t * -scf_dscp_mkey2mainp(mkey_t mkey) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_mkey2mainp() " - /* Return value : Main table address */ - scf_dscp_main_t *mainp = NULL; - int ii; /* Working value : counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - for (ii = 0; ii < MBIF_MAX; ii++) { - /* Check "mkey" at search table */ - if (mkey == scf_dscp_mkey_search[ii]) { - /* Set mainp address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[ii]; - break; - } - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); - return (mainp); -} - - -/* - * scf_dscp_id2mainp() - * - * Description: Get MAIN control table address processing by id. - * - */ -scf_dscp_main_t * -scf_dscp_id2mainp(uint8_t id) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_id2mainp() " - /* Return value : Main table address */ - scf_dscp_main_t *mainp = NULL; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check "id" */ - if (id < MBIF_MAX) { - /* Set mainp address */ - mainp = &scf_dscp_comtbl.scf_dscp_main[id]; - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); - return (mainp); -} - - -/* - * scf_dscp_sram_get() - * - * Description: Tx SRAM alloc processing. - * - */ -uint16_t -scf_dscp_sram_get(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_sram_get() " - scf_tx_sram_t *sram_p; /* Tx SRAM table address */ - int ii; /* Working value : counter */ - /* Return value : Tx SRAM offset */ - uint16_t offset = TX_SRAM_GET_ERROR; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - /* Check Tx SRAM space */ - if (scf_dscp_comtbl.tx_sram_count >= - scf_dscp_comtbl.txsram_maxcount) { - goto END_dscp_sram_get; - } - - /* Check all Tx SRAM table */ - for (ii = 0; ii < scf_dscp_comtbl.txsram_maxcount; ii++) { - /* Get Tx SRAM table address */ - sram_p = &scf_dscp_comtbl.tx_sramp[scf_dscp_comtbl.tx_sram_put]; - - /* Update Tx SRAM offset */ - if (scf_dscp_comtbl.tx_sram_put == - scf_dscp_comtbl.tx_sram_last) { - scf_dscp_comtbl.tx_sram_put = - scf_dscp_comtbl.tx_sram_first; - } else { - scf_dscp_comtbl.tx_sram_put++; - } - - /* Check Tx SRAM use */ - if (sram_p->use_flag == FLAG_OFF) { - /* Tx SRAM use flag ON */ - sram_p->use_flag = FLAG_ON; - - /* Get Tx SRAM offset */ - offset = sram_p->offset; - - /* Update Tx SRAM count */ - scf_dscp_comtbl.tx_sram_count++; - break; - } - } - -/* - * END_dscp_sram_get - */ - END_dscp_sram_get: - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end offset = 0x%04x", - offset); - return (offset); -} - - -/* - * scf_dscp_sram_free() - * - * Description: Tx SRAM release processing - * - */ -void -scf_dscp_sram_free(uint16_t offset) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_dscp_sram_free() " - scf_tx_sram_t *sram_p; /* Tx SRAM table address */ - uint16_t wkget; /* Working value : get offset */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start offset = 0x%04x", - offset); - - /* "offset" to Tx SRAM get offset */ - wkget = (uint16_t)(offset - / (scf_dscp_comtbl.txbuffsize / DSC_OFFSET_CONVERT)); - - /* Check Tx SRAM get offset */ - if (wkget < scf_dscp_comtbl.txsram_maxcount) { - /* Get Tx SRAM table address */ - sram_p = &scf_dscp_comtbl.tx_sramp[wkget]; - - /* Check "offset" */ - if (offset == sram_p->offset) { - /* Tx SRAM use flag OFF */ - sram_p->use_flag = FLAG_OFF; - - /* Update Tx SRAM count */ - scf_dscp_comtbl.tx_sram_count--; - } - } - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfhandler.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3548 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/ksynch.h> -#include <sys/types.h> -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> - -/* - * Function list - */ -uint_t scf_intr(caddr_t arg); -int scf_intr_cmdcmp(scf_state_t *statep); -void scf_intr_cmdcmp_driver(scf_state_t *statep, struct scf_cmd *scfcmdp); -int scf_intr_dsens(struct scf_cmd *scfcmdp, scf_int_reason_t *int_rp, - int len); -void scf_status_change(scf_state_t *statep); -void scf_next_cmd_check(scf_state_t *statep); -void scf_next_rxdata_get(void); -void scf_online_wait_tout(void); -void scf_cmdbusy_tout(void); -void scf_cmdend_tout(void); -void scf_report_send_wait_tout(void); -void scf_alivecheck_intr(scf_state_t *statep); -void scf_path_change(scf_state_t *statep); -void scf_halt(uint_t mode); -void scf_panic_callb(int code); -void scf_shutdown_callb(int code); -uint_t scf_softintr(caddr_t arg); -void scf_cmdwait_status_set(void); - -/* - * External function - */ -extern void scf_dscp_start(uint32_t factor); -extern void scf_dscp_stop(uint32_t factor); -extern void scf_dscp_intr(scf_state_t *state); -extern void scf_dscp_callback(void); - -extern void do_shutdown(void); - - -/* - * scf_intr() - * - * Description: Interrupt handler entry processing. - * - */ -uint_t -scf_intr(caddr_t arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_intr() " - scf_state_t *statep = (void *)arg; - int path_change = 0; - uint_t ret = DDI_INTR_CLAIMED; - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - SC_DBG_DRV_TRACE(TC_INTR|TC_IN, __LINE__, &arg, sizeof (caddr_t)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Path status check */ - if (scf_check_state(statep) == PATH_STAT_EMPTY) { - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - goto END_intr; - } - - /* PANIC exec status */ - if (scf_panic_exec_flag) { - /* SCF interrupt disable(CR) */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, CONTROL_DISABLE); - /* Register read sync */ - scf_rs16 = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - /* SCF Status register interrupt(STR) : clear */ - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - /* SCF Status extended register(STExR) : interrupt clear */ - SCF_P_DDI_PUT32(statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, 0xffffffff); - - /* DSCP buffer status register(DSR) : interrupt clear */ - SCF_P_DDI_PUT8(statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - - /* SCF interrupt status register(ISR) : interrupt clear */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, - (INT_ST_PATHCHGIE | CONTROL_ALIVEINE)); - scf_rs16 = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - goto END_intr; - } - - /* Check hard error after or interrupt disable status */ - if ((statep->scf_herr & HERR_EXEC) || - (!(statep->resource_flag & S_DID_REGENB))) { - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - - /* Interrupt disable */ - scf_forbid_intr(statep); - - /* SCF Status register interrupt(STR) : clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - /* SCF Status extended register(STExR) : interrupt clear */ - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, 0xffffffff); - - /* DSCP buffer status register(DSR) : interrupt clear */ - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - - /* SCF interrupt status register(ISR) : interrupt clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, - (INT_ST_PATHCHGIE | CONTROL_ALIVEINE)); - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - goto END_intr; - } - - /* Get SCF interrupt register */ - statep->reg_int_st = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - SC_DBG_DRV_TRACE(TC_R_INT_ST, __LINE__, &statep->reg_int_st, - sizeof (statep->reg_int_st)); - - /* SCF interrupt register interrupt clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, statep->reg_int_st); - SC_DBG_DRV_TRACE(TC_W_INT_ST, __LINE__, &statep->reg_int_st, - sizeof (statep->reg_int_st)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - - SCF_DBG_TEST_INTR(statep); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "ISR = 0x%04x", statep->reg_int_st); - - /* Get SCF status register */ - statep->reg_status = SCF_DDI_GET16(statep, - statep->scf_regs_handle, &statep->scf_regs->STATUS); - SC_DBG_DRV_TRACE(TC_R_STATUS, __LINE__, &statep->reg_status, - sizeof (statep->reg_status)); - - /* Get SCF status extended register */ - statep->reg_status_exr = SCF_DDI_GET32(statep, - statep->scf_regs_handle, &statep->scf_regs->STATUS_ExR); - SC_DBG_DRV_TRACE(TC_R_STATUS_ExR, __LINE__, &statep->reg_status_exr, - sizeof (statep->reg_status_exr)); - - /* Get SCF command register */ - statep->reg_command = SCF_DDI_GET16(statep, - statep->scf_regs_handle, &statep->scf_regs->COMMAND); - SC_DBG_DRV_TRACE(TC_R_COMMAND, __LINE__, &statep->reg_command, - sizeof (statep->reg_command)); - - /* Get SCF command extended register */ - statep->reg_command_exr = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND_ExR); - SC_DBG_DRV_TRACE(TC_R_COMMAND_ExR, __LINE__, &statep->reg_command_exr, - sizeof (statep->reg_command_exr)); - - SCF_DBG_TEST_INTR_SCFINT(statep); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_INT); - - /* Check SCF path change interrupt */ - if (statep->reg_int_st & CONTROL_PATHCHGIE) { - /* Check interrupt SCF path */ - if ((statep != scf_comtbl.scf_exec_p) && - (statep != scf_comtbl.scf_path_p)) { - path_change = 1; - goto END_intr; - } - } - - /* Check Alive Interrupt */ - if (statep->reg_int_st & INT_ST_ALIVEINT) { - /* Check interrupt SCF path */ - if ((statep == scf_comtbl.scf_exec_p) || - (statep == scf_comtbl.scf_path_p)) { - /* Alive check interrupt */ - scf_alivecheck_intr(statep); - } else { - /* not active SCF path */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr ", 8); - /* Alive interrupt disable */ - scf_alivecheck_stop(statep); - } - } - - /* Check SCF interrupt */ - if (statep->reg_int_st & INT_ST_SCFINT) { - SC_DBG_DRV_TRACE(TC_RSTS, __LINE__, &statep->reg_command, - TC_INFO_SIZE); - - SCFDBGMSG2(SCF_DBGFLAG_REG, "STR = 0x%04x STExR = 0x%08x", - statep->reg_status, statep->reg_status_exr); - - /* Check active SCF path */ - if ((statep == scf_comtbl.scf_exec_p) || - (statep == scf_comtbl.scf_path_p)) { - - /* Mode changed bit valid */ - if ((statep->reg_status & STATUS_MODE_CHANGED) || - (statep->reg_status & STATUS_CMD_COMPLETE)) { - /* Check secure mode status */ - if ((statep->reg_status & STATUS_SECURE_MODE) == - STATUS_MODE_LOCK) { - /* Mode status LOCK */ - scf_dm_secure_mode = SCF_STAT_MODE_LOCK; - if (((scf_comtbl.scf_mode_sw & - STATUS_SECURE_MODE) != - STATUS_MODE_LOCK) && - (scf_comtbl.alive_running == - SCF_ALIVE_START)) { - /* Alive check start */ - scf_comtbl.scf_alive_event_sub = - EVENT_SUB_ALST_WAIT; - } - } else { - scf_dm_secure_mode = - SCF_STAT_MODE_UNLOCK; - } - scf_comtbl.scf_mode_sw = - (statep->reg_status & - (STATUS_BOOT_MODE | - STATUS_SECURE_MODE)); - } - - /* Check command complete */ - if ((scf_comtbl.scf_cmd_exec_flag) && - (statep->reg_status & STATUS_CMD_COMPLETE)) { - /* SCF command complete processing */ - path_change = scf_intr_cmdcmp(statep); - if (path_change) { - goto END_intr; - } - } - } else { - /* SCF Status register interrupt clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS, statep->reg_status); - SC_DBG_DRV_TRACE(TC_W_STATUS, __LINE__, - &statep->reg_status, - sizeof (statep->reg_status)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->STATUS); - - /* SCF Status extended register interrupt clear */ - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, - statep->reg_status_exr); - SC_DBG_DRV_TRACE(TC_W_STATUS_ExR, __LINE__, - &statep->reg_status_exr, - sizeof (statep->reg_status_exr)); - /* Register read sync */ - scf_rs32 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR); - goto END_intr; - } - - /* Check SCF status change */ - if (statep->reg_status_exr & STATUS_SCF_STATUS_CHANGE) { - /* SCF status change processing */ - scf_status_change(statep); - } - - /* SCF Status register interrupt clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS, statep->reg_status); - SC_DBG_DRV_TRACE(TC_W_STATUS, __LINE__, &statep->reg_status, - sizeof (statep->reg_status)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS); - - /* SCF Status extended register interrupt clear */ - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, statep->reg_status_exr); - SC_DBG_DRV_TRACE(TC_W_STATUS_ExR, __LINE__, - &statep->reg_status_exr, - sizeof (statep->reg_status_exr)); - /* Register read sync */ - scf_rs32 = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR); - - /* SHUTDOWN/POFF/EVENT/ALIVE save */ - if (statep->reg_status & - (STATUS_SHUTDOWN | STATUS_POFF | STATUS_EVENT)) { - scf_comtbl.scf_event_flag |= (statep->reg_status & - (STATUS_SHUTDOWN | STATUS_POFF | STATUS_EVENT)); - } - - /* POWER_FAILURE save */ - if (statep->reg_status_exr & STATUS_POWER_FAILURE) { - scf_comtbl.scf_event_flag |= STATUS_SHUTDOWN; - } - - /* Check next receive data timer exec */ - if (scf_timer_check(SCF_TIMERCD_NEXTRECV) == - SCF_TIMER_NOT_EXEC) { - /* Next command send check */ - scf_next_cmd_check(statep); - } - } - - /* Check next command send */ - if ((scf_comtbl.scf_cmd_exec_flag == 0) && - (scf_comtbl.cmd_busy_wait != 0)) { - scf_comtbl.cmd_busy_wait = 0; - /* Signal to command wait */ - cv_signal(&scf_comtbl.cmdwait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmdwait_cv, - sizeof (kcondvar_t)); - } - - /* Check DSCP Communication Buffer Interrupt */ - if (statep->reg_int_st & INT_ST_IDBCINT) { - /* Check interrupt SCF path */ - if ((statep == scf_comtbl.scf_exec_p) || - (statep == scf_comtbl.scf_path_p)) { - scf_dscp_intr(statep); - } else { - /* not active SCF path */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr ", 8); - /* DSCP buffer status register interrupt clear */ - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR); - } - } - - if ((statep->reg_int_st & INT_ST_ALL) == 0) { - /* Unclamed counter up */ - scf_comtbl.scf_unclamed_cnt++; - - /* Get control register */ - statep->reg_control = SCF_DDI_GET16(statep, - statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - SC_DBG_DRV_TRACE(TC_R_CONTROL, __LINE__, &statep->reg_control, - sizeof (statep->reg_control)); - scf_comtbl.scf_unclamed.CONTROL = statep->reg_control; - - scf_comtbl.scf_unclamed.INT_ST = statep->reg_int_st; - - /* Get SCF command register */ - statep->reg_command = SCF_DDI_GET16(statep, - statep->scf_regs_handle, &statep->scf_regs->COMMAND); - SC_DBG_DRV_TRACE(TC_R_COMMAND, __LINE__, &statep->reg_command, - sizeof (statep->reg_command)); - scf_comtbl.scf_unclamed.COMMAND = statep->reg_command; - - /* Get SCF status register */ - statep->reg_status = SCF_DDI_GET16(statep, - statep->scf_regs_handle, &statep->scf_regs->STATUS); - SC_DBG_DRV_TRACE(TC_R_STATUS, __LINE__, &statep->reg_status, - sizeof (statep->reg_status)); - scf_comtbl.scf_unclamed.STATUS = statep->reg_status; - - /* Get SCF status extended register */ - statep->reg_status_exr = SCF_DDI_GET32(statep, - statep->scf_regs_handle, &statep->scf_regs->STATUS_ExR); - SC_DBG_DRV_TRACE(TC_R_STATUS_ExR, __LINE__, - &statep->reg_status_exr, - sizeof (statep->reg_status_exr)); - scf_comtbl.scf_unclamed.STATUS_ExR = statep->reg_status_exr; - - /* Get DSR register */ - statep->reg_dsr = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR); - SC_DBG_DRV_TRACE(TC_R_DSR, __LINE__, &statep->reg_dsr, - sizeof (statep->reg_dsr)); - scf_comtbl.scf_unclamed.DSR = statep->reg_dsr; - } - -/* - * END_intr - */ - END_intr: - - /* Check SCF path change */ - if (path_change) { - scf_path_change(statep); - } - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_INTR|TC_OUT, __LINE__, &ret, sizeof (uint_t)); - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_intr_cmdcmp() - * - * Description: SCF command complete processing. - * - */ -int -scf_intr_cmdcmp(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_intr_cmdcmp() " - struct scf_cmd *scfcmdp; - uint8_t sum; - uint32_t sum4; - uint8_t *wk_in_p8; - uint32_t *wk_in_p32; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - uint_t wkleng; - uint_t wkleng2; - uint_t rcount; - uint_t rxbuff_cnt; - uint_t rxbuff_flag = 0; - char sumerr_msg[16]; - int info_size; - int ii; - int ret = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - if (scf_comtbl.scf_exec_cmd_id) { - /* SCF command start for ioctl */ - scfcmdp = scf_comtbl.scf_cmdp; - } else { - /* SCF command start for interrupt */ - scfcmdp = &scf_comtbl.scf_cmd_intr; - } - scfcmdp->stat0 = (statep->reg_status & STATUS_CMD_RTN_CODE) >> 4; - scfcmdp->status = statep->reg_status; - - scf_timer_stop(SCF_TIMERCD_CMDEND); - scf_comtbl.scf_cmd_exec_flag = 0; - statep->cmd_to_rcnt = 0; - - statep->reg_rdata[0] = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->RDATA0); - statep->reg_rdata[1] = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->RDATA1); - SC_DBG_DRV_TRACE(TC_R_RDATA0, __LINE__, & statep->reg_rdata[0], - sizeof (statep->reg_rdata[0]) + sizeof (statep->reg_rdata[1])); - statep->reg_rdata[2] = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->RDATA2); - statep->reg_rdata[3] = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->RDATA3); - SC_DBG_DRV_TRACE(TC_R_RDATA2, __LINE__, &statep->reg_rdata[2], - sizeof (statep->reg_rdata[2]) + sizeof (statep->reg_rdata[3])); - - SCF_DBG_TEST_INTR_CMDEND(statep); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, "command complete status = 0x%04x", - scfcmdp->stat0); - SCFDBGMSG4(SCF_DBGFLAG_REG, "RxDR = 0x%08x 0x%08x 0x%08x 0x%08x", - statep->reg_rdata[0], statep->reg_rdata[1], - statep->reg_rdata[2], statep->reg_rdata[3]); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_RECVDATA); - - SCF_DBG_XSCF_SET_STATUS - - /* Check command return value */ - switch (scfcmdp->stat0) { - case NORMAL_END: - /* Norman end */ - statep->tesum_rcnt = 0; - - SCF_DBG_XSCF_SET_LENGTH - - /* Make Rx register sum */ - sum = SCF_MAGICNUMBER_S; - wk_in_p8 = (uint8_t *)&statep->reg_rdata[0]; - for (ii = 0; ii < SCF_S_CNT_15; ii++, wk_in_p8++) { - sum += *wk_in_p8; - } - - SCF_DBG_MAKE_RXSUM(sum, *wk_in_p8); - - /* Check Rx register sum */ - if (sum != *wk_in_p8) { - SCFDBGMSG2(SCF_DBGFLAG_SYS, - "Rx sum failure 0x%02x 0x%02x", sum, *wk_in_p8); - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr ", 8); - scfcmdp->stat0 = SCF_STAT0_RDATA_SUM; - strcpy(&sumerr_msg[0], "SCF device"); - statep->resum_rcnt++; - goto CHECK_rxsum_start; - } - - if (scfcmdp->flag == SCF_USE_SLBUF) { - /* - * SCF_USE_SLBUF - */ - scfcmdp->rbufleng = statep->reg_rdata[0]; - if (scfcmdp->rbufleng > SCF_L_CNT_MAX) { - /* Invalid receive data length */ - SCFDBGMSG1(SCF_DBGFLAG_SYS, - "Invalid receive data length = 0x%08x", - scfcmdp->rbufleng); - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr ", 8); - scfcmdp->stat0 = SCF_STAT0_RDATA_SUM; - strcpy(&sumerr_msg[0], "SRAM"); - statep->resum_rcnt++; - goto CHECK_rxsum_start; - } - - if (scfcmdp->rbufleng == 0) { - statep->resum_rcnt = 0; - goto CHECK_rxsum_start; - } - /* Check receive data division mode */ - if ((scf_comtbl.scf_exec_cmd_id) && - (scfcmdp->rbufleng > scf_rxbuff_max_size)) { - scf_comtbl.scf_rem_rxbuff_size = - scfcmdp->rbufleng - scf_rxbuff_max_size; - rxbuff_cnt = scf_rxbuff_max_size; - rxbuff_flag = 1; - } else { - rxbuff_cnt = scfcmdp->rbufleng; - rxbuff_flag = 0; - } - - /* Receive data copy */ - wk_in_p = (uint8_t *)&statep->scf_sys_sram->DATA[0]; - wk_out_p = (uint8_t *)&scfcmdp->rbuf[0]; - for (ii = 0; ii < rxbuff_cnt; - ii++, wk_in_p++, wk_out_p++) { - *wk_out_p = SCF_DDI_GET8(statep, - statep->scf_sys_sram_handle, wk_in_p); - } - - /* SRAM trace */ - if (rxbuff_cnt > scf_sram_trace_data_size) { - rcount = scf_sram_trace_data_size; - } else { - rcount = rxbuff_cnt; - } - wk_in_p = (uint8_t *)scfcmdp->rbuf; - info_size = sizeof (statep->memo_scf_drvtrc.INFO); - while (rcount != 0) { - bzero((void *)&statep->memo_scf_drvtrc.INFO[0], - info_size); - wk_out_p = &statep->memo_scf_drvtrc.INFO[0]; - if (rcount > info_size) { - wkleng = info_size; - } else { - wkleng = rcount; - } - rcount -= wkleng; - bcopy(wk_in_p, wk_out_p, wkleng); - SCF_SRAM_TRACE(statep, DTC_RECVDATA_SRAM); - wk_in_p += wkleng; - } - - /* Check receive data division mode */ - if (rxbuff_flag != 0) { - goto CHECK_rxsum_start; - } - - /* Make SRAM data sum */ - sum4 = SCF_MAGICNUMBER_L; - wkleng2 = scfcmdp->rbufleng; - wkleng = scfcmdp->rbufleng / 4; - wk_in_p32 = (void *)scfcmdp->rbuf; - for (ii = 0; ii < wkleng; ii++, wk_in_p32++) { - sum4 += *wk_in_p32; - } - if ((wkleng2 % 4) == 3) { - sum4 += ((scfcmdp->rbuf[wkleng2 - 3] << 24) | - (scfcmdp->rbuf[wkleng2 - 2] << 16) | - (scfcmdp->rbuf[wkleng2 - 1] << 8)); - - } else if ((wkleng2 % 4) == 2) { - sum4 += ((scfcmdp->rbuf[wkleng2 - 2] << 24) | - (scfcmdp->rbuf[wkleng2 - 1] << 16)); - } else if ((wkleng2 % 4) == 1) { - sum4 += (scfcmdp->rbuf[wkleng2 - 1] << 24); - } - - SCF_DBG_MAKE_RXSUM_L(sum4, statep->reg_rdata[2]); - - /* Check SRAM data sum */ - if (sum4 == statep->reg_rdata[2]) { - statep->resum_rcnt = 0; - } else { - SCFDBGMSG2(SCF_DBGFLAG_SYS, - "Rx sum failure 0x%08x 0x%08x", - sum4, statep->reg_rdata[2]); - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, - __LINE__, "intr ", 8); - scfcmdp->stat0 = SCF_STAT0_RDATA_SUM; - strcpy(&sumerr_msg[0], "SRAM"); - statep->resum_rcnt++; - } - } else { - if ((scfcmdp->flag == SCF_USE_SSBUF) || - (scfcmdp->flag == SCF_USE_LSBUF)) { - /* - * SCF_USE_SSBUF/SCF_USE_LSBUF - */ - if (scfcmdp->rcount < SCF_S_CNT_16) { - wkleng = scfcmdp->rcount; - } else { - wkleng = SCF_S_CNT_16; - } - scfcmdp->rbufleng = wkleng; - if (wkleng != 0) { - /* Receive data copy */ - bcopy((void *)&statep->reg_rdata[0], - (void *)scfcmdp->rbuf, wkleng); - } - } else { - /* - * SCF_USE_S_BUF/SCF_USE_L_BUF - */ - scfcmdp->rbufleng = 0; - } - statep->resum_rcnt = 0; - } - -/* - * CHECK_rxsum_start - */ - CHECK_rxsum_start: - - /* Check Rx sum re-try out */ - if ((scfcmdp->stat0 == SCF_STAT0_RDATA_SUM) && - (statep->resum_rcnt > scf_resum_rcnt)) { - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_RSUMERR); - - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr ", 8); - cmn_err(CE_WARN, - "%s,Failed the receive data SUM of %s. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], &sumerr_msg[0], - scfcmdp->subcmd, scfcmdp->cmd); - statep->scf_herr |= HERR_RESUM; - ret = 1; - goto END_intr_cmdcmp; - } - break; - - case INTERFACE: - /* Interface error */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_INTERFACE); - - statep->tesum_rcnt++; - /* Check interface error re-try out */ - if (statep->tesum_rcnt > scf_tesum_rcnt) { - cmn_err(CE_WARN, - "%s,Detected the interface error by XSCF. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], scfcmdp->subcmd, - scfcmdp->cmd); - statep->scf_herr |= HERR_TESUM; - ret = 1; - goto END_intr_cmdcmp; - } - break; - - case BUF_FUL: - /* Buff full */ - SC_DBG_DRV_TRACE(TC_INTR|TC_MSG, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_RCI_BUF_FUL); - - break; - - case RCI_BUSY: - /* RCI busy */ - SC_DBG_DRV_TRACE(TC_INTR|TC_MSG, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_RCI_BUSY); - - break; - - case E_NOT_SUPPORT: - /* Not support command/sub command */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_E_NOT_SUPPORT); - - cmn_err(CE_WARN, - "%s,Detected the not support command by XSCF. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], scfcmdp->subcmd, - scfcmdp->cmd); - break; - - case E_PARAM: - /* Parameter error */ - - /* Check command is SB configuration change */ - if ((scfcmdp->cmd == CMD_DR) && (scfcmdp->subcmd == - SUB_SB_CONF_CHG)) { - scfcmdp->rbufleng = SCF_S_CNT_16; - /* Receive data copy */ - if (scfcmdp->rcount < SCF_S_CNT_16) { - wkleng = scfcmdp->rcount; - } else { - wkleng = SCF_S_CNT_16; - } - if (wkleng != 0) { - bcopy((void *)&statep->reg_rdata[0], - (void *)scfcmdp->rbuf, wkleng); - } - } else { - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_E_PARAM); - - cmn_err(CE_WARN, - "%s,Detected the invalid parameter by XSCF. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], scfcmdp->subcmd, - scfcmdp->cmd); - } - break; - - case E_RCI_ACCESS: - /* RCI access error */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_E_RCI_ACCESS); - - cmn_err(CE_WARN, - "%s,RCI access error occurred in XSCF. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], scfcmdp->subcmd, - scfcmdp->cmd); - break; - - case E_SCFC_NOPATH: - /* No SCFC path */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_E_SCFC_PATH); - - if (scf_comtbl.scf_exec_p) { - scf_chg_scf(scf_comtbl.scf_exec_p, PATH_STAT_ACTIVE); - scf_comtbl.scf_path_p = scf_comtbl.scf_exec_p; - scf_comtbl.scf_exec_p = 0; - } - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - break; - - case RCI_NS: - /* Not support RCI */ - SC_DBG_DRV_TRACE(TC_INTR|TC_MSG, __LINE__, "intr ", 8); - cmn_err(CE_WARN, - "%s,Cannot use RCI interface. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], scfcmdp->subcmd, - scfcmdp->cmd); - break; - - default: - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, "intr ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_ERRRTN | scfcmdp->stat0); - - cmn_err(CE_WARN, - "%s,Invalid status value was notified from XSCF. " - "SCF command = 0x%02x%02x, Status value = 0x%04x\n", - &statep->pathname[0], scfcmdp->subcmd, - scfcmdp->cmd, scfcmdp->status); - scfcmdp->stat0 = E_NOT_SUPPORT; - break; - } - - /* Check SCF command start for interrupt */ - if (scf_comtbl.scf_exec_cmd_id == 0) { - /* SCF command start for interrupt processing */ - scf_intr_cmdcmp_driver(statep, scfcmdp); - } else { - /* Check ioctl command end wait */ - if (scf_comtbl.cmd_end_wait != 0) { - /* Check command return value */ - switch (scfcmdp->stat0) { - case NORMAL_END: - case BUF_FUL: - case RCI_BUSY: - case E_NOT_SUPPORT: - case E_PARAM: - case E_RCI_ACCESS: - case RCI_NS: - if ((scfcmdp->stat0 == NORMAL_END) && - (scfcmdp->cmd == CMD_ALIVE_CHECK)) { - if (scfcmdp->subcmd == - SUB_ALIVE_START) { - scf_alivecheck_start(statep); - } else { - scf_alivecheck_stop(statep); - } - } - if ((scfcmdp->stat0 == NORMAL_END) && - (rxbuff_flag)) { - break; - } - - scf_comtbl.cmd_end_wait = 0; - /* Signal to command end wait */ - cv_signal(&scf_comtbl.cmdend_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.cmdend_cv, - sizeof (kcondvar_t)); - break; - - default: - /* INTERFACE */ - /* E_SCFC_NOPATH */ - /* Rx DATA SUM ERROR */ - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_IOCTL; - break; - } - } - } - - /* Check receive data division mode */ - if (rxbuff_flag == 1) { - /* Next receive data timer start */ - scf_timer_start(SCF_TIMERCD_NEXTRECV); - scf_comtbl.scf_cmd_exec_flag = 1; - } - -/* - * END_intr_cmdcmp - */ - END_intr_cmdcmp: - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_intr_cmdcmp_driver() - * - * Description: SCF command complete. start for interrupt processing. - * - */ -void -scf_intr_cmdcmp_driver(scf_state_t *statep, struct scf_cmd *scfcmdp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_intr_cmdcmp_driver() " - int shutdown_flag = 0; - int poff_flag; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Check command code */ - switch (scfcmdp->cmd) { - case CMD_SCFI_PATH: /* SCF Path change command */ - /* Check command return value */ - if (scfcmdp->stat0 != NORMAL_END) { - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_PCHG; - break; - } - - /* Check SCF path change status */ - if (scf_comtbl.scf_path_p != NULL) { - scf_chg_scf(scf_comtbl.scf_path_p, PATH_STAT_ACTIVE); - scf_comtbl.scf_exec_p = scf_comtbl.scf_path_p; - scf_comtbl.scf_path_p = NULL; - /* FMEMA interface */ - scf_avail_cmd_reg_vaddr = - (caddr_t)&statep->scf_regs->COMMAND; - - scf_comtbl.path_change_rcnt = 0; - } - - /* Check Alive check exec */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALST_WAIT; - } else { - scf_comtbl.scf_alive_event_sub = EVENT_SUB_NONE; - if (scf_comtbl.suspend_wait == 1) { - scf_comtbl.suspend_wait = 0; - scf_comtbl.scf_suspend_sendstop = 1; - cv_signal(&scf_comtbl.suspend_wait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.suspend_wait_cv, - sizeof (kcondvar_t)); - } - } - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_NONE; - - scf_comtbl.scf_event_flag |= STATUS_EVENT; - - SCF_DBG_NO_INT_REASON; - - /* DSCP interface start */ - scf_dscp_start(FACTOR_PATH_CHG); - break; - - case CMD_PART_POW_CTR: /* power control command */ - /* Check command return value */ - if (scfcmdp->stat0 != NORMAL_END) { - switch (scfcmdp->stat0) { - case BUF_FUL: - case RCI_BUSY: - case E_NOT_SUPPORT: - case E_PARAM: - case E_RCI_ACCESS: - case RCI_NS: - scf_comtbl.scf_poff_event_sub = EVENT_SUB_NONE; - break; - - default: - /* INTERFACE */ - /* E_SCFC_NOPATH */ - /* Rx DATA SUM ERROR */ - scf_comtbl.scf_poff_event_sub = - EVENT_SUB_POFF_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_POFF; - break; - } - break; - } - - poff_flag = 0; - scf_comtbl.scf_poff_id = - (uchar_t)((statep->reg_rdata[0] & - 0xFF000000) >> 24); - - SCF_DBG_TEST_INTR_POFF; - - if (scf_comtbl.scf_poff_id == POFF_ID_PANEL) { - /* PANEL */ - if ((scf_comtbl.scf_mode_sw & STATUS_SECURE_MODE) != - STATUS_MODE_LOCK) { - /* Not LOCK */ - SC_DBG_DRV_TRACE(TC_INTR, __LINE__, - "intr ", 8); - if (scf_comtbl.scf_shutdownreason == 0) { - poff_flag = 1; - scf_comtbl.scf_shutdownreason = - REASON_XSCFPOFF; - } - cmn_err(CE_NOTE, - "%s: System shutdown by panel " - "request.\n", scf_driver_name); - } - } else if ((scf_comtbl.scf_poff_id & POFF_ID_MASK) == - POFF_ID_RCI) { - /* RCI */ - SC_DBG_DRV_TRACE(TC_INTR, __LINE__, "intr ", 8); - if (scf_comtbl.scf_shutdownreason == 0) { - poff_flag = 1; - scf_comtbl.scf_shutdownreason = REASON_RCIPOFF; - } - cmn_err(CE_NOTE, - "%s: System shutdown from RCI.\n", - scf_driver_name); - } else if (scf_comtbl.scf_poff_id == POFF_ID_XSCF) { - /* XSCF */ - SC_DBG_DRV_TRACE(TC_INTR, __LINE__, "intr ", 8); - if (scf_comtbl.scf_shutdownreason == 0) { - poff_flag = 1; - scf_comtbl.scf_shutdownreason = REASON_XSCFPOFF; - } - cmn_err(CE_NOTE, - "%s: System shutdown by XSCF " - "request.\n", scf_driver_name); - } - - if (poff_flag) { - cmn_err(CE_CONT, - "%s: Shutdown was executed.\n", - scf_driver_name); - /* System shutdown start */ - do_shutdown(); - } - - scf_comtbl.scf_poff_event_sub = EVENT_SUB_NONE; - break; - - case CMD_INT_REASON: /* Event information command */ - /* Check command return value */ - if ((scfcmdp->stat0 != NORMAL_END) && - (scfcmdp->stat0 != SCF_STAT0_RDATA_SUM)) { - switch (scfcmdp->stat0) { - case BUF_FUL: - case RCI_BUSY: - case E_NOT_SUPPORT: - case E_PARAM: - case E_RCI_ACCESS: - case RCI_NS: - scf_comtbl.scf_shut_event_sub = EVENT_SUB_NONE; - break; - - default: - /* INTERFACE */ - /* E_SCFC_NORATH */ - if (scf_comtbl.scf_shut_event_sub == - EVENT_SUB_SHUT_EXEC) { - scf_comtbl.scf_shut_event_sub = - EVENT_SUB_SHUT_WAIT; - } else { - scf_comtbl.scf_shut_event_sub = - EVENT_SUB_WAIT; - } - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_SHUT; - break; - } - break; - } - - /* Check factor detail disp */ - if ((scfcmdp->stat0 == SCF_STAT0_RDATA_SUM) && - (scfcmdp->subcmd == SUB_INT_REASON_DISP)) { - /* Send detail re-disp */ - scf_comtbl.int_reason_retry = 1; - if (scf_comtbl.scf_shut_event_sub == - EVENT_SUB_SHUT_EXEC) { - scf_comtbl.scf_shut_event_sub = - EVENT_SUB_SHUT_WAIT; - } else { - scf_comtbl.scf_shut_event_sub = EVENT_SUB_WAIT; - } - break; - } - - if (scfcmdp->stat0 == NORMAL_END) { - - SCF_DBG_TEST_DSENS(scfcmdp, (void *)scfcmdp->rbuf, - (int)scfcmdp->rbufleng); - - scf_comtbl.int_reason_retry = 0; - /* - * Event interrupt factor check - * processing - */ - shutdown_flag = scf_intr_dsens(scfcmdp, - (void *)scfcmdp->rbuf, (int)scfcmdp->rbufleng); - } else { - if (scf_comtbl.scf_shut_event_sub == - EVENT_SUB_SHUT_EXEC) { - shutdown_flag = DEV_SENSE_SHUTDOWN; - } - } - if (shutdown_flag == DEV_SENSE_SHUTDOWN) { - cmn_err(CE_CONT, - "%s: Shutdown was executed.\n", - scf_driver_name); - /* System shutdown start */ - do_shutdown(); - } - scf_comtbl.scf_shut_event_sub = EVENT_SUB_NONE; - break; - - case CMD_ALIVE_CHECK: /* Alive check command */ - /* Check command return value */ - switch (scfcmdp->stat0) { - case NORMAL_END: - case BUF_FUL: - case RCI_BUSY: - case E_NOT_SUPPORT: - case E_PARAM: - case E_SCFC_NOPATH: - case E_RCI_ACCESS: - case RCI_NS: - if (scfcmdp->stat0 == NORMAL_END) { - if (scfcmdp->subcmd == SUB_ALIVE_START) { - scf_alivecheck_start(statep); - } else { - scf_alivecheck_stop(statep); - } - } - - if ((scf_comtbl.scf_alive_event_sub == - EVENT_SUB_ALSP_EXEC) && - (scf_comtbl.suspend_wait)) { - /* Signal to suspend wait */ - scf_comtbl.suspend_wait = 0; - scf_comtbl.scf_suspend_sendstop = 1; - cv_signal(&scf_comtbl.suspend_wait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.suspend_wait_cv, - sizeof (kcondvar_t)); - } - if ((scf_comtbl.scf_alive_event_sub == - EVENT_SUB_ALST_EXEC) || - (scf_comtbl.scf_alive_event_sub == - EVENT_SUB_ALSP_EXEC)) { - scf_comtbl.scf_alive_event_sub = EVENT_SUB_NONE; - } - break; - - default: - /* INTERFACE */ - /* Rx DATA SUM ERROR */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_comtbl.scf_alive_event_sub = - EVENT_SUB_ALST_WAIT; - } else { - scf_comtbl.scf_alive_event_sub = - EVENT_SUB_ALSP_WAIT; - } - - /* Set command retry send flag */ - if ((scfcmdp->subcmd == SUB_ALIVE_START) && - (scf_comtbl.scf_alive_event_sub == - EVENT_SUB_ALST_WAIT)) { - scf_comtbl.scf_cmd_resend_req |= RESEND_ALST; - } else if ((scfcmdp->subcmd == SUB_ALIVE_STOP) && - (scf_comtbl.scf_alive_event_sub == - EVENT_SUB_ALSP_WAIT)) { - scf_comtbl.scf_cmd_resend_req |= RESEND_ALSP; - } - break; - } - break; - - case CMD_REPORT: /* Report command */ - /* Check command return value */ - switch (scfcmdp->stat0) { - case NORMAL_END: - case BUF_FUL: - case RCI_BUSY: - case E_NOT_SUPPORT: - case E_PARAM: - case E_SCFC_NOPATH: - case E_RCI_ACCESS: - case RCI_NS: - if ((scfcmdp->stat0 == NORMAL_END) && - (scf_comtbl.alive_running == SCF_ALIVE_START)) { - /* Check Alive check exec */ - scf_comtbl.scf_alive_event_sub = - EVENT_SUB_ALST_WAIT; - } - - if ((scf_comtbl.scf_report_event_sub == - EVENT_SUB_REPORT_RUN_EXEC) || - (scf_comtbl.scf_report_event_sub == - EVENT_SUB_REPORT_SHOT_EXEC)) { - scf_comtbl.scf_report_event_sub = - EVENT_SUB_NONE; - } - - if (scfcmdp->stat0 == BUF_FUL) { - if (scf_comtbl.report_buf_ful_rcnt != - scf_buf_ful_rcnt) { - scf_comtbl.report_buf_ful_rcnt++; - scf_timer_start(SCF_TIMERCD_BUF_FUL); - } else { - scf_comtbl.report_buf_ful_rcnt = 0; - } - } else { - scf_comtbl.report_buf_ful_rcnt = 0; - } - - if (scfcmdp->stat0 == RCI_BUSY) { - if (scf_comtbl.report_rci_busy_rcnt != - scf_rci_busy_rcnt) { - scf_comtbl.report_rci_busy_rcnt++; - scf_timer_start(SCF_TIMERCD_RCI_BUSY); - } else { - scf_comtbl.report_rci_busy_rcnt = 0; - } - } else { - scf_comtbl.report_rci_busy_rcnt = 0; - } - break; - - default: - /* INTERFACE */ - /* Rx DATA SUM ERROR */ - if (scf_comtbl.scf_report_event_sub == - EVENT_SUB_REPORT_RUN_EXEC) { - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_RUN_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= - RESEND_REPORT_RUN; - } else { - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_SHUT_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= - RESEND_REPORT_SHUT; - } - break; - } - break; - - case CMD_DOMAIN_INFO: /* Domain info command */ - /* Check command return value */ - if (scfcmdp->stat0 != NORMAL_END) { - switch (scfcmdp->stat0) { - case BUF_FUL: - case RCI_BUSY: - case E_NOT_SUPPORT: - case E_PARAM: - case E_RCI_ACCESS: - case RCI_NS: - scf_comtbl.scf_domain_event_sub = - EVENT_SUB_NONE; - break; - - default: - /* INTERFACE */ - /* E_SCFC_NOPATH */ - /* Rx DATA SUM ERROR */ - scf_comtbl.scf_domain_event_sub = - EVENT_SUB_DOMAIN_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_DOMAIN; - break; - } - break; - } - - /* Set XSCF version */ - scf_xscf_comif_version = (ushort_t)(statep->reg_rdata[3] >> 8); - - scf_comtbl.scf_domain_event_sub = EVENT_SUB_NONE; - break; - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_intr_dsens() - * - * Description: Event factor check processing. - * - */ -/* ARGSUSED */ -int -scf_intr_dsens(struct scf_cmd *scfcmdp, scf_int_reason_t *int_rp, int len) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_intr_dsens() " - scf_int_reason_t *rbuf; - uchar_t category_code; - uchar_t sub_status; - uchar_t category_type; - time_t timestamp; - int ret = 0; - int ent = 0; - int getevent_flag; - int max_ent; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - rbuf = int_rp; - max_ent = len / SCF_INT_REASON_SIZE; - if (max_ent > 4) { - max_ent = 4; - } - - /* entry count loop */ - while ((rbuf->b[4]) && (ent < max_ent)) { - /* Save last event */ - bcopy((void *)&rbuf->b[0], (void *)&scf_comtbl.last_event[0], - SCF_INT_REASON_SIZE); - - /* Check SCFIOCEVENTLIST */ - getevent_flag = scf_push_getevent(&rbuf->b[0]); - if (getevent_flag == 0) { - /* wake up waiting thread */ - cv_signal(&scf_comtbl.getevent_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.getevent_cv, sizeof (kcondvar_t)); - } - - /* get category code of the sense */ - category_code = rbuf->b[4] & (~DEV_SENSE_SHUTDOWN); - sub_status = rbuf->b[4]; - category_type = rbuf->b[6]; - SC_DBG_DRV_TRACE(TC_DSENS, __LINE__, &rbuf->b[0], 8); - SC_DBG_DRV_TRACE(TC_DSENS, __LINE__, &rbuf->b[8], 8); - SCFDBGMSG4(SCF_DBGFLAG_REG, - "SENSE = 0x%08x 0x%08x 0x%08x 0x%08x", - rbuf->four_bytes_access[0], rbuf->four_bytes_access[1], - rbuf->four_bytes_access[2], rbuf->four_bytes_access[3]); - - switch (category_code) { - case DEV_SENSE_FANUNIT: - /* fan unit failure */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - - if (category_type == DEV_SENSE_ATTR_OWN) { - cmn_err(CE_WARN, - "%s: fan unit failure" - ", sub status = 0x%02x\n", - scf_driver_name, sub_status); - if ((sub_status & DEV_SENSE_SHUTDOWN) && - (scf_comtbl.scf_shutdownreason == 0)) { - scf_comtbl.scf_shutdownreason = - REASON_SHUTDOWN_FAN; - ret = DEV_SENSE_SHUTDOWN; - } - } else { - cmn_err(CE_WARN, - "%s: fan unit failure on " - "RCI(addr = 0x%08x)" - ", FAN#%d, sub status = 0x%02x,\n" - "sense info =" - " 0x%02x 0x%02x 0x%02x 0x%02x" - " 0x%02x 0x%02x 0x%02x 0x%02x\n", - scf_driver_name, - rbuf->four_bytes_access[0], - rbuf->b[9], sub_status, - rbuf->b[0], rbuf->b[1], - rbuf->b[2], rbuf->b[3], - rbuf->b[8], rbuf->b[9], - rbuf->b[10], rbuf->b[11]); - } - break; - - case DEV_SENSE_PWRUNIT: - /* power unit failure */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - - if (category_type == DEV_SENSE_ATTR_OWN) { - cmn_err(CE_WARN, - "%s: power supply unit failure" - ", sub status = 0x%02x\n", - scf_driver_name, sub_status); - if ((sub_status & DEV_SENSE_SHUTDOWN) && - (scf_comtbl.scf_shutdownreason == 0)) { - scf_comtbl.scf_shutdownreason = - REASON_SHUTDOWN_PSU; - ret = DEV_SENSE_SHUTDOWN; - } - } else { - cmn_err(CE_WARN, - "%s: power supply unit failure on " - "RCI(addr = 0x%08x)" - ", FEP#%d, sub status = 0x%02x,\n" - "sense info =" - " 0x%02x 0x%02x 0x%02x 0x%02x" - " 0x%02x 0x%02x 0x%02x 0x%02x\n", - scf_driver_name, - rbuf->four_bytes_access[0], - rbuf->b[11], - sub_status, - rbuf->b[0], rbuf->b[1], - rbuf->b[2], rbuf->b[3], - rbuf->b[8], rbuf->b[9], - rbuf->b[10], rbuf->b[11]); - } - break; - - case DEV_SENSE_UPS: - /* UPS failure */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - - if (category_type != DEV_SENSE_ATTR_OWN) { - break; - } - - switch (rbuf->b[8] & DEV_SENSE_UPS_MASK) { - case DEV_SENSE_UPS_LOWBAT: - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - cmn_err(CE_WARN, - "%s: UPS low battery" - " was detected, sub status = 0x%02x\n", - scf_driver_name, sub_status); - break; - - default: - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, - __LINE__, "intr_dse", 8); - cmn_err(CE_WARN, - "%s: UPS failure" - " was detected, sub status = 0x%02x\n", - scf_driver_name, sub_status); - break; - } - if ((sub_status & DEV_SENSE_SHUTDOWN) && - (scf_comtbl.scf_shutdownreason == 0)) { - scf_comtbl.scf_shutdownreason = - REASON_SHUTDOWN_UPS; - ret = DEV_SENSE_SHUTDOWN; - } - break; - - case DEV_SENSE_THERMAL: - /* thermal failure */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - - if (category_type == DEV_SENSE_ATTR_OWN) { - cmn_err(CE_WARN, - "%s: thermal alarm" - ", sub status = 0x%02x\n", - scf_driver_name, sub_status); - if ((sub_status & DEV_SENSE_SHUTDOWN) && - (scf_comtbl.scf_shutdownreason == 0)) { - scf_comtbl.scf_shutdownreason = - REASON_SHUTDOWN_THERMAL; - ret = DEV_SENSE_SHUTDOWN; - } - } else { - cmn_err(CE_WARN, - "%s: thermal alarm on " - "RCI(addr = 0x%08x)" - ", SENSOR#%d, sub status = 0x%02x,\n" - "sense info =" - " 0x%02x 0x%02x 0x%02x 0x%02x" - " 0x%02x 0x%02x 0x%02x 0x%02x\n", - scf_driver_name, - rbuf->four_bytes_access[0], - rbuf->b[9], sub_status, - rbuf->b[0], rbuf->b[1], - rbuf->b[2], rbuf->b[3], - rbuf->b[8], rbuf->b[9], - rbuf->b[10], rbuf->b[11]); - } - break; - - case DEV_SENSE_PWRSR: - /* power stop */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - - if (category_type != DEV_SENSE_ATTR_OWN) { - break; - } - - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - cmn_err(CE_WARN, - "%s: Input power down was detected. " - "UPS is activated" - ", sub status = 0x%02x\n", - scf_driver_name, sub_status); - if (sub_status & DEV_SENSE_SHUTDOWN) { - if (scf_comtbl.shutdown_start_reported == 0) { - scf_comtbl.poff_factor = - SCF_POFF_FACTOR_PFAIL; - } - if (scf_comtbl.scf_shutdownreason == 0) { - scf_comtbl.scf_shutdownreason = - REASON_SHUTDOWN_UPS; - ret = DEV_SENSE_SHUTDOWN; - } - } - break; - - case DEV_SENSE_NODE: - /* node error */ - SC_DBG_DRV_TRACE(TC_INTR|TC_ERR, __LINE__, - "intr_dse", 8); - - if (category_type == DEV_SENSE_ATTR_OWN) { - break; - } - - cmn_err(CE_WARN, - "%s: node error on RCI(addr = 0x%08x)" - ", sub status = 0x%02x,\n" - "sense info =" - " 0x%02x 0x%02x 0x%02x 0x%02x" - " 0x%02x 0x%02x 0x%02x 0x%02x\n", - scf_driver_name, - rbuf->four_bytes_access[0], - sub_status, - rbuf->b[0], rbuf->b[1], - rbuf->b[2], rbuf->b[3], - rbuf->b[8], rbuf->b[9], - rbuf->b[10], rbuf->b[11]); - if (rbuf->b[9] == DEV_SENSE_NODE_STCKTO) { - scf_comtbl.rcidown_event_flag = 1; - scf_comtbl.scfreport_rcidown.rci_addr = - rbuf->four_bytes_access[0]; - scf_comtbl.scfreport_rcidown.report_sense[0] = - REPORT_STAT_RCIDWN; - scf_comtbl.scfreport_rcidown.report_sense[1] = - rbuf->b[9]; - scf_comtbl.scfreport_rcidown.report_sense[2] = - rbuf->b[10]; - scf_comtbl.scfreport_rcidown.report_sense[3] = - rbuf->b[11]; - scf_comtbl.scfreport_rcidown.timestamp = - ddi_get_time(); - /* wake up waiting thread */ - cv_signal(&scf_comtbl.rsense_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.rsense_cv, - sizeof (kcondvar_t)); - } - break; - - case DEV_SENSE_SYS_REPORT: - /* system status report */ - timestamp = ddi_get_time(); - (void) scf_push_reportsense(rbuf->four_bytes_access[0], - &rbuf->b[8], timestamp); - /* wake up waiting thread */ - cv_signal(&scf_comtbl.rsense_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.rsense_cv, sizeof (kcondvar_t)); - break; - - case DEV_SENSE_PANIC_REQ: - /* panic request */ - cmn_err(CE_PANIC, - "%s: panic request from RCI(addr = 0x%08x)\n", - scf_driver_name, - rbuf->four_bytes_access[0]); - break; - - case DEV_SENSE_IONODESTAT: - /* I/O node status */ - if (category_type == DEV_SENSE_ATTR_OWN) { - break; - } - - cmn_err(CE_NOTE, - "%s: I/O node status sense from " - "RCI(addr = 0x%08x), " - "sub status = 0x%02x,\n" - "sense info = 0x%02x 0x%02x 0x%02x 0x%02x" - " 0x%02x 0x%02x 0x%02x 0x%02x\n", - scf_driver_name, - rbuf->four_bytes_access[0], - sub_status, - rbuf->b[0], rbuf->b[1], - rbuf->b[2], rbuf->b[3], - rbuf->b[8], rbuf->b[9], - rbuf->b[10], rbuf->b[11]); - break; - - case DEV_SENSE_STATUS_RPT: - /* Deveice status print */ - if (scf_comtbl.rdctrl_end_wait) { - /* rdctrl devsense? (for SCFIOCRDCTRL) */ - /* keep devsense info */ - scf_comtbl.rdctrl_sense_category_code = - category_code; - bcopy((void *)&rbuf->b[0], - (void *)&scf_comtbl.rdctrl_sense[0], - SCF_INT_REASON_SIZE); - cv_signal(&scf_comtbl.rdcsense_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.rdcsense_cv, - sizeof (kcondvar_t)); - } - break; - - default: - /* Devive status print */ - if (((category_code & 0xf0) == DEV_SENSE_RCI_PATH40) && - (scf_comtbl.rdctrl_end_wait)) { - /* rdctrl devsense (for SCFIOCRDCTRL) */ - /* keep devsense info */ - scf_comtbl.rdctrl_sense_category_code = - category_code; - bcopy((void *)&rbuf->b[0], - (void *)&scf_comtbl.rdctrl_sense[0], - SCF_INT_REASON_SIZE); - cv_signal(&scf_comtbl.rdcsense_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.rdcsense_cv, - sizeof (kcondvar_t)); - } - break; - - } - -/* - * NEXT_intr_dsens - */ - NEXT_intr_dsens: - - rbuf = (void *)((char *)rbuf + SCF_INT_REASON_SIZE); - ent++; - } - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_status_change() - * - * Description: SCF status change processing. - * - */ -void -scf_status_change(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_status_change() " - uint8_t scf_unit; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Check SCF status */ - if ((statep->reg_status_exr & STATUS_SCF_STATUS) == STATUS_SCF_ONLINE) { - /* - * SCF online - */ - if (scf_comtbl.scf_status == SCF_STATUS_OFFLINE) { - cmn_err(CE_NOTE, "%s: SCF online.\n", scf_driver_name); - } - scf_comtbl.scf_status = SCF_STATUS_ONLINE; - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_ONLINE); - - /* Check online wait timer exec */ - if (scf_timer_check(SCF_TIMERCD_ONLINE) == SCF_TIMER_NOT_EXEC) { - /* DCSP interface re-start */ - scf_dscp_stop(FACTOR_OFFLINE); - scf_dscp_start(FACTOR_ONLINE); - } else { - /* DCSP interface start */ - scf_dscp_start(FACTOR_ONLINE); - - /* SCF online timer stop */ - scf_timer_stop(SCF_TIMERCD_ONLINE); - - /* Check SCF command exec */ - if (scf_comtbl.scf_cmd_exec_flag) { - /* Set command wait status */ - scf_cmdwait_status_set(); - scf_comtbl.scf_cmd_exec_flag = 0; - } - - scf_comtbl.scf_domain_event_sub = EVENT_SUB_DOMAIN_WAIT; - - /* Check Alive check exec */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_comtbl.scf_alive_event_sub = - EVENT_SUB_ALST_WAIT; - } - } - } else { - /* - * SCF offline - */ - if (scf_comtbl.scf_status != SCF_STATUS_OFFLINE) { - if (statep->reg_status_exr & STATUS_SCF_NO) { - scf_unit = 1; - } else { - scf_unit = 0; - } - cmn_err(CE_WARN, - "%s: SCF went to offline mode. unit=%d", - scf_driver_name, scf_unit); - } - scf_comtbl.scf_status = SCF_STATUS_OFFLINE; - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_OFFLINE); - - /* Check online wait timer exec */ - if (scf_timer_check(SCF_TIMERCD_ONLINE) == SCF_TIMER_NOT_EXEC) { - /* DCSP interface stop */ - scf_dscp_stop(FACTOR_OFFLINE); - - statep->online_to_rcnt = 0; - /* SCF online timer start */ - scf_timer_start(SCF_TIMERCD_ONLINE); - } - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_next_cmd_check() - * - * Description: Next command send and check processing. - * - */ -void -scf_next_cmd_check(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_next_cmd_check() " - struct scf_cmd *scfcmdp = &scf_comtbl.scf_cmd_intr; - int offline_ret; - int cmdbusy_ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Check suspend send stop */ - if (scf_comtbl.scf_suspend_sendstop) { - goto END_next_cmd_check; - } - - if ((scf_comtbl.scf_path_p == NULL) && - (scf_comtbl.scf_pchg_event_sub == EVENT_SUB_PCHG_WAIT)) { - scf_chg_scf(statep, PATH_STAT_ACTIVE); - scf_comtbl.scf_path_p = statep; - } - - if (scf_comtbl.scf_cmd_exec_flag == 0) { - /* send comannd for interrupt */ - offline_ret = scf_offline_check(statep, FLAG_ON); - cmdbusy_ret = scf_cmdbusy_check(statep); - - if ((offline_ret != SCF_PATH_ONLINE) || - (cmdbusy_ret != SCF_COMMAND_READY)) { - goto END_next_cmd_check; - } - } - - /* Check SCF Path change request */ - if ((scf_comtbl.scf_cmd_exec_flag == 0) && - (scf_comtbl.scf_pchg_event_sub == EVENT_SUB_PCHG_WAIT)) { - /* Send SCF Path change command */ - scfcmdp->cmd = CMD_SCFI_PATH; - scfcmdp->subcmd = SUB_CMD_PATH; - bzero((void *)&scf_comtbl.scf_sbuf[0], SCF_S_CNT_16); - scf_comtbl.scf_sbuf[0] = CMD_PATH_TYPE_SCFD; - scfcmdp->sbuf = &scf_comtbl.scf_sbuf[0]; - scfcmdp->scount = SCF_S_CNT_15; - scfcmdp->rcount = 0; - scfcmdp->flag = SCF_USE_S_BUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_PCHG) != 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_PCHG; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_EXEC; - } - - if (scf_comtbl.scf_cmd_exec_flag == 0) { - /* Check shutdown event information request */ - if ((scf_comtbl.scf_shut_event_sub == EVENT_SUB_NONE) && - (scf_comtbl.scf_event_flag & STATUS_SHUTDOWN)) { - scf_comtbl.scf_event_flag &= - (~(STATUS_SHUTDOWN | STATUS_EVENT)); - scf_comtbl.scf_shut_event_sub = EVENT_SUB_SHUT_WAIT; - } - if (scf_comtbl.scf_shut_event_sub == EVENT_SUB_SHUT_WAIT) { - /* Send event information command */ - scfcmdp->cmd = CMD_INT_REASON; - if (scf_comtbl.int_reason_retry == 0) { - scfcmdp->subcmd = SUB_INT_REASON_DISP; - } else { - scfcmdp->subcmd = SUB_INT_REASON_RETRY; - } - scfcmdp->scount = 0; - scfcmdp->rbuf = &scf_comtbl.scf_rbuf[0]; - scfcmdp->rcount = SCF_INT_CNT_MAX; - scfcmdp->flag = SCF_USE_SLBUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_SHUT) != - 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_SHUT; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_shut_event_sub = EVENT_SUB_SHUT_EXEC; - } - } - - if (scf_comtbl.scf_cmd_exec_flag == 0) { - /* Check power off factor request */ - if ((scf_comtbl.scf_poff_event_sub == EVENT_SUB_NONE) && - (scf_comtbl.scf_event_flag & STATUS_POFF)) { - scf_comtbl.scf_event_flag &= (~STATUS_POFF); - scf_comtbl.scf_poff_event_sub = EVENT_SUB_POFF_WAIT; - } - if (scf_comtbl.scf_poff_event_sub == EVENT_SUB_POFF_WAIT) { - /* Send power off factor command */ - scfcmdp->cmd = CMD_PART_POW_CTR; - scfcmdp->subcmd = SUB_POFFID; - scfcmdp->scount = 0; - scfcmdp->rbuf = &scf_comtbl.scf_rbuf[0]; - scfcmdp->rcount = SCF_S_CNT_15; - scfcmdp->flag = SCF_USE_SSBUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_POFF) != - 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_POFF; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_poff_event_sub = EVENT_SUB_POFF_EXEC; - } - } - - if (scf_comtbl.scf_cmd_exec_flag == 0) { - /* Check event information request */ - if ((scf_comtbl.scf_shut_event_sub == EVENT_SUB_NONE) && - (scf_comtbl.scf_event_flag & STATUS_EVENT)) { - scf_comtbl.scf_event_flag &= (~STATUS_EVENT); - scf_comtbl.scf_shut_event_sub = EVENT_SUB_WAIT; - } - if (scf_comtbl.scf_shut_event_sub == EVENT_SUB_WAIT) { - /* Send event information command */ - scfcmdp->cmd = CMD_INT_REASON; - if (scf_comtbl.int_reason_retry == 0) { - scfcmdp->subcmd = SUB_INT_REASON_DISP; - } else { - scfcmdp->subcmd = SUB_INT_REASON_RETRY; - } - scfcmdp->scount = 0; - scfcmdp->rbuf = &scf_comtbl.scf_rbuf[0]; - scfcmdp->rcount = SCF_INT_CNT_MAX; - scfcmdp->flag = SCF_USE_SLBUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_SHUT) != - 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_SHUT; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_shut_event_sub = EVENT_SUB_EXEC; - } - } - - if ((scf_comtbl.scf_cmd_exec_flag == 0) && - ((scf_timer_check(SCF_TIMERCD_BUF_FUL) == - SCF_TIMER_NOT_EXEC) && - (scf_timer_check(SCF_TIMERCD_RCI_BUSY) == - SCF_TIMER_NOT_EXEC))) { - /* Check report request */ - if (scf_comtbl.scf_report_event_sub == - EVENT_SUB_REPORT_RUN_WAIT) { - /* Send report(System running) command */ - scfcmdp->cmd = CMD_REPORT; - scfcmdp->subcmd = SUB_SYSTEM_STATUS_RPT; - bzero((void *)&scf_comtbl.scf_sbuf[0], SCF_S_CNT_16); - scf_comtbl.scf_sbuf[0] = REPORT_STAT_SYSTEM_RUNNING; - scf_comtbl.scf_sbuf[1] = 0; - scf_comtbl.scf_sbuf[2] = 0; - scf_comtbl.scf_sbuf[3] = 0; - scfcmdp->sbuf = &scf_comtbl.scf_sbuf[0]; - scfcmdp->scount = SCF_S_CNT_15; - scfcmdp->rcount = 0; - scfcmdp->flag = SCF_USE_S_BUF; - if ((scf_comtbl.scf_cmd_resend_req & - RESEND_REPORT_RUN) != 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= - ~RESEND_REPORT_RUN; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_RUN_EXEC; - scf_comtbl.scf_last_report = SCF_SYSTEM_RUNNING; - } else if (scf_comtbl.scf_report_event_sub == - EVENT_SUB_REPORT_SHUT_WAIT) { - /* Send report(Shutdown start) command */ - scfcmdp->cmd = CMD_REPORT; - scfcmdp->subcmd = SUB_SYSTEM_STATUS_RPT; - bzero((void *)&scf_comtbl.scf_sbuf[0], - SCF_S_CNT_16); - scf_comtbl.scf_sbuf[0] = - REPORT_STAT_SHUTDOWN_START; - scf_comtbl.scf_sbuf[1] = - scf_poff_factor[scf_comtbl.poff_factor][0]; - scf_comtbl.scf_sbuf[2] = - scf_poff_factor[scf_comtbl.poff_factor][1]; - scf_comtbl.scf_sbuf[3] = - scf_poff_factor[scf_comtbl.poff_factor][2]; - scfcmdp->sbuf = &scf_comtbl.scf_sbuf[0]; - scfcmdp->scount = SCF_S_CNT_15; - scfcmdp->rcount = 0; - scfcmdp->flag = SCF_USE_S_BUF; - if ((scf_comtbl.scf_cmd_resend_req & - RESEND_REPORT_SHUT) != 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= - ~RESEND_REPORT_SHUT; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_SHOT_EXEC; - scf_comtbl.scf_last_report = SCF_SHUTDOWN_START; - scf_comtbl.shutdown_start_reported = 1; - } - } - - if ((scf_comtbl.scf_cmd_exec_flag == 0) && - (scf_comtbl.scf_domain_event_sub == EVENT_SUB_DOMAIN_WAIT)) { - /* Send Option disp command */ - scfcmdp->cmd = CMD_DOMAIN_INFO; - scfcmdp->subcmd = SUB_OPTION_DISP; - bzero((void *)&scf_comtbl.scf_sbuf[0], SCF_S_CNT_16); - scf_comtbl.scf_sbuf[13] = - (uchar_t)(scf_scfd_comif_version >> 8); - scf_comtbl.scf_sbuf[14] = (uchar_t)scf_scfd_comif_version; - scfcmdp->sbuf = &scf_comtbl.scf_sbuf[0]; - scfcmdp->scount = SCF_S_CNT_15; - scfcmdp->rbuf = &scf_comtbl.scf_rbuf[0]; - scfcmdp->rcount = SCF_S_CNT_15; - scfcmdp->flag = SCF_USE_SSBUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_DOMAIN) != 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_DOMAIN; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_domain_event_sub = EVENT_SUB_DOMAIN_EXEC; - } - - if (scf_comtbl.scf_cmd_exec_flag == 0) { - /* Check alive check request */ - if (scf_comtbl.scf_alive_event_sub == EVENT_SUB_ALST_WAIT) { - /* Send alive check start command */ - scfcmdp->cmd = CMD_ALIVE_CHECK; - scfcmdp->subcmd = SUB_ALIVE_START; - bzero((void *)&scf_comtbl.scf_sbuf[0], SCF_S_CNT_16); - scf_comtbl.scf_sbuf[0] = scf_alive_watch_code; - scf_comtbl.scf_sbuf[1] = scf_alive_phase_code; - scf_alive_phase_code++; - scf_comtbl.scf_sbuf[2] = scf_alive_interval_time; - scf_comtbl.scf_sbuf[3] = scf_alive_monitor_time; - scf_comtbl.scf_sbuf[4] = - (uchar_t)(scf_alive_panic_time >> 8); - scf_comtbl.scf_sbuf[5] = - (uchar_t)(scf_alive_panic_time); - scfcmdp->sbuf = &scf_comtbl.scf_sbuf[0]; - scfcmdp->scount = SCF_S_CNT_15; - scfcmdp->rcount = 0; - scfcmdp->flag = SCF_USE_S_BUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_ALST) != - 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_ALST; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALST_EXEC; - } else if (scf_comtbl.scf_alive_event_sub == - EVENT_SUB_ALSP_WAIT) { - /* Send alive check stop command */ - scfcmdp->cmd = CMD_ALIVE_CHECK; - scfcmdp->subcmd = SUB_ALIVE_STOP; - scfcmdp->scount = 0; - scfcmdp->rcount = 0; - scfcmdp->flag = SCF_USE_S_BUF; - if ((scf_comtbl.scf_cmd_resend_req & RESEND_ALSP) != - 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_ALSP; - } - scf_i_send_cmd(scfcmdp, statep); - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALSP_EXEC; - } - } - - /* Check send wait */ - if ((scf_comtbl.scf_cmd_exec_flag == 0) && (scf_comtbl.cmd_end_wait)) { - if ((scf_comtbl.scf_cmd_resend_req & RESEND_IOCTL) != 0) { - scf_comtbl.scf_cmd_resend_flag = 1; - scf_comtbl.scf_cmd_resend_req &= ~RESEND_IOCTL; - } - scf_i_send_cmd(scf_comtbl.scf_cmdp, statep); - - scf_comtbl.scf_exec_cmd_id = 1; - } - - /* Signal to command wait */ - if ((scf_comtbl.scf_cmd_exec_flag == 0) && - (scf_comtbl.cmd_busy_wait != 0)) { - scf_comtbl.cmd_busy_wait = 0; - cv_signal(&scf_comtbl.cmdwait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmdwait_cv, - sizeof (kcondvar_t)); - } - -/* - * END_next_cmd_check - */ - END_next_cmd_check: - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_next_rxdata_get() - * - * Description: Next receive data Read processing. - * - */ -void -scf_next_rxdata_get(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_next_rxdata_get() " - scf_state_t *statep; - struct scf_cmd *scfcmdp; - uint32_t sum4; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - uint32_t *wk_in_p32; - uint_t wk_leng; - uint_t rxbuff_cnt; - uint_t rxbuff_offset; - int path_ret; - int ii; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Check command send exec */ - if (scf_comtbl.scf_cmd_exec_flag == 0) { - goto END_next_rxdata_get; - } - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - /* Check SCF path status */ - if (path_ret != SCF_PATH_ONLINE) { - goto END_next_rxdata_get; - } - - /* Check remainder receive data size */ - if (scf_comtbl.scf_rem_rxbuff_size == 0) { - goto END_next_rxdata_get; - } - - - scfcmdp = scf_comtbl.scf_cmdp; - rxbuff_offset = scfcmdp->rbufleng - scf_comtbl.scf_rem_rxbuff_size; - if (scf_comtbl.scf_rem_rxbuff_size > scf_rxbuff_max_size) { - rxbuff_cnt = scf_rxbuff_max_size; - } else { - rxbuff_cnt = scf_comtbl.scf_rem_rxbuff_size; - } - scf_comtbl.scf_rem_rxbuff_size -= rxbuff_cnt; - - /* Receive data copy */ - wk_in_p = (uint8_t *)&statep->scf_sys_sram->DATA[rxbuff_offset]; - wk_out_p = (uint8_t *)&scfcmdp->rbuf[rxbuff_offset]; - for (ii = 0; ii < rxbuff_cnt; ii++, wk_in_p++, wk_out_p++) { - *wk_out_p = SCF_DDI_GET8(statep, statep->scf_sys_sram_handle, - wk_in_p); - } - - /* Check remainder receive data size */ - if (scf_comtbl.scf_rem_rxbuff_size != 0) { - /* Next receive data timer start */ - scf_timer_start(SCF_TIMERCD_NEXTRECV); - goto END_next_rxdata_get; - } - - /* Remainder receive data end */ - scf_comtbl.scf_cmd_exec_flag = 0; - - /* Make SRAM data sum */ - sum4 = SCF_MAGICNUMBER_L; - wk_leng = scfcmdp->rbufleng / 4; - wk_in_p32 = (void *)scfcmdp->rbuf; - for (ii = 0; ii < wk_leng; ii++, wk_in_p32++) { - sum4 += *wk_in_p32; - } - if ((scfcmdp->rbufleng % 4) == 3) { - sum4 += ((scfcmdp->rbuf[scfcmdp->rbufleng - 3] << 24) | - (scfcmdp->rbuf[scfcmdp->rbufleng - 2] << 16) | - (scfcmdp->rbuf[scfcmdp->rbufleng - 1] << 8)); - } else if ((scfcmdp->rbufleng % 4) == 2) { - sum4 += ((scfcmdp->rbuf[scfcmdp->rbufleng - 2] << 24) | - (scfcmdp->rbuf[scfcmdp->rbufleng - 1] << 16)); - } else if ((scfcmdp->rbufleng % 4) == 1) { - sum4 += (scfcmdp->rbuf[scfcmdp->rbufleng - 1] << 24); - } - - SCF_DBG_MAKE_RXSUM_L(sum4, statep->reg_rdata[2]); - - /* Check SRAM data sum */ - if (sum4 == statep->reg_rdata[2]) { - statep->resum_rcnt = 0; - - scf_comtbl.cmd_end_wait = 0; - /* Signal to command end wait */ - cv_signal(&scf_comtbl.cmdend_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmdend_cv, - sizeof (kcondvar_t)); - - /* Next command send check */ - scf_next_cmd_check(statep); - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "next_rx ", 8); - scfcmdp->stat0 = SCF_STAT0_RDATA_SUM; - statep->resum_rcnt++; - - /* Check Rx sum re-try out */ - if (statep->resum_rcnt > scf_resum_rcnt) { - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_RSUMERR); - - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "next_rx ", 8); - cmn_err(CE_WARN, - "%s,Failed the receive data SUM of " - "SRAM. SCF command =0x%02x%02x\n", - &statep->pathname[0], - scfcmdp->subcmd, scfcmdp->cmd); - statep->scf_herr |= HERR_RESUM; - scf_path_change(statep); - } else { - /* Set command wait status */ - scf_cmdwait_status_set(); - - scf_comtbl.scf_cmd_exec_flag = 0; - - /* Next command send check */ - scf_next_cmd_check(statep); - } - } - -/* - * END_next_rxdata_get - */ - END_next_rxdata_get: - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_online_wait_tout() - * - * Description: SCF online monitor timeout processing. - * - */ -void -scf_online_wait_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_online_wait_tout() " - scf_state_t *statep = NULL; - scf_state_t *wkstatep = NULL; - scf_state_t *wait_top_statep = NULL; - int online_flag = 0; - int ii; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Get SCF path status */ - statep = scf_comtbl.scf_exec_p; - if (statep == NULL) { - statep = scf_comtbl.scf_path_p; - } - /* Check SCF path status */ - if (statep == NULL) { - goto END_online_wait_tout; - } - - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "onlin_to", 8); - /* Get SCF status extended register */ - statep->reg_status_exr = SCF_DDI_GET32(statep, - statep->scf_regs_handle, &statep->scf_regs->STATUS_ExR); - SC_DBG_DRV_TRACE(TC_R_STATUS_ExR, __LINE__, - &statep->reg_status_exr, sizeof (statep->reg_status_exr)); - - /* Check SCF status */ - if ((statep->reg_status_exr & STATUS_SCF_STATUS) == STATUS_SCF_ONLINE) { - /* - * SCF online - */ - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF path online"); - if (scf_comtbl.scf_status == SCF_STATUS_OFFLINE) { - cmn_err(CE_NOTE, "%s: SCF online.\n", scf_driver_name); - } - scf_comtbl.scf_status = SCF_STATUS_ONLINE; - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_ONLINE); - - /* DCSP interface start */ - scf_dscp_start(FACTOR_ONLINE); - - /* Check Alive check exec */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALST_WAIT; - } - - /* Check command send exec */ - if (scf_comtbl.scf_cmd_exec_flag) { - /* Set command wait status */ - scf_cmdwait_status_set(); - scf_comtbl.scf_cmd_exec_flag = 0; - } - - scf_comtbl.scf_domain_event_sub = EVENT_SUB_DOMAIN_WAIT; - - /* Next command send check */ - scf_next_cmd_check(statep); - - /* Check next command send */ - if (scf_comtbl.cmd_busy_wait != 0) { - scf_comtbl.cmd_busy_wait = 0; - /* Signal to command wait */ - cv_signal(&scf_comtbl.cmdwait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.cmdwait_cv, sizeof (kcondvar_t)); - } - } else { - /* - * SCF offline - */ - - /* Check standby path */ - if ((wkstatep = scf_comtbl.scf_wait_p) != NULL) { - wait_top_statep = wkstatep; - for (ii = 0; ii < scf_path_change_max; ii++) { - /* Get SCF status extended register */ - wkstatep->reg_status_exr = - SCF_DDI_GET32(wkstatep, - wkstatep->scf_regs_handle, - &wkstatep->scf_regs->STATUS_ExR); - SC_DBG_DRV_TRACE(TC_R_STATUS_ExR, __LINE__, - &wkstatep->reg_status_exr, - sizeof (wkstatep->reg_status_exr)); - - /* Check SCF status */ - if ((wkstatep->reg_status_exr & - STATUS_SCF_STATUS) == - STATUS_SCF_ONLINE) { - /* SCF path change process */ - online_flag = 1; - scf_path_change(wkstatep); - break; - } - - /* SCF path change */ - scf_comtbl.scf_wait_p = wkstatep->next; - scf_chg_scf(wkstatep, PATH_STAT_STANDBY); - - /* Check standby path */ - wkstatep = scf_comtbl.scf_wait_p; - if (wkstatep == NULL) { - /* Not change path */ - break; - } - if (wkstatep != wait_top_statep) { - /* Next SCF path */ - continue; - } else { - /* Not change path */ - break; - } - } - } - - if (online_flag != 0) { - goto END_online_wait_tout; - } - - scf_comtbl.scf_status = SCF_STATUS_OFFLINE; - - statep->online_to_rcnt++; - - /* Check re-try out */ - if (statep->online_to_rcnt < scf_online_wait_rcnt) { - /* SCF online timer start */ - scf_timer_start(SCF_TIMERCD_ONLINE); - goto END_online_wait_tout; - } - - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "onlin_to", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_ONLINETO); - - scf_comtbl.scf_cmd_exec_flag = 0; - - /* Timer stop */ - scf_timer_stop(SCF_TIMERCD_CMDBUSY); - scf_timer_stop(SCF_TIMERCD_CMDEND); - scf_timer_stop(SCF_TIMERCD_ONLINE); - scf_timer_stop(SCF_TIMERCD_NEXTRECV); - scf_timer_stop(SCF_TIMERCD_BUF_FUL); - scf_timer_stop(SCF_TIMERCD_RCI_BUSY); - - if (scf_comtbl.suspend_wait) { - /* Signal to suspend wait */ - scf_comtbl.suspend_wait = 0; - scf_comtbl.scf_suspend_sendstop = 1; - cv_signal(&scf_comtbl.suspend_wait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.suspend_wait_cv, - sizeof (kcondvar_t)); - } - if (scf_comtbl.cmd_end_wait != 0) { - /* Signal to command end wait */ - scf_comtbl.cmd_end_wait = 0; - scf_comtbl.scf_cmdp->stat0 = SCF_STAT0_NOT_PATH; - cv_signal(&scf_comtbl.cmdend_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.cmdend_cv, - sizeof (kcondvar_t)); - } - if (scf_comtbl.cmd_busy_wait != 0) { - /* Signal to command wait */ - scf_comtbl.cmd_busy_wait = 0; - cv_signal(&scf_comtbl.cmdwait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.cmdwait_cv, - sizeof (kcondvar_t)); - } - - /* DCSP interface stop */ - scf_dscp_stop(FACTOR_PATH_STOP); - } - -/* - * END_online_wait_tout - */ - END_online_wait_tout: - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_cmdbusy_tout() - * - * Description: SCF command busy monitor timeout processing. - * - */ -void -scf_cmdbusy_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_cmdbusy_tout() " - scf_state_t *statep; - int path_ret; - uint8_t wk_int8; - uint16_t wk_int16; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - /* Check SCF path status */ - if ((path_ret != SCF_PATH_ONLINE) && (path_ret != SCF_PATH_CHANGE)) { - goto END_cmdbusy_tout; - } - - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "cmdbusy ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_CMDBUSYTO); - - /* Get SCF command register */ - wk_int16 = SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND); - SC_DBG_DRV_TRACE(TC_R_COMMAND, __LINE__, &wk_int16, sizeof (wk_int16)); - wk_int8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND_ExR); - SC_DBG_DRV_TRACE(TC_R_COMMAND_ExR, __LINE__, &wk_int8, - sizeof (wk_int8)); - - /* Check busy flag */ - if (((wk_int16 & COMMAND_BUSY) == 0x0000) && - ((wk_int8 & COMMAND_ExR_BUSY) == 0x00)) { - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF command ready"); - /* Next command send check */ - scf_next_cmd_check(statep); - } else { - statep->devbusy_to_rcnt++; - - /* Check re-try out */ - if (statep->devbusy_to_rcnt < scf_devbusy_wait_rcnt) { - /* SCF online timer start */ - scf_timer_start(SCF_TIMERCD_CMDBUSY); - goto END_cmdbusy_tout; - } - - if ((wk_int16 & COMMAND_BUSY) != 0x0000) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "cmdbusy ", 8); - cmn_err(CE_WARN, - "%s,Busy state of SCF command is " - "not released.\n", &statep->pathname[0]); - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "cmdbusy ", 8); - cmn_err(CE_WARN, - "%s,Busy state of XSCF is not released.\n", - &statep->pathname[0]); - } - statep->scf_herr |= HERR_BUSY_RTO; - scf_path_change(statep); - } - -/* - * END_cmdbusy_tout - */ - END_cmdbusy_tout: - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - -/* - * scf_cmdend_tout() - * - * Description: SCF command complete monitor timeout processing. - * - */ -void -scf_cmdend_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_cmdend_tout() " - scf_state_t *statep; - int path_ret; - struct scf_cmd *scfcmdp; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Get SCF path status */ - path_ret = scf_path_check(&statep); - /* Check SCF path status */ - if ((path_ret != SCF_PATH_ONLINE) && (path_ret != SCF_PATH_CHANGE)) { - goto END_cmdend_tout; - } - - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "cmd_to ", 8); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_CMDTO); - - /* error memo */ - scf_comtbl.memo_cmd_to_cnt++; - statep->memo_cmd_to_cnt++; - - if (scf_comtbl.scf_exec_cmd_id) { - /* Comand send for ioctl */ - scfcmdp = scf_comtbl.scf_cmdp; - } else { - /* Comand send for interrupt */ - scfcmdp = &scf_comtbl.scf_cmd_intr; - } - - statep->cmd_to_rcnt++; - - /* Check re-try out */ - if (statep->cmd_to_rcnt <= scf_cmd_to_rcnt) { - /* Set command wait status */ - scf_cmdwait_status_set(); - - scf_comtbl.scf_cmd_exec_flag = 0; - - /* Next command send check */ - scf_next_cmd_check(statep); - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "cmd_to ", 8); - cmn_err(CE_WARN, - "%s,SCF command timeout occurred. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], - scfcmdp->subcmd, scfcmdp->cmd); - statep->scf_herr |= HERR_CMD_RTO; - scf_path_change(statep); - } - -/* - * END_cmdend_tout - */ - END_cmdend_tout: - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_report_send_wait_tout() - * - * Description: Report command send wait timeout processing. - * - */ -void -scf_report_send_wait_tout(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_report_send_wait_tout() " - scf_state_t *statep; - int next_send = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Get SCF path status */ - (void) scf_path_check(&statep); - /* Check SCF path status */ - if (statep != NULL) { - /* Last send report send */ - if (scf_comtbl.scf_last_report == SCF_SYSTEM_RUNNING) { - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_RUN_WAIT; - next_send = 1; - } else if (scf_comtbl.scf_last_report == - EVENT_SUB_REPORT_SHOT_EXEC) { - scf_comtbl.scf_report_event_sub = - EVENT_SUB_REPORT_SHUT_WAIT; - next_send = 1; - } - if (next_send) { - /* Next command send check */ - scf_next_cmd_check(statep); - } - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_alivecheck_intr() - * - * Description: Alive check timeout interrupt processing. - * - */ -void -scf_alivecheck_intr(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_alivecheck_intr() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Check alive check exec */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_comtbl.scf_alive_int_count--; - - if (scf_comtbl.scf_alive_int_count == 0) { - /* Alive check register set */ - statep->reg_acr = scf_acr_phase_code | ACR_ALIVE_INT; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->ACR, statep->reg_acr); - SC_DBG_DRV_TRACE(TC_W_ACR, __LINE__, &statep->reg_acr, - sizeof (statep->reg_acr)); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->ACR); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "ACR = 0x%02x", - statep->reg_acr); - - scf_acr_phase_code++; - scf_comtbl.scf_alive_int_count = - scf_alive_interval_time / 3; - } - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_path_change() - * - * Description: SCF pass change processing. - * - */ -void -scf_path_change(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_path_change() " - scf_state_t *wkstatep; - scf_state_t *act_statep = NULL; - uint_t path_change = 0; - uint_t halt_flag = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - if (statep->scf_herr != 0) { - act_statep = statep; - - statep->scf_herr |= HERR_EXEC; - - /* Interrupt disable */ - scf_forbid_intr(statep); - - /* Change statep */ - if (scf_comtbl.scf_path_p == statep) { - scf_comtbl.scf_path_p = NULL; - path_change = FACTOR_PATH_HALT; - } else if (scf_comtbl.scf_exec_p == statep) { - scf_comtbl.scf_exec_p = NULL; - path_change = FACTOR_PATH_HALT; - } else { - if ((statep->path_status == PATH_STAT_STANDBY) || - (statep->path_status == PATH_STAT_STOP)) { - scf_del_queue(statep); - } - } - if ((statep->path_status == PATH_STAT_ACTIVE) || - (statep->path_status == PATH_STAT_STANDBY) || - (statep->path_status == PATH_STAT_STOP)) { - scf_chg_scf(statep, PATH_STAT_FAIL); - } - } else { - /* SCF path change interrupt or SCF online wait timeout */ - if (scf_comtbl.scf_exec_p != NULL) { - act_statep = scf_comtbl.scf_exec_p; - } else if (scf_comtbl.scf_path_p != NULL) { - act_statep = scf_comtbl.scf_path_p; - } - if ((act_statep != NULL) && (scf_comtbl.scf_wait_p != NULL)) { - /* Interrupt disable */ - scf_forbid_intr(act_statep); - /* Interrupt enable */ - scf_permit_intr(act_statep, 1); - - scf_comtbl.scf_exec_p = NULL; - scf_comtbl.scf_path_p = NULL; - path_change = FACTOR_PATH_STOP; - - scf_chg_scf(act_statep, PATH_STAT_STANDBY); - } - } - - if (path_change) { - /* FMEMA interface */ - scf_avail_cmd_reg_vaddr = NULL; - - /* Check standby path */ - if ((wkstatep = scf_comtbl.scf_wait_p) != NULL) { - if (path_change == FACTOR_PATH_HALT) { - /* Check SCF path change retry */ - if (scf_comtbl.path_change_rcnt < - scf_path_change_max) { - scf_comtbl.path_change_rcnt++; - } else { - /* SCF path change retry over */ - halt_flag = FACTOR_PATH_HALT; - } - } - } else { - /* Not change path */ - halt_flag = FACTOR_PATH_HALT; - } - - if (halt_flag == 0) { - if (wkstatep != act_statep) { - cmn_err(CE_CONT, - "%s: SCFC path changed. (%s --> %s)\n", - scf_driver_name, - &act_statep->pathname[0], - &wkstatep->pathname[0]); - } - - /* Timer stop */ - scf_timer_stop(SCF_TIMERCD_CMDBUSY); - scf_timer_stop(SCF_TIMERCD_CMDEND); - scf_timer_stop(SCF_TIMERCD_ONLINE); - scf_timer_stop(SCF_TIMERCD_NEXTRECV); - - /* Set command wait status */ - scf_cmdwait_status_set(); - - scf_comtbl.scf_alive_event_sub = EVENT_SUB_NONE; - scf_comtbl.scf_cmd_exec_flag = 0; - /* Send path change */ - scf_comtbl.scf_wait_p = wkstatep->next; - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(wkstatep); - - /* DCSP interface stop */ - scf_dscp_stop(FACTOR_PATH_CHG); - } - } - - if (halt_flag) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "path_chg", 8); - - scf_comtbl.path_change_rcnt = 0; - - scf_comtbl.scf_cmd_exec_flag = 0; - - /* Timer stop */ - scf_timer_stop(SCF_TIMERCD_CMDBUSY); - scf_timer_stop(SCF_TIMERCD_CMDEND); - scf_timer_stop(SCF_TIMERCD_ONLINE); - scf_timer_stop(SCF_TIMERCD_NEXTRECV); - scf_timer_stop(SCF_TIMERCD_BUF_FUL); - scf_timer_stop(SCF_TIMERCD_RCI_BUSY); - - if (scf_comtbl.suspend_wait) { - /* Signal to suspend wait */ - scf_comtbl.suspend_wait = 0; - scf_comtbl.scf_suspend_sendstop = 1; - cv_signal(&scf_comtbl.suspend_wait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.suspend_wait_cv, - sizeof (kcondvar_t)); - } - if (scf_comtbl.cmd_end_wait != 0) { - /* Signal to command end wait */ - scf_comtbl.cmd_end_wait = 0; - scf_comtbl.scf_cmdp->stat0 = SCF_STAT0_NOT_PATH; - cv_signal(&scf_comtbl.cmdend_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.cmdend_cv, sizeof (kcondvar_t)); - } - if (scf_comtbl.cmd_busy_wait != 0) { - /* Signal to command wait */ - scf_comtbl.cmd_busy_wait = 0; - cv_signal(&scf_comtbl.cmdwait_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, - &scf_comtbl.cmdwait_cv, sizeof (kcondvar_t)); - } - - /* DCSP interface stop */ - scf_dscp_stop(halt_flag); - - if (halt_flag == FACTOR_PATH_HALT) { - /* Not change path(SCF HALT) */ - - /* FMEMA interface */ - scf_avail_cmd_reg_vaddr = NULL; - - cmn_err(CE_WARN, - "%s: SCF HALT was detected.\n", - scf_driver_name); - - /* SCF HALT after processing */ - scf_halt(scf_halt_proc_mode); - } - - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_halt() - * - * Description: SCFHALT shutdown/panic processing. - * - */ -void -scf_halt(uint_t mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_halt() " - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - SC_DBG_DRV_TRACE(TC_ERRCD, __LINE__, &mode, sizeof (mode)); - - switch (mode) { - case HALTPROC_SHUTDOWN: - cmn_err(CE_CONT, - "%s: Shutdown was executed.\n", - scf_driver_name); - /* System shutdown start */ - if (scf_comtbl.scf_shutdownreason == 0) { - scf_comtbl.scf_shutdownreason = REASON_SHUTDOWN_HALT; - do_shutdown(); - } - break; - - case HALTPROC_PANIC: - /* System panic */ - cmn_err(CE_PANIC, - "%s: Executed panic by SCF HALT.\n", - scf_driver_name); - break; - - default: - break; - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_panic_callb() - * - * Description: Panic entry processing. - * - */ -/* ARGSUSED */ -void -scf_panic_callb(int code) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_panic_callb() " - scf_state_t *statep; - scf_state_t *save__exec_p; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - unsigned short status; - int counter; - int report_succeeded = 0; - int path_flag = 0; - int path_counter = 0; - int report_counter = 0; - int ii = 0; - int new_report = 0; - int ost; - - SCFDBGMSG1(SCF_DBGFLAG_FOCK, SCF_FUNC_NAME ": start code = %d", - code); - SCF_PANIC_TRACE(__LINE__); - - /* Check panic after */ - if (scf_panic_reported) { - SCF_PANIC_TRACE(__LINE__); - return; - } - - /* Check double panic */ - if (scf_panic_exec_flag) { - SCF_PANIC_TRACE(__LINE__); - return; - } - - /* Check shutdown exec */ - if (scf_comtbl.scf_shutdown_exec_flag) { - SCF_PANIC_TRACE(__LINE__); - return; - } - - /* Set panic exec flag */ - scf_panic_exec_flag = 1; - - save__exec_p = scf_comtbl.scf_exec_p; - /* wait */ - drv_usecwait(SCF_MIL2MICRO(scf_panic_exec_wait_time)); - - if ((statep = scf_comtbl.scf_exec_p) != NULL) { - /* Exec SCF path interrupt disable */ - /* SCF interrupt disable(CR) */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, CONTROL_DISABLE); - /* Register read sync */ - status = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - /* SCF Status register interrupt(STR) : clear */ - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - /* SCF Status extended register(STExR) : interrupt clear */ - SCF_P_DDI_PUT32(statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, 0xffffffff); - - /* DSCP buffer status register(DSR) : interrupt clear */ - SCF_P_DDI_PUT8(statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - - /* SCF interrupt status register(ISR) : interrupt clear */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, - (INT_ST_PATHCHGIE | CONTROL_ALIVEINE)); - status = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - } - - if ((statep = scf_comtbl.scf_path_p) != NULL) { - /* Path change SCF path interrupt disable */ - /* SCF interrupt disable(CR) */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, CONTROL_DISABLE); - /* Register read sync */ - status = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - /* SCF Status register interrupt(STR) : clear */ - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - /* SCF Status extended register(STExR) : interrupt clear */ - SCF_P_DDI_PUT32(statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, 0xffffffff); - - /* DSCP buffer status register(DSR) : interrupt clear */ - SCF_P_DDI_PUT8(statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - - /* SCF interrupt status register(ISR) : interrupt clear */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, - (INT_ST_PATHCHGIE | CONTROL_ALIVEINE)); - status = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - } - - statep = scf_comtbl.scf_wait_p; - while (statep != NULL) { /* Standby SCF path interrupt disable */ - /* SCF interrupt disable(CR) */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, CONTROL_DISABLE); - /* Register read sync */ - status = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - /* SCF Status register interrupt(STR) : clear */ - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - /* SCF Status extended register(STExR) : interrupt clear */ - SCF_P_DDI_PUT32(statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, 0xffffffff); - - /* DSCP buffer status register(DSR) : interrupt clear */ - SCF_P_DDI_PUT8(statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - - /* SCF interrupt status register(ISR) : interrupt clear */ - SCF_P_DDI_PUT16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, - (INT_ST_PATHCHGIE | CONTROL_ALIVEINE)); - status = SCF_P_DDI_GET16(statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - - statep = statep->next; - } - - status = 0; - - /* Check comand exec */ - if (scf_comtbl.scf_cmd_exec_flag == 0) { - statep = scf_comtbl.scf_exec_p; - if (statep == NULL) { - statep = scf_comtbl.scf_path_p; - if (statep == NULL) { - statep = scf_comtbl.scf_wait_p; - if (statep == NULL) { - statep = scf_comtbl.scf_suspend_p; - if (statep) { - ost = statep->old_path_status; - if ((ost != PATH_STAT_ACTIVE) && - (ost != - PATH_STAT_STANDBY)) { - statep = NULL; - } - } - if (statep == NULL) { - /* Not use SCF path */ - SCF_PANIC_TRACE(__LINE__); - goto END_scf_panic_callb; - } - } - path_flag = 1; - } - } - goto START_scf_panic; - } - - statep = scf_comtbl.scf_exec_p; - if (statep == NULL) { - statep = scf_comtbl.scf_path_p; - if (statep == NULL) { - statep = scf_comtbl.scf_wait_p; - if (statep == NULL) { - statep = scf_comtbl.scf_suspend_p; - if (statep) { - ost = statep->old_path_status; - if ((ost != PATH_STAT_ACTIVE) && - (ost != PATH_STAT_STANDBY)) { - statep = NULL; - } - } - if (statep == NULL) { - SCF_PANIC_TRACE(__LINE__); - goto END_scf_panic_callb; - } - } - /* wait */ - drv_usecwait(SCF_MIL2MICRO((scf_cmdend_wait_time_panic * - scf_cmdend_wait_rcnt_panic))); - path_flag = 1; - } - } - if (path_flag == 0) { - for (ii = 0; ii < scf_cmdend_wait_rcnt_panic; ii++) { - /* wait */ - drv_usecwait - (SCF_MIL2MICRO(scf_cmdend_wait_time_panic)); - - /* Get SCF status register */ - status = SCF_P_DDI_GET16(statep->scf_regs_handle, - &statep->scf_regs->STATUS); - scf_panic_trc_status = status; - - if (status & STATUS_CMD_COMPLETE) { - /* Command complete */ - break; - } - } - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - } - -/* - * START_scf_panic - */ - START_scf_panic: - - counter = scf_panic_report_maxretry; - do { -/* - * START_scf_panic_loop - */ - START_scf_panic_loop: - - /* Check SCF path change */ - if (path_flag == 0) { - goto START_report_send; - } - - scf_cmd.cmd = CMD_SCFI_PATH; - scf_cmd.subcmd = SUB_CMD_PATH; - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - sbuf.b[0] = REPORT_STAT_PANIC; - scf_cmd.scount = CMD_PATH_TYPE_SCFD; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - scf_p_send_cmd(&scf_cmd, statep); - - /* Check command complete */ - for (ii = 0; ii < scf_cmdend_wait_rcnt_panic; ii++) { - /* wait */ - drv_usecwait(SCF_MIL2MICRO(scf_cmdend_wait_time_panic)); - - /* Get SCF status register */ - status = SCF_P_DDI_GET16(statep->scf_regs_handle, - &statep->scf_regs->STATUS); - scf_panic_trc_status = status; - - if (status & STATUS_CMD_COMPLETE) { - /* Command complete */ - break; - } - } - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - if (ii == scf_cmdend_wait_rcnt_panic) { - /* Not command complete */ - if (path_counter < 1) { - path_counter++; - goto START_scf_panic_loop; - } - SCF_PANIC_TRACE(__LINE__); - goto END_scf_panic_callb; - } - switch ((status & STATUS_CMD_RTN_CODE) >> 4) { - case NORMAL_END: - counter = scf_panic_report_maxretry; - path_flag = 0; - report_counter = 0; - break; - default: - if (path_counter < 1) { - path_flag = 1; - path_counter++; - goto START_scf_panic_loop; - } - SCF_PANIC_TRACE(__LINE__); - goto END_scf_panic_callb; - } - -/* - * START_report_send - */ - START_report_send: - - if (new_report) { - /* new report panic */ - scf_cmd.cmd = CMD_REPORT; - scf_cmd.subcmd = SUB_SYSTEM_STATUS_RPT_NOPATH; - } else { - /* report panic */ - scf_cmd.cmd = CMD_REPORT; - scf_cmd.subcmd = SUB_SYSTEM_STATUS_RPT; - } - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - sbuf.b[0] = REPORT_STAT_PANIC; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - scf_p_send_cmd(&scf_cmd, statep); - scf_panic_exec_flag2 = 1; - - /* Check command complete */ - for (ii = 0; ii < scf_cmdend_wait_rcnt_panic; ii++) { - /* wait */ - drv_usecwait(SCF_MIL2MICRO(scf_cmdend_wait_time_panic)); - - /* Get SCF status register */ - status = SCF_P_DDI_GET16(statep->scf_regs_handle, - &statep->scf_regs->STATUS); - scf_panic_trc_status = status; - - if (status & STATUS_CMD_COMPLETE) { - /* Command complete */ - break; - } - } - SCF_P_DDI_PUT16(statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - - if (ii == scf_cmdend_wait_rcnt_panic) { - /* Not command complete */ - if (report_counter < 1) { - report_counter++; - goto START_scf_panic_loop; - } - SCF_PANIC_TRACE(__LINE__); - goto END_scf_panic_callb; - } - - switch ((status & STATUS_CMD_RTN_CODE) >> 4) { - case NORMAL_END: - /* command success */ - report_succeeded = 1; - SCF_PANIC_TRACE(__LINE__); - goto END_scf_panic_callb; - - case BUF_FUL: - counter--; - if (counter > 0) { - drv_usecwait(SCF_MIL2MICRO(scf_buf_ful_rtime)); - } - break; - - case RCI_BUSY: - counter--; - if (counter > 0) { - drv_usecwait(SCF_MIL2MICRO(scf_rci_busy_rtime)); - } - break; - - case INTERFACE: - counter--; - break; - - case E_SCFC_NOPATH: - if (new_report == 0) { - path_flag = 1; - path_counter = 0; - goto START_scf_panic_loop; - } - - default: - /* E_NOT_SUPPORT */ - /* E_PARAM */ - /* E_RCI_ACCESS */ - /* RCI_NS */ - goto END_scf_panic_callb; - } - - } while (counter > 0); - -/* - * END_scf_panic_callb - */ - END_scf_panic_callb: - - scf_comtbl.scf_exec_p = save__exec_p; - if (report_succeeded) { - SCF_PANIC_TRACE(__LINE__); - scf_panic_reported = 1; - } else { - SCF_PANIC_TRACE(__LINE__); - cmn_err(CE_WARN, "%s: cannot report PANIC.\n", scf_driver_name); - } - - SCFDBGMSG(SCF_DBGFLAG_FOCK, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_shutdown_callb() - * - * Description: Shutdown entry processing. - * - */ -/* ARGSUSED */ -void -scf_shutdown_callb(int code) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_shutdown_callb() " - scf_state_t *statep; - int ret; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - - SCFDBGMSG1(SCF_DBGFLAG_FOCK, SCF_FUNC_NAME ": start code = %d", - code); - - mutex_enter(&scf_comtbl.all_mutex); - - /* Check panic exec or shutdown exec */ - if ((scf_panic_exec_flag) || (scf_comtbl.scf_shutdown_exec_flag)) { - SCFDBGMSG(SCF_DBGFLAG_SYS, "After Panic or shutdown"); - goto END_scf_shutdown_callb99; - } - - scf_comtbl.scf_shutdown_exec_flag = 1; - - /* SCF command transmit sync stop */ - ret = scf_make_send_cmd(&scf_cmd, SCF_USE_STOP); - if (ret != 0) { - SC_DBG_DRV_TRACE(TC_SHUTDOWN|TC_ERR, __LINE__, "i_ioctl ", 8); - goto END_scf_shutdown_callb; - } - - scf_comtbl.shutdown_start_reported = 1; - - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - sbuf.b[0] = REPORT_STAT_SHUTDOWN_START; - sbuf.b[1] = scf_poff_factor[scf_comtbl.poff_factor][0]; - sbuf.b[2] = scf_poff_factor[scf_comtbl.poff_factor][1]; - sbuf.b[3] = scf_poff_factor[scf_comtbl.poff_factor][2]; - scf_cmd.cmd = CMD_REPORT; - scf_cmd.subcmd = SUB_SYSTEM_STATUS_RPT_NOPATH; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = (SCF_USE_S_BUF | SCF_USE_SP); - scf_comtbl.scf_last_report = SCF_SHUTDOWN_START; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - if (ret != 0) { - SC_DBG_DRV_TRACE(TC_SHUTDOWN|TC_ERR, __LINE__, "shutdown", 8); - goto END_scf_shutdown_callb; - } - /* SCF command send sync re-stop */ - ret = scf_make_send_cmd(&scf_cmd, SCF_USE_STOP); - if (ret != 0) { - SC_DBG_DRV_TRACE(TC_SHUTDOWN|TC_ERR, __LINE__, "shutdown", 8); - goto END_scf_shutdown_callb; - } - - /* Check alive check exec */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - scf_cmd.cmd = CMD_ALIVE_CHECK; - scf_cmd.subcmd = SUB_ALIVE_STOP; - scf_cmd.scount = 0; - scf_cmd.rcount = 0; - scf_cmd.flag = (SCF_USE_S_BUF | SCF_USE_SP); - ret = scf_send_cmd_check_bufful(&scf_cmd); - scf_comtbl.alive_running = SCF_ALIVE_STOP; - if (ret != 0) { - SC_DBG_DRV_TRACE(TC_SHUTDOWN|TC_ERR, __LINE__, - "shutdown", 8); - goto END_scf_shutdown_callb; - } - /* SCF command send sync re-stop */ - ret = scf_make_send_cmd(&scf_cmd, SCF_USE_STOP); - } - -/* - * END_scf_shutdown_callb - */ -END_scf_shutdown_callb: - - if ((statep = scf_comtbl.scf_exec_p) == NULL) { - statep = scf_comtbl.scf_path_p; - } - scf_comtbl.scf_exec_p = 0; - scf_comtbl.scf_path_p = 0; - if (statep) { - /* Exec device interrupt disable */ - scf_forbid_intr(statep); - scf_chg_scf(statep, PATH_STAT_STOP); - } - - while (scf_comtbl.scf_wait_p) { - /* Standby device interrupt disable */ - statep = scf_comtbl.scf_wait_p; - scf_comtbl.scf_wait_p = statep->next; - scf_forbid_intr(statep); - scf_chg_scf(statep, PATH_STAT_STOP); - } - - /* SCF command send sync start */ - (void) scf_make_send_cmd(&scf_cmd, SCF_USE_START); - - /* DCSP interface stop */ - scf_dscp_stop(FACTOR_PATH_STOP); - -/* - * END_scf_shutdown_callb99 - */ -END_scf_shutdown_callb99: - - mutex_exit(&scf_comtbl.all_mutex); - - SCFDBGMSG(SCF_DBGFLAG_FOCK, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_softintr() - * - * Description: Soft interrupt entry processing. (for DSCP callback) - * - */ -/* ARGSUSED */ -uint_t -scf_softintr(caddr_t arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_softintr() " - uint_t ret = DDI_INTR_CLAIMED; - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": start"); - - mutex_enter(&scf_comtbl.si_mutex); - if (scf_comtbl.scf_softintr_dscp_kicked == FLAG_ON) { - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check panic exec and shutdown exec */ - if ((scf_panic_exec_flag == 0) && - (scf_comtbl.scf_shutdown_exec_flag == 0)) { - scf_dscp_callback(); - } - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - scf_comtbl.scf_softintr_dscp_kicked = FLAG_OFF; - } - mutex_exit(&scf_comtbl.si_mutex); - - SCFDBGMSG(SCF_DBGFLAG_DSCP, SCF_FUNC_NAME ": end"); - return (ret); -} - - -/* - * scf_cmdwait_status_set() - * - * Description: Check and setting command status. - * - */ -void -scf_cmdwait_status_set(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_cmdwait_status_set() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Set command wait status */ - if (scf_comtbl.scf_pchg_event_sub == EVENT_SUB_PCHG_EXEC) { - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_PCHG; - } - - if (scf_comtbl.scf_poff_event_sub == EVENT_SUB_POFF_EXEC) { - scf_comtbl.scf_poff_event_sub = EVENT_SUB_POFF_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_POFF; - } - - switch (scf_comtbl.scf_shut_event_sub) { - case EVENT_SUB_SHUT_EXEC: - scf_comtbl.scf_shut_event_sub = EVENT_SUB_SHUT_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_SHUT; - break; - - case EVENT_SUB_EXEC: - scf_comtbl.scf_shut_event_sub = EVENT_SUB_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_SHUT; - break; - - default: - break; - } - - switch (scf_comtbl.scf_alive_event_sub) { - case EVENT_SUB_ALST_EXEC: - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALST_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_ALST; - break; - - case EVENT_SUB_ALSP_EXEC: - scf_comtbl.scf_alive_event_sub = EVENT_SUB_ALSP_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_ALSP; - break; - - default: - break; - } - - switch (scf_comtbl.scf_report_event_sub) { - case EVENT_SUB_REPORT_RUN_EXEC: - scf_comtbl.scf_report_event_sub = EVENT_SUB_REPORT_RUN_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_REPORT_RUN; - break; - - case EVENT_SUB_REPORT_SHOT_EXEC: - scf_comtbl.scf_report_event_sub = EVENT_SUB_REPORT_SHUT_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_REPORT_SHUT; - break; - - default: - break; - } - - /* Set command wait status */ - if (scf_comtbl.scf_domain_event_sub == EVENT_SUB_DOMAIN_EXEC) { - scf_comtbl.scf_domain_event_sub = EVENT_SUB_DOMAIN_WAIT; - - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_DOMAIN; - } - - if (scf_comtbl.scf_cmd_exec_flag) { - if (scf_comtbl.cmd_end_wait) { - /* Set command retry send flag */ - scf_comtbl.scf_cmd_resend_req |= RESEND_IOCTL; - } - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfinit.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,301 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/conf.h> -#include <sys/kmem.h> -#include <sys/devops.h> -#include <sys/modctl.h> -#include <sys/cmn_err.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> - - -/* - * character/block entry point structure - */ -static struct cb_ops scf_cb_ops = { - scf_open, /* open */ - scf_close, /* close */ - nodev, /* strategy */ - nodev, /* print */ - nodev, /* dump */ - nodev, /* read */ - nodev, /* write */ - scf_ioctl, /* ioctl */ - nodev, /* devmap */ - nodev, /* mmap */ - nodev, /* segmap */ - nochpoll, /* poll */ - ddi_prop_op, /* prop_op */ - (struct streamtab *)NULL, /* streamtab */ - D_NEW | D_MP /* flag */ -}; - -/* - * device operations structure - */ -static struct dev_ops scf_dev_ops = { - DEVO_REV, /* dev_ops revision */ - 0, /* reference */ - scf_getinfo, /* getinfo */ - nulldev, /* identify */ - nulldev, /* probe */ - scf_attach, /* attach */ - scf_detach, /* detach */ - nodev, /* reset */ - &scf_cb_ops, /* cb_ops */ - (struct bus_ops *)NULL, /* bus_ops */ - NULL /* power entry */ -}; - -/* - * linkage structure for loadable driver - */ -extern struct mod_ops mod_driverops; -static struct modldrv scf_modldrv = { - &mod_driverops, /* mod_driverops */ - SCF_DRIVER_VERSION, /* version number */ - &scf_dev_ops /* dev_ops */ -}; - -/* - * module linkage structure - */ -static struct modlinkage scf_modlinkage = { - MODREV_1, /* modlinkage revision */ - (void *)&scf_modldrv, /* linkage */ - (void *)NULL /* (end of linkage) */ -}; - -/* - * Function list - */ -void scf_free_resource(void); - -/* - * _init() - * - * Description: Install and initialization processing of module. - * - */ -int -_init(void) -{ -#define SCF_FUNC_NAME "_init() " - int error; - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": start"); - - /* initialize software state */ - error = ddi_soft_state_init(&scfstate, sizeof (scf_state_t), 0); - if (error != 0) { - cmn_err(CE_WARN, "%s: _init: ddi_soft_state_init failed.\n", - scf_driver_name); - goto END_init; - } - - SCF_DBG_DRV_TRACE_INIT; - - /* Last report code initialize */ - scf_comtbl.scf_last_report = NOT_SEND_REPORT; - - /* XSCF status initialize */ - scf_comtbl.scf_status = SCF_STATUS_UNKNOWN; - - /* allocate memory */ - scf_comtbl.report_sensep = - (scfreport_t *)kmem_zalloc((size_t)(sizeof (scfreport_t) * - scf_report_sense_pool_max), KM_SLEEP); - scf_comtbl.getevent_sensep = - (scfevent_t *)kmem_zalloc((size_t)(sizeof (scfevent_t) * - scf_getevent_pool_max), KM_SLEEP); - scf_comtbl.resource_flag |= DID_ALLOCBUF; - - /* initialize mutex */ - mutex_init(&scf_comtbl.attach_mutex, NULL, MUTEX_DRIVER, 0); - scf_comtbl.resource_flag |= DID_MUTEX_ATH; - mutex_init(&scf_comtbl.si_mutex, NULL, MUTEX_DRIVER, 0); - scf_comtbl.resource_flag |= DID_MUTEX_SI; - mutex_init(&scf_comtbl.trc_mutex, NULL, MUTEX_DRIVER, 0); - scf_comtbl.resource_flag |= DID_MUTEX_TRC; - - /* initialize cv */ - cv_init(&scf_comtbl.cmd_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.cmdend_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.cmdwait_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.cmdbusy_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.rsense_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.rdcsense_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.rdctrl_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.getevent_cv, NULL, CV_DRIVER, NULL); - cv_init(&scf_comtbl.suspend_wait_cv, NULL, CV_DRIVER, NULL); - scf_comtbl.resource_flag |= DID_CV; - - /* install module into system */ - error = mod_install(&scf_modlinkage); - if (error != 0) { - cmn_err(CE_WARN, "%s: _init: mod_install failed.\n", - scf_driver_name); - /* release driver resources */ - scf_free_resource(); - } - -/* - * END_init - */ - END_init: - - SCFDBGMSG1(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end return = %d", error); - return (error); -} - - -/* - * _fini() - * - * Description: Remove processing of module. - * - */ -int -_fini(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "_fini() " - int error; - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": start"); - - /* remove module from system */ - error = mod_remove(&scf_modlinkage); - if (error == 0) { - /* release driver resources */ - scf_free_resource(); - } - - SCFDBGMSG1(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end return = %d", error); - return (error); -} - - -/* - * _info() - * - * Description: Return module information. - * - */ -int -_info(struct modinfo *modinfop) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "_info() " - int error; - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": start"); - - /* return module infomarion */ - error = mod_info(&scf_modlinkage, modinfop); - - SCFDBGMSG1(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end return = %d", error); - return (error); -} - - -/* - * scf_free_resource() - * - * Description: Release processing of driver resources. - * - */ -/* ARGSUSED */ -void -scf_free_resource(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_free_resource() " - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": start"); - - SCF_DBG_IOMP_FREE; - - /* System interface area release */ - if (scf_comtbl.report_sensep != NULL) { - kmem_free((void *)scf_comtbl.report_sensep, - (size_t)(sizeof (scfreport_t) * - scf_report_sense_pool_max)); - scf_comtbl.report_sensep = NULL; - } - if (scf_comtbl.getevent_sensep != NULL) { - kmem_free((void *)scf_comtbl.getevent_sensep, - (size_t)(sizeof (scfevent_t) * scf_getevent_pool_max)); - scf_comtbl.getevent_sensep = NULL; - } - scf_comtbl.resource_flag &= (~DID_ALLOCBUF); - - /* destroy cv */ - if (scf_comtbl.resource_flag & DID_CV) { - cv_destroy(&scf_comtbl.cmd_cv); - cv_destroy(&scf_comtbl.cmdend_cv); - cv_destroy(&scf_comtbl.cmdwait_cv); - cv_destroy(&scf_comtbl.cmdbusy_cv); - cv_destroy(&scf_comtbl.rsense_cv); - cv_destroy(&scf_comtbl.rdcsense_cv); - cv_destroy(&scf_comtbl.rdctrl_cv); - cv_destroy(&scf_comtbl.getevent_cv); - cv_destroy(&scf_comtbl.suspend_wait_cv); - scf_comtbl.resource_flag &= (~DID_CV); - } - - /* remove softint */ - if (scf_comtbl.resource_flag & DID_SOFTINTR) { - ddi_remove_softintr(scf_comtbl.scf_softintr_id); - scf_comtbl.resource_flag &= (~DID_SOFTINTR); - } - - /* destroy mutex */ - if (scf_comtbl.resource_flag & DID_MUTEX_TRC) { - mutex_destroy(&scf_comtbl.trc_mutex); - scf_comtbl.resource_flag &= (~DID_MUTEX_TRC); - } - if (scf_comtbl.resource_flag & DID_MUTEX_ALL) { - mutex_destroy(&scf_comtbl.all_mutex); - scf_comtbl.resource_flag &= (~DID_MUTEX_ALL); - } - if (scf_comtbl.resource_flag & DID_MUTEX_SI) { - mutex_destroy(&scf_comtbl.si_mutex); - scf_comtbl.resource_flag &= (~DID_MUTEX_SI); - } - if (scf_comtbl.resource_flag & DID_MUTEX_ATH) { - mutex_destroy(&scf_comtbl.attach_mutex); - scf_comtbl.resource_flag &= (~DID_MUTEX_ATH); - } - - /* release software state */ - ddi_soft_state_fini(&scfstate); - - SCFDBGMSG(SCF_DBGFLAG_DDI, SCF_FUNC_NAME ": end"); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfiomp.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2286 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/file.h> -#include <sys/errno.h> -#include <sys/open.h> -#include <sys/uio.h> -#include <sys/cred.h> -#include <sys/kmem.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> - -#ifdef DEBUG -/* - * Function list - */ -void scf_add_scf(scf_state_t *statep); -void scf_del_scf(scf_state_t *statep); -int scf_meta_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, - cred_t *cred_p, int *rval_p, int u_mode); -int scf_inst_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, - cred_t *cred_p, int *rval_p, int u_mode); -void scf_inst_getstat32(scf_state_t *statep, - struct fiompstatus_32 *status32_p, char *message_p, int flag); -void scf_inst_getstat(scf_state_t *statep, - struct fiompstatus *status_p, char *message_p, int flag); -void scf_path_stmsg(scf_state_t *statep, char *message_p); - -/* - * External function - */ -extern void scf_dscp_stop(uint32_t factor); - - -/* - * Multi path control table add - */ -void -scf_add_scf(scf_state_t *statep) -{ -#define SCF_FUNC_NAME "scf_add_scf() " - scf_state_t **iomp_scf; - int alloc_size; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start instance = %d", - statep->instance); - - alloc_size = (sizeof (scf_state_t *) * (statep->instance + 1)); - if (alloc_size < (sizeof (scf_state_t *) * SCF_MAX_INSTANCE)) { - alloc_size = (sizeof (scf_state_t *) * SCF_MAX_INSTANCE); - } - if ((scf_comtbl.alloc_size < alloc_size) || - (scf_comtbl.iomp_scf == 0)) { - /* IOMP control table re-get */ - iomp_scf = (scf_state_t **)kmem_zalloc((size_t)(alloc_size), - KM_SLEEP); - if (scf_comtbl.alloc_size != 0) { - bcopy(scf_comtbl.iomp_scf, iomp_scf, - scf_comtbl.alloc_size); - kmem_free((void *)scf_comtbl.iomp_scf, - (size_t)scf_comtbl.alloc_size); - } - scf_comtbl.iomp_scf = iomp_scf; - scf_comtbl.alloc_size = alloc_size; - } - scf_comtbl.iomp_scf[statep->instance] = statep; - /* SCF path count up */ - if (scf_comtbl.path_num < (statep->instance + 1)) { - scf_comtbl.path_num = statep->instance + 1; - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - -/* - * Multi path control table delete - */ -void -scf_del_scf(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_del_scf() " - int ii; - int path_num = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start instance = %d", - statep->instance); - - scf_comtbl.iomp_scf[statep->instance] = 0; - - /* SCF path count up */ - for (ii = 0; ii < scf_comtbl.alloc_size / sizeof (scf_state_t *); - ii++) { - if (scf_comtbl.iomp_scf[ii]) { - path_num = scf_comtbl.iomp_scf[ii]->instance + 1; - } - } - scf_comtbl.path_num = path_num; - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * Meta management ioctl - */ -/* ARGSUSED */ -int -scf_meta_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, - int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_meta_ioctl() " - int ret = 0; - int all_num; - int path_num; - - SCFDBGMSG1(SCF_DBGFLAG_IOMP, - SCF_FUNC_NAME ": start cmd = 0x%08x", (uint_t)cmd); - - switch ((unsigned int)cmd) { - case FIOMPNEW: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPNEW proc"); - - ret = ENOTTY; - break; - - case FIOMPENCAP: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPENCAP proc"); - - ret = ENOTTY; - break; - - case FIOMPDEVINFO: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPDEVINFO proc"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - struct fiomp_devinfo_32 *fiomp_devinfo32_p; - - fiomp_devinfo32_p = - (struct fiomp_devinfo_32 *)kmem_zalloc - ((size_t)(sizeof (struct fiomp_devinfo_32)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, - (void *)fiomp_devinfo32_p, - sizeof (struct fiomp_devinfo_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - goto END_DEVINFO32; - } - if (fiomp_devinfo32_p->inst_no != 0) { - /* Invalid inst_no */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EINVAL; - goto END_DEVINFO32; - } - mutex_enter(&scf_comtbl.attach_mutex); - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - path_num = 0; - } else { - /* Is attach device */ - mutex_enter(&scf_comtbl.all_mutex); - - path_num = scf_comtbl.path_num; - - mutex_exit(&scf_comtbl.all_mutex); - } - mutex_exit(&scf_comtbl.attach_mutex); - /* Set output information */ - strcpy(fiomp_devinfo32_p->real_name, SCF_REAL_NAME); - strcpy(fiomp_devinfo32_p->user_path, SCF_USER_PATH); - fiomp_devinfo32_p->path_num = path_num; - fiomp_devinfo32_p->mpmode = FIOMP_FALSE; - fiomp_devinfo32_p->autopath = FIOMP_TRUE; - fiomp_devinfo32_p->block = FIOMP_TRUE; - fiomp_devinfo32_p->needsync = FIOMP_FALSE; - if (ddi_copyout((void *)fiomp_devinfo32_p, - (void *)arg, sizeof (struct fiomp_devinfo_32), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_DEVINFO32 - */ - END_DEVINFO32: - - if (fiomp_devinfo32_p) { - kmem_free((void *)fiomp_devinfo32_p, - (size_t)(sizeof (struct fiomp_devinfo_32))); - } - } else { - /* DDI_MODEL_NONE */ - struct fiomp_devinfo *fiomp_devinfo_p; - - fiomp_devinfo_p = - (struct fiomp_devinfo *)kmem_zalloc - ((size_t)(sizeof (struct fiomp_devinfo)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)fiomp_devinfo_p, - sizeof (struct fiomp_devinfo), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - goto END_DEVINFO; - } - if (fiomp_devinfo_p->inst_no != 0) { - /* Invalid inst_no */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EINVAL; - goto END_DEVINFO; - } - mutex_enter(&scf_comtbl.attach_mutex); - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - path_num = 0; - } else { - /* Is attach device */ - mutex_enter(&scf_comtbl.all_mutex); - - path_num = scf_comtbl.path_num; - - mutex_exit(&scf_comtbl.all_mutex); - } - mutex_exit(&scf_comtbl.attach_mutex); - /* Set output information */ - strcpy(fiomp_devinfo_p->real_name, - SCF_REAL_NAME); - strcpy(fiomp_devinfo_p->user_path, - SCF_USER_PATH); - fiomp_devinfo_p->path_num = path_num; - fiomp_devinfo_p->mpmode = FIOMP_FALSE; - fiomp_devinfo_p->autopath = FIOMP_TRUE; - fiomp_devinfo_p->block = FIOMP_TRUE; - fiomp_devinfo_p->needsync = FIOMP_FALSE; - if (ddi_copyout((void *)fiomp_devinfo_p, - (void *)arg, sizeof (struct fiomp_devinfo), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_DEVINFO - */ - END_DEVINFO: - - if (fiomp_devinfo_p) { - kmem_free((void *)fiomp_devinfo_p, - (size_t)(sizeof (struct fiomp_devinfo))); - } - } - break; - - case FIOMPALLINSTNUM: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPALLINSTNUM proc"); - - mutex_enter(&scf_comtbl.attach_mutex); - /* Set output information */ - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - all_num = 0; - } else { - /* Is attach device */ - all_num = 1; - } - mutex_exit(&scf_comtbl.attach_mutex); - if (ddi_copyout((void *)&all_num, (void *)arg, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - } - break; - - case FIOMPALLDEVINFO: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPALLDEVINFO proc"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - struct fiomp_all_devinfo_32 fiomp_all_devinfo32; - struct fiomp_devinfo_32 *fiomp_devinfo32_p; - - fiomp_devinfo32_p = - (struct fiomp_devinfo_32 *)kmem_zalloc - ((size_t)(sizeof (struct fiomp_devinfo_32)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)&fiomp_all_devinfo32, - sizeof (struct fiomp_all_devinfo_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "m_ioctl ", 8); - ret = EFAULT; - goto END_ALLDEVINFO32; - } - if (fiomp_all_devinfo32.num != 1) { - /* Set 1 in num */ - fiomp_all_devinfo32.num = 1; - } else { - if (ddi_copyin((void *)(uintptr_t)fiomp_all_devinfo32.devinfo, - (void *)fiomp_devinfo32_p, - sizeof (struct fiomp_devinfo_32), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - goto END_ALLDEVINFO32; - } - mutex_enter(&scf_comtbl.attach_mutex); - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - path_num = 0; - } else { - /* Is attach device */ - mutex_enter(&scf_comtbl.all_mutex); - - path_num = scf_comtbl.path_num; - - mutex_exit(&scf_comtbl.all_mutex); - } - mutex_exit(&scf_comtbl.attach_mutex); - /* Set output information */ - fiomp_devinfo32_p->inst_no = 0; - strcpy(fiomp_devinfo32_p->real_name, SCF_REAL_NAME); - strcpy(fiomp_devinfo32_p->user_path, SCF_USER_PATH); - fiomp_devinfo32_p->path_num = path_num; - fiomp_devinfo32_p->mpmode = FIOMP_FALSE; - fiomp_devinfo32_p->autopath = FIOMP_TRUE; - fiomp_devinfo32_p->block = FIOMP_TRUE; - fiomp_devinfo32_p->needsync = FIOMP_FALSE; - if (ddi_copyout((void *)fiomp_devinfo32_p, - (void *)(uintptr_t)fiomp_all_devinfo32.devinfo, - sizeof (struct fiomp_devinfo_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - goto END_ALLDEVINFO32; - } - } - if (ddi_copyout((void *)&fiomp_all_devinfo32, (void *)arg, - sizeof (struct fiomp_all_devinfo_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "m_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_ALLDEVINFO32 - */ - END_ALLDEVINFO32: - - if (fiomp_devinfo32_p) { - kmem_free((void *)fiomp_devinfo32_p, - (size_t)(sizeof (struct fiomp_devinfo_32))); - } - } else { - /* DDI_MODEL_NONE */ - struct fiomp_all_devinfo fiomp_all_devinfo; - struct fiomp_devinfo *fiomp_devinfo_p; - - fiomp_devinfo_p = - (struct fiomp_devinfo *)kmem_zalloc - ((size_t)(sizeof (struct fiomp_devinfo)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)&fiomp_all_devinfo, - sizeof (struct fiomp_all_devinfo), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "m_ioctl ", 8); - ret = EFAULT; - goto END_ALLDEVINFO; - } - if (fiomp_all_devinfo.num != 1) { - /* Set 1 in num */ - fiomp_all_devinfo.num = 1; - } else { - if (ddi_copyin((void *)fiomp_all_devinfo.devinfo, - (void *)fiomp_devinfo_p, - sizeof (struct fiomp_devinfo), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - goto END_ALLDEVINFO; - } - mutex_enter(&scf_comtbl.attach_mutex); - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - path_num = 0; - } else { - /* Is attach device */ - mutex_enter(&scf_comtbl.all_mutex); - - path_num = scf_comtbl.path_num; - - mutex_exit(&scf_comtbl.all_mutex); - } - mutex_exit(&scf_comtbl.attach_mutex); - /* Set output information */ - fiomp_devinfo_p->inst_no = 0; - strcpy(fiomp_devinfo_p->real_name, SCF_REAL_NAME); - strcpy(fiomp_devinfo_p->user_path, SCF_USER_PATH); - fiomp_devinfo_p->path_num = path_num; - fiomp_devinfo_p->mpmode = FIOMP_FALSE; - fiomp_devinfo_p->autopath = FIOMP_TRUE; - fiomp_devinfo_p->block = FIOMP_TRUE; - fiomp_devinfo_p->needsync = FIOMP_FALSE; - if (ddi_copyout((void *)fiomp_devinfo_p, - (void *)fiomp_all_devinfo.devinfo, - sizeof (struct fiomp_devinfo), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "m_ioctl ", 8); - ret = EFAULT; - goto END_ALLDEVINFO; - } - } - if (ddi_copyout((void *)&fiomp_all_devinfo, (void *)arg, - sizeof (struct fiomp_all_devinfo), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "m_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_ALLDEVINFO - */ - END_ALLDEVINFO: - - if (fiomp_devinfo_p) { - kmem_free((void *)fiomp_devinfo_p, - (size_t)(sizeof (struct fiomp_devinfo))); - } - } - break; - - case FIOMPGETEVENT: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPGETEVENT proc"); - - ret = ENOTTY; - break; - - default: - /* undefined */ - SCFDBGMSG(SCF_DBGFLAG_IOMP, "undefined ioctl command"); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "m_ioctl ", 8); - ret = ENOTTY; - } - -/* - * END_meta_ioctl - */ - END_meta_ioctl: - - SCFDBGMSG1(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - -/* - * Instans management ioctl - */ -/* ARGSUSED */ -int -scf_inst_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, - int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_inst_ioctl() " - scf_state_t *statep; - scf_state_t *wkstatep; - struct scf_cmd scf_cmd; - int ret = 0; - int all_num; - int pathnum; - int ii; - int jj; - int num_cmp_flag = 0; - int alloc_num; - - SCFDBGMSG1(SCF_DBGFLAG_IOMP, - SCF_FUNC_NAME ": start cmd = 0x%08x", (uint_t)cmd); - - mutex_enter(&scf_comtbl.attach_mutex); - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - mutex_exit(&scf_comtbl.attach_mutex); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = ENXIO; - goto END_inst_ioctl; - } - mutex_exit(&scf_comtbl.attach_mutex); - - switch ((unsigned int)cmd) { - case FIOMPMAXPATHNUM: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPMAXPATHNUM proc"); - - mutex_enter(&scf_comtbl.all_mutex); - /* Set output information */ - all_num = scf_comtbl.path_num; - mutex_exit(&scf_comtbl.all_mutex); - if (ddi_copyout((void *)&all_num, (void *)arg, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - } - break; - - case FIOMPSETPROP: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPSETPROP proc"); - - ret = ENOTTY; - break; - - case FIOMPGETPROP: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPGETPROP proc"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - struct fiompprop_32 fiompprop32; - char *work_name_p = 0; - char *iomp_name_p = 0; - char *iomp_real_name_p = 0; - char *iomp_user_path_p = 0; - char *iomp_status_p = 0; - caddr32_t *iomp_path_p = 0; - caddr32_t *iomp_logical_path_p = 0; - caddr32_t *iomp_path_status_p = 0; - caddr32_t *iomp_path_block_p = 0; - char *iomp_path = 0; - char *iomp_logical_path = 0; - char *iomp_path_status = 0; - char *iomp_path_block = 0; - - if (ddi_copyin((void *)arg, (void *)&fiompprop32, - sizeof (struct fiompprop_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - alloc_num = fiompprop32.num; - iomp_name_p = (char *)kmem_zalloc((size_t)(FIOMP_MAX_STR), - KM_SLEEP); - iomp_real_name_p = (char *)kmem_zalloc((size_t)(FIOMP_MAX_STR), - KM_SLEEP); - iomp_user_path_p = (char *)kmem_zalloc((size_t)(FIOMP_MAX_STR), - KM_SLEEP); - iomp_status_p = (char *)kmem_zalloc((size_t)(FIOMP_MAX_STR), - KM_SLEEP); - if (fiompprop32.num != 0) { - /* buffer allocation */ - work_name_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - iomp_path_p = (caddr32_t *)kmem_zalloc - ((size_t)((sizeof (caddr32_t)) * alloc_num), KM_SLEEP); - iomp_logical_path_p = (caddr32_t *)kmem_zalloc - ((size_t)((sizeof (caddr32_t)) * alloc_num), KM_SLEEP); - iomp_path_status_p = (caddr32_t *)kmem_zalloc - ((size_t)((sizeof (caddr32_t)) * alloc_num), KM_SLEEP); - iomp_path_block_p = (caddr32_t *)kmem_zalloc - ((size_t)((sizeof (caddr32_t)) * alloc_num), KM_SLEEP); - iomp_path = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - iomp_logical_path = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - iomp_path_status = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - iomp_path_block = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - } - - mutex_enter(&scf_comtbl.all_mutex); - if (fiompprop32.num != scf_comtbl.path_num) { - /* - * When different from appointed num, perform only num setting - */ - fiompprop32.num = scf_comtbl.path_num; - num_cmp_flag = 1; - } else { - /* Set output information */ - strcpy(iomp_name_p, SCF_IOMP_NAME); - strcpy(iomp_real_name_p, SCF_REAL_NAME); - strcpy(iomp_user_path_p, SCF_USER_PATH); - if ((scf_comtbl.scf_path_p) || (scf_comtbl.scf_exec_p)) { - strcpy(iomp_status_p, "online"); - } else if ((scf_comtbl.scf_stop_p) || - (scf_comtbl.scf_err_p)) { - strcpy(iomp_status_p, "offline"); - } else { - strcpy(iomp_status_p, "unconfigured"); - } - for (ii = 0, jj = 0; ii < fiompprop32.num; - ii++, jj += FIOMP_MAX_STR) { - /* Output information setting every pass */ - iomp_path[jj] = '\0'; - iomp_logical_path[jj] = '\0'; - iomp_path_status[jj] = '\0'; - iomp_path_block[jj] = '\0'; - if ((statep = scf_comtbl.iomp_scf[ii]) != 0) { - if (ddi_pathname(statep->dip, - work_name_p)) { - sprintf(&iomp_path[jj], "%s:scfc%d", - work_name_p, statep->instance); - } - sprintf(&iomp_logical_path[jj], - "/dev/FJSVhwr/scfc%d", - statep->instance); - switch (statep->path_status) { - case FIOMP_STAT_ACTIVE: - strcpy(&iomp_path_status[jj], - "active"); - break; - case FIOMP_STAT_STANDBY: - strcpy(&iomp_path_status[jj], - "standby"); - break; - case FIOMP_STAT_STOP: - strcpy(&iomp_path_status[jj], - "stop"); - break; - case FIOMP_STAT_FAIL: - strcpy(&iomp_path_status[jj], - "fail"); - break; - case FIOMP_STAT_DISCON: - strcpy(&iomp_path_status[jj], - "disconnected"); - break; - default: - strcpy(&iomp_path_status[jj], - "empty"); - } - strcpy(&iomp_path_block[jj], "block"); - } - } - } - mutex_exit(&scf_comtbl.all_mutex); - if (num_cmp_flag == 0) { - if (ddi_copyout((void *)iomp_name_p, - (void *)(uintptr_t)fiompprop32.iomp_name, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - if (ddi_copyout((void *)iomp_real_name_p, - (void *)(uintptr_t)fiompprop32.iomp_real_name, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - if (ddi_copyout((void *)iomp_user_path_p, - (void *)(uintptr_t)fiompprop32.iomp_user_path, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - if (ddi_copyout((void *)iomp_status_p, - (void *)(uintptr_t)fiompprop32.iomp_status, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - if (fiompprop32.num) { - if (fiompprop32.iomp_path) { - if (ddi_copyin((void *)(uintptr_t)fiompprop32.iomp_path, - (void *)iomp_path_p, - ((sizeof (caddr32_t)) * fiompprop32.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - if (fiompprop32.iomp_logical_path) { - if (ddi_copyin((void *)(uintptr_t)fiompprop32.iomp_logical_path, - (void *)iomp_logical_path_p, - ((sizeof (caddr32_t)) * fiompprop32.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - if (fiompprop32.iomp_path_status) { - if (ddi_copyin((void *)(uintptr_t)fiompprop32.iomp_path_status, - (void *)iomp_path_status_p, - ((sizeof (caddr32_t)) * fiompprop32.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - if (fiompprop32.iomp_path_block) { - if (ddi_copyin((void *)(uintptr_t)fiompprop32.iomp_path_block, - (void *)iomp_path_block_p, - ((sizeof (caddr32_t)) * fiompprop32.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - } - for (ii = 0, jj = 0; ii < fiompprop32.num; - ii++, jj += FIOMP_MAX_STR) { - if (iomp_path_p[ii]) { - if (ddi_copyout((void *)&iomp_path[jj], - (void *)(uintptr_t)iomp_path_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - if (iomp_logical_path_p[ii]) { - if (ddi_copyout((void *)&iomp_logical_path[jj], - (void *)(uintptr_t)iomp_logical_path_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - if (iomp_path_status_p[ii]) { - if (ddi_copyout((void *)&iomp_path_status[jj], - (void *)(uintptr_t)iomp_path_status_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - if (iomp_path_block_p[ii]) { - if (ddi_copyout((void *)&iomp_path_block[jj], - (void *)(uintptr_t)iomp_path_block_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP32; - } - } - } - } - if (ddi_copyout((void *)&fiompprop32, (void *)arg, - sizeof (struct fiompprop_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_GETPROP32 - */ - END_GETPROP32: - - /* Buffer release */ - if (work_name_p) { - kmem_free((void *)work_name_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_name_p) { - kmem_free((void *)iomp_name_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_real_name_p) { - kmem_free((void *)iomp_real_name_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_user_path_p) { - kmem_free((void *)iomp_user_path_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_status_p) { - kmem_free((void *)iomp_status_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_path_p) { - kmem_free((void *)iomp_path_p, - (size_t)((sizeof (caddr32_t)) * alloc_num)); - } - if (iomp_logical_path_p) { - kmem_free((void *)iomp_logical_path_p, - (size_t)((sizeof (caddr32_t)) * alloc_num)); - } - if (iomp_path_status_p) { - kmem_free((void *)iomp_path_status_p, - (size_t)((sizeof (caddr32_t)) * alloc_num)); - } - if (iomp_path_block_p) { - kmem_free((void *)iomp_path_block_p, - (size_t)((sizeof (caddr32_t)) * alloc_num)); - } - if (iomp_path) { - kmem_free((void *)iomp_path, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - if (iomp_logical_path) { - kmem_free((void *)iomp_logical_path, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - if (iomp_path_status) { - kmem_free((void *)iomp_path_status, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - if (iomp_path_block) { - kmem_free((void *)iomp_path_block, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - } else { - /* DDI_MODEL_NONE */ - struct fiompprop fiompprop; - char *work_name_p = 0; - char *iomp_name_p = 0; - char *iomp_real_name_p = 0; - char *iomp_user_path_p = 0; - char *iomp_status_p = 0; - caddr_t *iomp_path_p = 0; - caddr_t *iomp_logical_path_p = 0; - caddr_t *iomp_path_status_p = 0; - caddr_t *iomp_path_block_p = 0; - char *iomp_path = 0; - char *iomp_logical_path = 0; - char *iomp_path_status = 0; - char *iomp_path_block = 0; - - if (ddi_copyin((void *)arg, (void *)&fiompprop, - sizeof (struct fiompprop), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - alloc_num = fiompprop.num; - if (fiompprop.num != 0) { - /* Buffer allocation */ - work_name_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - iomp_name_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - iomp_real_name_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - iomp_user_path_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - iomp_status_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - iomp_path_p = (caddr_t *)kmem_zalloc - ((size_t)((sizeof (caddr_t)) * alloc_num), KM_SLEEP); - iomp_logical_path_p = (caddr_t *)kmem_zalloc - ((size_t)((sizeof (caddr_t)) * alloc_num), KM_SLEEP); - iomp_path_status_p = (caddr_t *)kmem_zalloc - ((size_t)((sizeof (caddr_t)) * alloc_num), KM_SLEEP); - iomp_path_block_p = (caddr_t *)kmem_zalloc - ((size_t)((sizeof (caddr_t)) * alloc_num), KM_SLEEP); - iomp_path = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - iomp_logical_path = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - iomp_path_status = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - iomp_path_block = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - } - - mutex_enter(&scf_comtbl.all_mutex); - if (fiompprop.num != scf_comtbl.path_num) { - /* - * When different from appointed num, perform only num setting - */ - fiompprop.num = scf_comtbl.path_num; - num_cmp_flag = 1; - } else { - /* Set output information */ - strcpy(iomp_name_p, SCF_IOMP_NAME); - strcpy(iomp_real_name_p, SCF_REAL_NAME); - strcpy(iomp_user_path_p, SCF_USER_PATH); - if ((scf_comtbl.scf_path_p) || (scf_comtbl.scf_exec_p)) { - strcpy(iomp_status_p, "online"); - } else if ((scf_comtbl.scf_stop_p) || (scf_comtbl.scf_err_p)) { - strcpy(iomp_status_p, "offline"); - } else { - strcpy(iomp_status_p, "unconfigured"); - } - for (ii = 0, jj = 0; ii < fiompprop.num; - ii++, jj += FIOMP_MAX_STR) { - /* Output information setting every pass */ - iomp_path[jj] = '\0'; - iomp_logical_path[jj] = '\0'; - iomp_path_status[jj] = '\0'; - iomp_path_block[jj] = '\0'; - if ((statep = scf_comtbl.iomp_scf[ii]) != 0) { - if (ddi_pathname(statep->dip, work_name_p)) { - sprintf(&iomp_path[jj], "%s:scfc%d", - work_name_p, statep->instance); - } - sprintf(&iomp_logical_path[jj], - "/dev/FJSVhwr/scfc%d", - statep->instance); - switch (statep->path_status) { - case FIOMP_STAT_ACTIVE: - strcpy(&iomp_path_status[jj], - "active"); - break; - case FIOMP_STAT_STANDBY: - strcpy(&iomp_path_status[jj], - "standby"); - break; - case FIOMP_STAT_STOP: - strcpy(&iomp_path_status[jj], - "stop"); - break; - case FIOMP_STAT_FAIL: - strcpy(&iomp_path_status[jj], - "fail"); - break; - case FIOMP_STAT_DISCON: - strcpy(&iomp_path_status[jj], - "disconnected"); - break; - default: - strcpy(&iomp_path_status[jj], - "empty"); - } - strcpy(&iomp_path_block[jj], "block"); - } - } - } - mutex_exit(&scf_comtbl.all_mutex); - if (num_cmp_flag == 0) { - if (ddi_copyout((void *)iomp_name_p, - (void *)fiompprop.iomp_name, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - if (ddi_copyout((void *)iomp_real_name_p, - (void *)fiompprop.iomp_real_name, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - if (ddi_copyout((void *)iomp_user_path_p, - (void *)fiompprop.iomp_user_path, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - if (ddi_copyout((void *)iomp_status_p, - (void *)fiompprop.iomp_status, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - if (fiompprop.num) { - if (fiompprop.iomp_path) { - if (ddi_copyin((void *)fiompprop.iomp_path, - (void *)iomp_path_p, - ((sizeof (caddr_t)) * fiompprop.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - if (fiompprop.iomp_logical_path) { - if (ddi_copyin((void *)fiompprop.iomp_logical_path, - (void *)iomp_logical_path_p, - ((sizeof (caddr_t)) * fiompprop.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - if (fiompprop.iomp_path_status) { - if (ddi_copyin((void *)fiompprop.iomp_path_status, - (void *)iomp_path_status_p, - ((sizeof (caddr_t)) * fiompprop.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - if (fiompprop.iomp_path_block) { - if (ddi_copyin((void *)fiompprop.iomp_path_block, - (void *)iomp_path_block_p, - ((sizeof (caddr_t)) * fiompprop.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - } - for (ii = 0, jj = 0; ii < fiompprop.num; - ii++, jj += FIOMP_MAX_STR) { - if (iomp_path_p[ii]) { - if (ddi_copyout((void *)&iomp_path[jj], - (void *)iomp_path_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - if (iomp_logical_path_p[ii]) { - if (ddi_copyout((void *)&iomp_logical_path[jj], - (void *)iomp_logical_path_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - if (iomp_path_status_p[ii]) { - if (ddi_copyout((void *)&iomp_path_status[jj], - (void *)iomp_path_status_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - if (iomp_path_block_p[ii]) { - if (ddi_copyout((void *)&iomp_path_block[jj], - (void *)iomp_path_block_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_GETPROP; - } - } - } - } - if (ddi_copyout((void *)&fiompprop, (void *)arg, - sizeof (struct fiompprop), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_GETPROP - */ - END_GETPROP: - - /* Buffer release */ - if (work_name_p) { - kmem_free((void *)work_name_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_name_p) { - kmem_free((void *)iomp_name_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_real_name_p) { - kmem_free((void *)iomp_real_name_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_user_path_p) { - kmem_free((void *)iomp_user_path_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_status_p) { - kmem_free((void *)iomp_status_p, (size_t)FIOMP_MAX_STR); - } - if (iomp_path_p) { - kmem_free((void *)iomp_path_p, - (size_t)((sizeof (caddr_t)) * alloc_num)); - } - if (iomp_logical_path_p) { - kmem_free((void *)iomp_logical_path_p, - (size_t)((sizeof (caddr_t)) * alloc_num)); - } - if (iomp_path_status_p) { - kmem_free((void *)iomp_path_status_p, - (size_t)((sizeof (caddr_t)) * alloc_num)); - } - if (iomp_path_block_p) { - kmem_free((void *)iomp_path_block_p, - (size_t)((sizeof (caddr_t)) * alloc_num)); - } - if (iomp_path) { - kmem_free((void *)iomp_path, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - if (iomp_logical_path) { - kmem_free((void *)iomp_logical_path, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - if (iomp_path_status) { - kmem_free((void *)iomp_path_status, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - if (iomp_path_block) { - kmem_free((void *)iomp_path_block, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - } - break; - - case FIOMPDESTROY: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPDESTROY proc"); - ret = ENOTTY; - break; - - case FIOMPSTOP: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPSTOP proc"); - - if (ddi_copyin((void *)arg, (void *)&pathnum, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - mutex_enter(&scf_comtbl.all_mutex); - if (pathnum == FIOMP_PATH_ALL) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - - mutex_exit(&scf_comtbl.all_mutex); - goto END_inst_ioctl; - } else { - /* PATH appointment */ - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid PATH */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - - mutex_exit(&scf_comtbl.all_mutex); - goto END_inst_ioctl; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - /* SCF command send sync stop */ - ret = scf_make_send_cmd(&scf_cmd, SCF_USE_STOP); - if (ret != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - goto END_STOP; - } - if ((statep->path_status != FIOMP_STAT_ACTIVE) && - (statep->path_status != FIOMP_STAT_STANDBY)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - } else { - if (statep->path_status == FIOMP_STAT_ACTIVE) { - /* Exec SCF device appointment */ - if (scf_comtbl.scf_wait_p == 0) { - /* Last deveice stop is error */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EINVAL; - } else { - /* Device interrupt disable */ - scf_forbid_intr(statep); - scf_chg_scf(statep, FIOMP_STAT_STOP); - /* Send path change command */ - statep = scf_comtbl.scf_wait_p; - scf_comtbl.scf_wait_p = statep->next; - scf_chg_scf(statep, FIOMP_STAT_ACTIVE); - scf_comtbl.scf_exec_p = 0; - scf_comtbl.scf_path_p = 0; - scf_comtbl.scf_pchg_event_sub = - EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(statep); - - /* DCSP interface stop */ - scf_dscp_stop(FACTOR_PATH_CHG); - } - } else { - /* Not exec device appointment */ - scf_del_queue(statep); - scf_forbid_intr(statep); - scf_chg_scf(statep, FIOMP_STAT_STOP); - } - } -/* - * END_STOP - */ - END_STOP: - - /* SCF command send sync start */ - (void) scf_make_send_cmd(&scf_cmd, SCF_USE_START); - } else { - /* Appointed path is already out of managemen */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EINVAL; - } - } - mutex_exit(&scf_comtbl.all_mutex); - break; - - case FIOMPSTART: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPSTART proc"); - - if (ddi_copyin((void *)arg, (void *)&pathnum, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - mutex_enter(&scf_comtbl.all_mutex); - if (pathnum == FIOMP_PATH_ALL) { - /* PATH_ALL appointment */ - if ((statep = scf_comtbl.scf_stop_p) != 0) { - /* Check stop queue */ - scf_comtbl.scf_stop_p = 0; - while (statep) { - wkstatep = statep->next; - /* Interupt disable */ - scf_permit_intr(statep, 1); - if ((scf_comtbl.scf_path_p) || - (scf_comtbl.scf_exec_p)) { - scf_chg_scf(statep, FIOMP_STAT_STANDBY); - } else { - if (scf_comtbl.watchdog_after_resume) { - scf_comtbl.alive_running = SCF_ALIVE_START; - scf_comtbl.watchdog_after_resume = 0; - } - scf_chg_scf(statep, FIOMP_STAT_ACTIVE); - /* Send path change command */ - scf_comtbl.scf_exec_p = 0; - scf_comtbl.scf_path_p = 0; - - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(statep); - } - statep = wkstatep; - } - } - } else { - /* PATH appointment */ - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid PATH */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_inst_ioctl; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - if (statep->path_status == FIOMP_STAT_STOP) { - /* Check stop queue */ - scf_del_queue(statep); - /* Interrupt enable */ - scf_permit_intr(statep, 1); - if ((scf_comtbl.scf_path_p) || - (scf_comtbl.scf_exec_p)) { - scf_chg_scf(statep, FIOMP_STAT_STANDBY); - } else { - if (scf_comtbl.watchdog_after_resume) { - scf_comtbl.alive_running = SCF_ALIVE_START; - scf_comtbl.watchdog_after_resume = 0; - } - scf_chg_scf(statep, FIOMP_STAT_ACTIVE); - /* Send path change command */ - scf_comtbl.scf_exec_p = 0; - scf_comtbl.scf_path_p = 0; - scf_comtbl.scf_pchg_event_sub = EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(statep); - } - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EINVAL; - } - } else { - /* Appointed path is already out of managemen */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - } - } - mutex_exit(&scf_comtbl.all_mutex); - break; - - case FIOMPRECOVER: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPRECOVER proc"); - - if (ddi_copyin((void *)arg, (void *)&pathnum, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - mutex_enter(&scf_comtbl.all_mutex); - if (pathnum == FIOMP_PATH_ALL) { - /* PATH_ALL appointment */ - - /* Check fail queue */ - if ((statep = scf_comtbl.scf_err_p) != 0) { - scf_comtbl.scf_err_p = 0; - while (statep) { - wkstatep = statep->next; - /* Interrupt enable */ - scf_forbid_intr(statep); - statep->scf_herr = 0; - statep->tesum_rcnt = 0; - statep->resum_rcnt = 0; - statep->cmd_to_rcnt = 0; - scf_chg_scf(statep, FIOMP_STAT_STOP); - statep = wkstatep; - } - } - } else { - /* PATH appointment */ - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid PATH */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_inst_ioctl; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - if (statep->path_status == FIOMP_STAT_FAIL) { - scf_del_queue(statep); - scf_forbid_intr(statep); - statep->scf_herr = 0; - statep->tesum_rcnt = 0; - statep->resum_rcnt = 0; - statep->cmd_to_rcnt = 0; - scf_chg_scf(statep, FIOMP_STAT_STOP); - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EINVAL; - } - } else { - /* Appointed path is already out of managemen */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - } - } - mutex_exit(&scf_comtbl.all_mutex); - break; - - case FIOMPLIST: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPLIST proc"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - struct fiompdev_32 fiompdev32; - char *work_name_p = 0; - caddr32_t *devs_p = 0; - char *devs = 0; - - if (ddi_copyin((void *)arg, (void *)&fiompdev32, - sizeof (struct fiompdev_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - if (fiompdev32.api_level != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EINVAL; - goto END_inst_ioctl; - } - alloc_num = fiompdev32.num; - if (fiompdev32.num != 0) { - /* Buffer allocation */ - work_name_p = (char *)kmem_zalloc((size_t)(FIOMP_MAX_STR), - KM_SLEEP); - devs_p = (caddr32_t *)kmem_zalloc - ((size_t)((sizeof (caddr32_t)) * alloc_num), KM_SLEEP); - devs = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - } - - mutex_enter(&scf_comtbl.all_mutex); - if (fiompdev32.num != scf_comtbl.path_num) { - /* - * When different from appointed num, perform only num setting - */ - fiompdev32.num = scf_comtbl.path_num; - num_cmp_flag = 1; - } else { - /* Set output information */ - fiompdev32.inst_no = 0; - fiompdev32.inst_minor = SCF_INST_INSTANCE; - fiompdev32.user_minor = SCF_USER_INSTANCE; - fiompdev32.mpmode = FIOMP_FALSE; - fiompdev32.autopath = FIOMP_TRUE; - fiompdev32.needsync = FIOMP_FALSE; - for (ii = 0, jj = 0; ii < fiompdev32.num; - ii++, jj += FIOMP_MAX_STR) { - /* Output information setting every pass */ - devs[jj] = '\0'; - if ((statep = scf_comtbl.iomp_scf[ii]) != 0) { - if (ddi_pathname(statep->dip, work_name_p)) { - sprintf(&devs[jj], "%s:scfc%d", - work_name_p, statep->instance); - } - } - } - } - mutex_exit(&scf_comtbl.all_mutex); - if ((num_cmp_flag == 0) && (fiompdev32.num != 0)) { - if (fiompdev32.devs) { - if (ddi_copyin((void *)(uintptr_t)fiompdev32.devs, - (void *)devs_p, - ((sizeof (caddr32_t)) * fiompdev32.num), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_LIST32; - } - } - for (ii = 0, jj = 0; ii < fiompdev32.num; - ii++, jj += FIOMP_MAX_STR) { - if (devs_p[ii]) { - if (ddi_copyout((void *)&devs[jj], - (void *)(uintptr_t)devs_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_LIST32; - } - } - } - } - if (ddi_copyout((void *)&fiompdev32, (void *)arg, - sizeof (struct fiompdev_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_LIST32 - */ - END_LIST32: - - /* Buffer release */ - if (work_name_p) { - kmem_free((void *)work_name_p, (size_t)FIOMP_MAX_STR); - } - if (devs_p) { - kmem_free((void *)devs_p, - (size_t)((sizeof (caddr32_t)) * alloc_num)); - } - if (devs) { - kmem_free((void *)devs, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - } else { - /* DDI_MODEL_NONE */ - struct fiompdev fiompdev; - char *work_name_p = 0; - caddr_t *devs_p = 0; - char *devs = 0; - - if (ddi_copyin((void *)arg, (void *)&fiompdev, - sizeof (struct fiompdev), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - if (fiompdev.api_level != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EINVAL; - goto END_inst_ioctl; - } - alloc_num = fiompdev.num; - if (fiompdev.num != 0) { - /* Buffer allocation */ - work_name_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - devs_p = (caddr_t *)kmem_zalloc - ((size_t)((sizeof (caddr_t)) * alloc_num), KM_SLEEP); - devs = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - } - - mutex_enter(&scf_comtbl.all_mutex); - if (fiompdev.num != scf_comtbl.path_num) { - /* - * When different from appointed num, perform only num setting - */ - fiompdev.num = scf_comtbl.path_num; - num_cmp_flag = 1; - } else { - /* Set output information */ - fiompdev.inst_no = 0; - fiompdev.inst_minor = SCF_INST_INSTANCE; - fiompdev.user_minor = SCF_USER_INSTANCE; - fiompdev.mpmode = FIOMP_FALSE; - fiompdev.autopath = FIOMP_TRUE; - fiompdev.needsync = FIOMP_FALSE; - for (ii = 0, jj = 0; ii < fiompdev.num; - ii++, jj += FIOMP_MAX_STR) { - /* Output information setting every pass */ - devs[jj] = '\0'; - if ((statep = scf_comtbl.iomp_scf[ii]) != 0) { - if (ddi_pathname(statep->dip, work_name_p)) { - sprintf(&devs[jj], "%s:scfc%d", - work_name_p, statep->instance); - } - } - } - } - mutex_exit(&scf_comtbl.all_mutex); - if ((num_cmp_flag == 0) && (fiompdev.num != 0)) { - if (fiompdev.devs) { - if (ddi_copyin((void *)fiompdev.devs, - (void *)devs_p, - ((sizeof (caddr_t)) * fiompdev.num), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_LIST; - } - } - for (ii = 0, jj = 0; ii < fiompdev.num; - ii++, jj += FIOMP_MAX_STR) { - if (devs_p[ii]) { - if (ddi_copyout((void *)&devs[jj], - (void *)devs_p[ii], - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_LIST; - } - } - } - } - if (ddi_copyout((void *)&fiompdev, (void *)arg, - sizeof (struct fiompdev), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_LIST - */ - END_LIST: - - /* Buffer release */ - if (work_name_p) { - kmem_free((void *)work_name_p, (size_t)FIOMP_MAX_STR); - } - if (devs_p) { - kmem_free((void *)devs_p, - (size_t)((sizeof (caddr_t)) * alloc_num)); - } - if (devs) { - kmem_free((void *)devs, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - } - break; - - case FIOMPSTATUS: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPSTATUS proc"); - - if (u_mode == DDI_MODEL_ILP32) { /* DDI_MODEL_ILP32 */ - struct fiompstatus_32 fiompstatus32; - char *message_p; - - message_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)&fiompstatus32, - sizeof (struct fiompstatus_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_STATUS32; - } - pathnum = fiompstatus32.pathnum; - if (pathnum == FIOMP_PATH_ALL) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - goto END_STATUS32; - } - mutex_enter(&scf_comtbl.all_mutex); - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid path */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_STATUS32; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - scf_inst_getstat32(statep, &fiompstatus32, - message_p, 1); - } else { - /* - * Appointed path is already out of management - */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_STATUS32; - } - mutex_exit(&scf_comtbl.all_mutex); - if (ddi_copyout((void *)message_p, - (void *)(uintptr_t)fiompstatus32.message, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_STATUS32; - } - - if (ddi_copyout((void *)&fiompstatus32, (void *)arg, - sizeof (struct fiompstatus_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_STATUS32 - */ - END_STATUS32: - - if (message_p) { - kmem_free((void *)message_p, - (size_t)FIOMP_MAX_STR); - } - } else { /* DDI_MODEL_NONE */ - struct fiompstatus fiompstatus; - char *message_p; - - message_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR), KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)&fiompstatus, - sizeof (struct fiompstatus), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_STATUS; - } - pathnum = fiompstatus.pathnum; - if (pathnum == FIOMP_PATH_ALL) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - goto END_STATUS; - } - mutex_enter(&scf_comtbl.all_mutex); - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid path */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_STATUS; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - scf_inst_getstat(statep, &fiompstatus, - message_p, 1); - } else { - /* - * Appointed path is already out of managemen - */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_STATUS; - } - mutex_exit(&scf_comtbl.all_mutex); - if (ddi_copyout((void *)message_p, - (void *)fiompstatus.message, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_STATUS; - } - - if (ddi_copyout((void *)&fiompstatus, - (void *)arg, sizeof (struct fiompstatus), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_STATUS - */ - END_STATUS: - - if (message_p) { - kmem_free((void *)message_p, - (size_t)FIOMP_MAX_STR); - } - } - break; - - case FIOMPADD: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPADD proc"); - - ret = ENOTTY; - break; - - case FIOMPDEL: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPDEL proc"); - - ret = ENOTTY; - break; - - case FIOMPACTIVE: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPACTIVE proc"); - - ret = ENOTTY; - break; - - case FIOMPDISCONNECT: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPDISCONNECT proc"); - - if (ddi_copyin((void *)arg, (void *)&pathnum, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - mutex_enter(&scf_comtbl.all_mutex); - if (pathnum == FIOMP_PATH_ALL) { - /* PATH_ALL appointment */ - - /* Check stop queue */ - if ((statep = scf_comtbl.scf_stop_p) != 0) { - scf_comtbl.scf_stop_p = 0; - while (statep) { - wkstatep = statep->next; - scf_chg_scf(statep, FIOMP_STAT_DISCON); - statep = wkstatep; - } - } - /* Check fail queue */ - if ((statep = scf_comtbl.scf_err_p) != 0) { - scf_comtbl.scf_err_p = 0; - while (statep) { - wkstatep = statep->next; - scf_chg_scf(statep, FIOMP_STAT_DISCON); - statep = wkstatep; - } - } - } else { - /* PATH appointment */ - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid path */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_inst_ioctl; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - if ((statep->path_status == FIOMP_STAT_STOP) || - (statep->path_status == - FIOMP_STAT_FAIL)) { - scf_del_queue(statep); - scf_chg_scf(statep, FIOMP_STAT_DISCON); - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EINVAL; - } - } else { - /* Appointed path is already out of managemen */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - } - } - - mutex_exit(&scf_comtbl.all_mutex); - break; - - case FIOMPCONNECT: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPCONNECT proc"); - - if (ddi_copyin((void *)arg, (void *)&pathnum, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - mutex_enter(&scf_comtbl.all_mutex); - if (pathnum == FIOMP_PATH_ALL) { - /* PATH_ALL appointment */ - - /* Check disconnect queue */ - if ((statep = scf_comtbl.scf_disc_p) != 0) { - scf_comtbl.scf_disc_p = 0; - while (statep) { - wkstatep = statep->next; - if (statep->scf_herr) { - scf_chg_scf(statep, - FIOMP_STAT_FAIL); - } else { - scf_chg_scf(statep, - FIOMP_STAT_STOP); - } - statep = wkstatep; - } - } - } else { - /* PATH appointment */ - if (scf_comtbl.path_num < (pathnum + 1)) { - /* Invalid path */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - mutex_exit(&scf_comtbl.all_mutex); - goto END_inst_ioctl; - } - if ((statep = scf_comtbl.iomp_scf[pathnum]) != 0) { - if (statep->path_status == FIOMP_STAT_DISCON) { - scf_del_queue(statep); - if (statep->scf_herr) { - scf_chg_scf(statep, - FIOMP_STAT_FAIL); - } else { - scf_chg_scf(statep, - FIOMP_STAT_STOP); - } - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, - __LINE__, "i_ioctl ", 8); - ret = EINVAL; - } - } else { - /* Appointed path is already out of managemen */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EINVAL; - } - } - mutex_exit(&scf_comtbl.all_mutex); - break; - - case FIOMPSTANDBY: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPSTANDBY proc"); - - ret = ENOTTY; - break; - - case FIOMPBLOCK: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPBLOCK proc"); - - ret = ENOTTY; - break; - - case FIOMPUNBLOCK: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPUNBLOCK proc"); - - ret = ENOTTY; - break; - - case FIOMPDIAGON: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPDIAGON proc"); - - ret = ENOTTY; - break; - - case FIOMPDIAGOFF: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPDIAGOFF proc"); - - ret = ENOTTY; - break; - - case FIOMPGETALLSTAT: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPGETALLSTAT proc"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - struct fiomp_all_stat_32 fiomp_all_stat32; - struct fiompstatus_32 *fiompstatus32_p = 0; - char *message_p = 0; - - if (ddi_copyin((void *)arg, (void *)&fiomp_all_stat32, - sizeof (struct fiomp_all_stat_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - alloc_num = fiomp_all_stat32.num; - if (fiomp_all_stat32.num != 0) { - /* Buffer allocation */ - fiompstatus32_p = - (struct fiompstatus_32 *)kmem_zalloc - ((size_t)((sizeof (struct fiompstatus_32)) * alloc_num), - KM_SLEEP); - message_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - } - - if (fiomp_all_stat32.num != 0) { - if (ddi_copyin((void *)(uintptr_t)fiomp_all_stat32.status, - (void *)fiompstatus32_p, - ((sizeof (struct fiompstatus_32)) * - fiomp_all_stat32.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETALLSTAT32; - } - } - mutex_enter(&scf_comtbl.all_mutex); - if (scf_comtbl.path_num != fiomp_all_stat32.num) { - /* - * When different from appointed num, perform only num setting - */ - fiomp_all_stat32.num = scf_comtbl.path_num; - num_cmp_flag = 1; - } else { - /* Output information setting every pass */ - for (ii = 0, jj = 0; ii < fiomp_all_stat32.num; - ii++, jj += FIOMP_MAX_STR) { - statep = scf_comtbl.iomp_scf[ii]; - scf_inst_getstat32(statep, &fiompstatus32_p[ii], - &message_p[jj], 1); - } - } - mutex_exit(&scf_comtbl.all_mutex); - if (num_cmp_flag == 0 && fiomp_all_stat32.num != 0) { - if (ddi_copyout((void *)fiompstatus32_p, - (void *)(uintptr_t)fiomp_all_stat32.status, - ((sizeof (struct fiompstatus_32)) * - fiomp_all_stat32.num), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETALLSTAT32; - } - for (ii = 0, jj = 0; ii < fiomp_all_stat32.num; - ii++, jj += FIOMP_MAX_STR) { - if (ddi_copyout((void *)&message_p[jj], - (void *)(uintptr_t)fiompstatus32_p[ii].message, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETALLSTAT32; - } - } - } - if (ddi_copyout((void *)&fiomp_all_stat32, (void *)arg, - sizeof (struct fiomp_all_stat_32), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_GETALLSTAT32 - */ - END_GETALLSTAT32: - - /* Buffer release */ - if (fiompstatus32_p) { - kmem_free((void *)fiompstatus32_p, - (size_t)((sizeof (struct fiompstatus_32)) * alloc_num)); - } - if (message_p) { - kmem_free((void *)message_p, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - } else { - /* DDI_MODEL_NONE */ - struct fiomp_all_stat fiomp_all_stat; - struct fiompstatus *fiompstatus_p = 0; - char *message_p = 0; - - if (ddi_copyin((void *)arg, (void *)&fiomp_all_stat, - sizeof (struct fiomp_all_stat), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - goto END_inst_ioctl; - } - alloc_num = fiomp_all_stat.num; - if (fiomp_all_stat.num != 0) { - /* Buffer allocation */ - fiompstatus_p = - (struct fiompstatus *)kmem_zalloc - ((size_t)((sizeof (struct fiompstatus)) * alloc_num), - KM_SLEEP); - message_p = (char *)kmem_zalloc - ((size_t)(FIOMP_MAX_STR * alloc_num), KM_SLEEP); - } - - if (fiomp_all_stat.num != 0) { - if (ddi_copyin((void *)fiomp_all_stat.status, - (void *)fiompstatus_p, - ((sizeof (struct fiompstatus)) * fiomp_all_stat.num), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETALLSTAT; - } - } - mutex_enter(&scf_comtbl.all_mutex); - if (scf_comtbl.path_num != fiomp_all_stat.num) { - /* - * When different from appointed num, perform only num setting - */ - fiomp_all_stat.num = scf_comtbl.path_num; - num_cmp_flag = 1; - } else { - /* Output information setting every pass */ - for (ii = 0, jj = 0; ii < fiomp_all_stat.num; - ii++, jj += FIOMP_MAX_STR) { - statep = scf_comtbl.iomp_scf[ii]; - scf_inst_getstat(statep, &fiompstatus_p[ii], - &message_p[jj], 1); - } - } - mutex_exit(&scf_comtbl.all_mutex); - if (num_cmp_flag == 0 && fiomp_all_stat.num != 0) { - if (ddi_copyout((void *)fiompstatus_p, - (void *)fiomp_all_stat.status, - ((sizeof (struct fiompstatus)) * fiomp_all_stat.num), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETALLSTAT; - } - for (ii = 0, jj = 0; ii < fiomp_all_stat.num; - ii++, jj += FIOMP_MAX_STR) { - if (ddi_copyout((void *)&message_p[jj], - (void *)fiompstatus_p[ii].message, - FIOMP_MAX_STR, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "i_ioctl ", 8); - ret = EFAULT; - goto END_GETALLSTAT; - } - } - } - if (ddi_copyout((void *)&fiomp_all_stat, (void *)arg, - sizeof (struct fiomp_all_stat), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = EFAULT; - } - -/* - * END_GETALLSTAT - */ - END_GETALLSTAT: - - /* Buffer release */ - if (fiompstatus_p) { - kmem_free((void *)fiompstatus_p, - (size_t)((sizeof (struct fiompstatus)) * alloc_num)); - } - if (message_p) { - kmem_free((void *)message_p, - (size_t)(FIOMP_MAX_STR * alloc_num)); - } - } - break; - - case FIOMPCHG: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPCHG proc"); - - ret = ENOTTY; - break; - - case FIOMPGETEVENT: - SCFDBGMSG(SCF_DBGFLAG_IOMP, "FIOMPGETEVENT proc"); - - ret = ENOTTY; - break; - - default: - /* undefined */ - SCFDBGMSG(SCF_DBGFLAG_IOMP, "undefined ioctl command"); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "i_ioctl ", 8); - ret = ENOTTY; - } - -/* - * END_inst_ioctl - */ - END_inst_ioctl: - - SCFDBGMSG1(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - -/* - * Make path status : FIOMPSTATUS, FIOMPGETALLSTAT : 32bit-64bit - */ -void -scf_inst_getstat32(scf_state_t *statep, struct fiompstatus_32 *status32_p, - char *message_p, int flag) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_inst_getstat32() " - int path_status; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": start"); - - if (statep) { - if (flag) { - /* Current status */ - path_status = statep->path_status; - } else { - /* Former status */ - path_status = statep->old_path_status; - } - /* Set status */ - switch (path_status) { - case FIOMP_STAT_ACTIVE: - status32_p->status = FIOMP_STAT_ACTIVE; - break; - case FIOMP_STAT_STANDBY: - status32_p->status = FIOMP_STAT_STANDBY; - break; - case FIOMP_STAT_STOP: - status32_p->status = FIOMP_STAT_STOP; - break; - case FIOMP_STAT_DISCON: - status32_p->status = FIOMP_STAT_DISCON; - break; - case FIOMP_STAT_FAIL: - status32_p->status = FIOMP_STAT_FAIL; - break; - default: - status32_p->status = FIOMP_STAT_EMPTY; - } - /* IOMP details message making */ - scf_path_stmsg(statep, message_p); - } else { - status32_p->status = FIOMP_STAT_EMPTY; - message_p[0] = '\0'; - } - status32_p->block_status = FIOMP_BSTAT_BLOCK; - - SCFDBGMSG(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": end"); -} - -/* - * Make path status : FIOMPSTATUS, FIOMPGETALLSTAT : 64bit-64bit/32bit-32bit - */ -void -scf_inst_getstat(scf_state_t *statep, struct fiompstatus *status_p, - char *message_p, int flag) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_inst_getstat() " - int path_status; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": start"); - - if (statep) { - if (flag) { - /* Current status */ - path_status = statep->path_status; - } else { - /* Former status */ - path_status = statep->old_path_status; - } - /* Set status */ - switch (path_status) { - case FIOMP_STAT_ACTIVE: - status_p->status = FIOMP_STAT_ACTIVE; - break; - case FIOMP_STAT_STANDBY: - status_p->status = FIOMP_STAT_STANDBY; - break; - case FIOMP_STAT_STOP: - status_p->status = FIOMP_STAT_STOP; - break; - case FIOMP_STAT_DISCON: - status_p->status = FIOMP_STAT_DISCON; - break; - case FIOMP_STAT_FAIL: - status_p->status = FIOMP_STAT_FAIL; - break; - default: - status_p->status = FIOMP_STAT_EMPTY; - } - /* IOMP details message making */ - scf_path_stmsg(statep, message_p); - } else { - status_p->status = FIOMP_STAT_EMPTY; - message_p[0] = '\0'; - } - status_p->block_status = FIOMP_BSTAT_BLOCK; - - SCFDBGMSG(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": end"); -} - -/* - * IOMP details message making - */ -void -scf_path_stmsg(scf_state_t *statep, char *message_p) - -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_path_stmsg() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": start"); - - if (statep->scf_herr & HERR_TESUM) { - strcpy(message_p, "Command error"); - } else if (statep->scf_herr & HERR_RESUM) { - strcpy(message_p, "Sumcheck error"); - } else if (statep->scf_herr & HERR_CMD_RTO) { - strcpy(message_p, "Command timeout"); - } else if (statep->scf_herr & HERR_BUSY_RTO) { - strcpy(message_p, "Command busy timeout"); - } else if (statep->scf_herr & HERR_DSCP_INTERFACE) { - strcpy(message_p, "SCF communication path error"); - } else if (statep->scf_herr & HERR_DSCP_ACKTO) { - strcpy(message_p, "DSCP ack response timeout"); - } else if (statep->scf_herr & HERR_DSCP_ENDTO) { - strcpy(message_p, "DSCP end response timeout"); - } else { - strcpy(message_p, "Good"); - } - - SCFDBGMSG(SCF_DBGFLAG_IOMP, SCF_FUNC_NAME ": end"); -} -#endif
--- a/usr/src/uts/sun4u/opl/io/scfd/scfkstat.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,219 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/kmem.h> -#include <sys/file.h> -#include <sys/errno.h> -#include <sys/open.h> -#include <sys/cred.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> -#include <sys/kstat.h> - -#include <sys/scfd/scfparam.h> - - -/* - * for kstat_named_create(9F) - */ -typedef struct _scf_kstat_named_list { - char *name; - uchar_t data_type; -} scf_kstat_named_list; - -static scf_kstat_named_list scf_kstat_system_list[] = { - {SCF_STATUS_KSTAT_NAMED, KSTAT_DATA_CHAR}, - {SCF_BOOT_MODE_KSTAT_NAMED, KSTAT_DATA_CHAR}, - {SCF_SECURE_MODE_KSTAT_NAMED, KSTAT_DATA_CHAR}, - {SCF_EVENT_KSTAT_NAMED, KSTAT_DATA_CHAR}, - {SCF_ALIVE_KSTAT_NAMED, KSTAT_DATA_CHAR}, -}; - - -/* - * prototype - */ -static kstat_t *scf_kstat_named_init(char *name, - scf_kstat_named_list *kstat_list, int ndata, - int (*update)(struct kstat *, int)); -static int scf_kstat_sys_update(kstat_t *ksp, int rw); - - -/* - * from scf_attach() - */ -/* DDI_ATTACH */ -void -scf_kstat_init() -{ -#define SCF_FUNC_NAME "scf_kstat_init() " - scf_kstat_private_t *private; - - ASSERT(MUTEX_HELD(&scf_comtbl.attach_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": start"); - - private = scf_comtbl.kstat_private = - kmem_zalloc(sizeof (scf_kstat_private_t), KM_SLEEP); - - /* NAMED state */ - private->ksp_scf = scf_kstat_named_init(SCF_SYSTEM_KSTAT_NAME, - scf_kstat_system_list, SCF_KSTAT_SYS_NAMED_NDATA, - scf_kstat_sys_update); - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": end"); -} - - -/* - * from scf_detach() - */ -/* DDI_DETACH */ -void -scf_kstat_fini() -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_kstat_fini() " - scf_kstat_private_t *private = scf_comtbl.kstat_private; - - ASSERT(MUTEX_HELD(&scf_comtbl.attach_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": start"); - - if (private->ksp_scf != NULL) { - kstat_delete(private->ksp_scf); - } - - kmem_free(private, sizeof (scf_kstat_private_t)); - - scf_comtbl.kstat_private = NULL; - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_kstat_named_init() - * kstat_create(KSTAT_TYPE_NAMED) + kstat_named_init() + kstat_install() - */ -static kstat_t * -scf_kstat_named_init(char *name, scf_kstat_named_list *kstat_list, int ndata, - int (*update)(struct kstat *, int)) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_kstat_named_init() " - kstat_t *scf_ksp; - kstat_named_t *scf_named_ksp; - int ii; - - ASSERT(MUTEX_HELD(&scf_comtbl.attach_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": start"); - - scf_ksp = kstat_create(SCF_DRIVER_NAME, 0, name, "misc", - KSTAT_TYPE_NAMED, ndata, KSTAT_FLAG_PERSISTENT); - if (scf_ksp == NULL) { - cmn_err(CE_WARN, "%s: kstat_create failed.", scf_driver_name); - return (NULL); - } - scf_named_ksp = (kstat_named_t *)(scf_ksp->ks_data); - - /* - * initialize the named kstat - */ - for (ii = 0; ii < ndata; ii++, scf_named_ksp++) { - kstat_named_init(scf_named_ksp, kstat_list[ii].name, - kstat_list[ii].data_type); - } - - scf_ksp->ks_update = update; - scf_ksp->ks_lock = (void *)&(scf_comtbl.all_mutex); - - scf_ksp->ks_private = &scf_comtbl; - - kstat_install(scf_ksp); - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": end"); - return (scf_ksp); -} - - -/* - * "scf" update - */ -static int -scf_kstat_sys_update(kstat_t *ksp, int rw) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_kstat_sys_update() " - kstat_named_t *sysksp; - scf_comtbl_t *softsp; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": start"); - - sysksp = (kstat_named_t *)ksp->ks_data; - softsp = (scf_comtbl_t *)ksp->ks_private; - - /* this is a read-only kstat */ - if (rw == KSTAT_WRITE) { - return (EACCES); - } - - if (softsp->scf_status == SCF_STATUS_ONLINE) { - sysksp[SCF_KSTAT_SYS_NAMED_STATUS].value.c[0] = - SCF_STAT_STATUS_ONLINE; - } else { - sysksp[SCF_KSTAT_SYS_NAMED_STATUS].value.c[0] = - SCF_STAT_STATUS_OFFLINE; - } - - if ((softsp->scf_mode_sw & STATUS_BOOT_MODE) == STATUS_MODE_AUTO_BOOT) { - sysksp[SCF_KSTAT_SYS_NAMED_BOOT_MODE].value.c[0] = - SCF_STAT_MODE_LOCK; - } else { - sysksp[SCF_KSTAT_SYS_NAMED_BOOT_MODE].value.c[0] = - SCF_STAT_MODE_UNLOCK; - } - - if ((softsp->scf_mode_sw & STATUS_SECURE_MODE) == STATUS_MODE_LOCK) { - sysksp[SCF_KSTAT_SYS_NAMED_SECURE_MODE].value.c[0] = - SCF_STAT_MODE_AUTO_BOOT; - } else { - sysksp[SCF_KSTAT_SYS_NAMED_SECURE_MODE].value.c[0] = - SCF_STAT_MODE_OBP_STOP; - } - - sysksp[SCF_KSTAT_SYS_NAMED_EVENT].value.c[0] = - (char)softsp->last_event[4]; - sysksp[SCF_KSTAT_SYS_NAMED_ALIVE].value.c[0] = - softsp->alive_running; - - SCFDBGMSG(SCF_DBGFLAG_KSTAT, SCF_FUNC_NAME ": end"); - return (0); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfops.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3401 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/file.h> -#include <sys/errno.h> -#include <sys/open.h> -#include <sys/uio.h> -#include <sys/cred.h> -#include <sys/kmem.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> -#include <sys/scfd/scfio32.h> - -/* - * Function list - */ -int scf_open(dev_t *devp, int flag, int otyp, cred_t *cred_p); -int scf_close(dev_t dev, int flag, int otyp, cred_t *cred_p); -int scf_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, - int *rval_p); -int scf_ioc_reportstat(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_clearlcd(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_wrlcd(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_getdiskled(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_setdiskled(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_getsdownreason(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_optiondisp(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_getpciconfig(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_hac(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_hstadrsinfo(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_rdclistmax(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_rdclistx(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_rdctrl(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_opecall(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_getreport(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_rcipwr(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_panicreq(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_panicchk(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_parmset(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_parmget(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_autopwrset(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_autopwrget(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_autopwrclr(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_autopwrfpoff(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_autopwrexset(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_autopwrexget(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_dr(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_eventlist(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_getevent(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_setmadmevent(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_remcscmd(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_remcsfile(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_sparecmd(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_ioc_setphpinfo(intptr_t arg, int mode, int *rval_p, int u_mode); -int scf_push_reportsense(unsigned int rci_addr, unsigned char *sense, - time_t timestamp); -int scf_pop_reportsense(scfreport_t *rsense); -int scf_push_getevent(unsigned char *event_p); -int scf_pop_getevent(scfevent_t *event_p); -int scf_valid_date(int year, int month, int date); -int scf_check_pon_time(scfautopwrtime_t *ptime); -int scf_check_poff_time(scfautopwrtime_t *ptime); - -/* - * scf_open() - * - * Description: Driver open() entry processing. - * - */ -/* ARGSUSED */ -int -scf_open(dev_t *devp, int flag, int otyp, cred_t *cred_p) -{ -#define SCF_FUNC_NAME "scf_open() " - int ret = 0; - int instance; - - SCFDBGMSG1(SCF_DBGFLAG_OPCLS, SCF_FUNC_NAME ": start instance = %d", - getminor(*devp)); - SC_DBG_DRV_TRACE(TC_OPEN|TC_IN, __LINE__, NULL, 0); - - /* get instance */ - instance = getminor(*devp); - if (SCF_CHECK_INSTANCE(instance)) { - /* is the device character ? */ - if (otyp != OTYP_CHR) { - SC_DBG_DRV_TRACE(TC_OPEN|TC_ERR, __LINE__, - "open ", 8); - ret = EINVAL; - } - } else { - SC_DBG_DRV_TRACE(TC_OPEN|TC_ERR, __LINE__, "open ", 8); - ret = EINVAL; - } - - SC_DBG_DRV_TRACE(TC_OPEN|TC_OUT, __LINE__, &ret, sizeof (int)); - SCFDBGMSG1(SCF_DBGFLAG_OPCLS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * close entry - */ -/* ARGSUSED */ -int -scf_close(dev_t dev, int flag, int otyp, cred_t *cred_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_close() " - int ret = 0; - - SCFDBGMSG1(SCF_DBGFLAG_OPCLS, SCF_FUNC_NAME ": start instance = %d", - getminor(dev)); - SC_DBG_DRV_TRACE(TC_CLOSE|TC_IN, __LINE__, NULL, 0); - - SC_DBG_DRV_TRACE(TC_CLOSE|TC_OUT, __LINE__, &ret, sizeof (int)); - SCFDBGMSG(SCF_DBGFLAG_OPCLS, SCF_FUNC_NAME ": end"); - return (ret); -} - - -/* - * scf_ioctl() - * - * Description: Driver ioctl() entry processing. - * - */ -int -scf_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, - int *rval_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioctl() " - int ret = 0; - int instance; - int u_mode; - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start instance = %d", - getminor(dev)); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_IN, __LINE__, &cmd, sizeof (int)); - -#ifdef _MULTI_DATAMODEL - /* DDI_MODEL_ILP32: SCF driver 64bit, upper 32bit */ - /* DDI_MODEL_NONE : SCF driver64bit, upper 64bit */ - u_mode = ddi_model_convert_from(mode & FMODELS); -#else /* ! _MULTI_DATAMODEL */ - /* DDI_MODEL_NONE : SCF driver 32bit, upper 32bit */ - u_mode = DDI_MODEL_NONE; -#endif /* _MULTI_DATAMODEL */ - - /* get instance */ - instance = getminor(dev); - - SCF_DBG_IOMP_PROC; - - if (instance == SCF_USER_INSTANCE) { - - mutex_enter(&scf_comtbl.attach_mutex); - if (!(scf_comtbl.resource_flag & DID_MUTEX_ALL)) { - /* Not attach device */ - SCFDBGMSG(SCF_DBGFLAG_IOCTL, "Not attach device"); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - mutex_exit(&scf_comtbl.attach_mutex); - ret = ENXIO; - goto END_ioctl; - } - mutex_exit(&scf_comtbl.attach_mutex); - - if (drv_priv(cred_p) != 0) { - /* Not super-user */ - if ((cmd != SCFIOCHSTADRSINFO) && - (cmd != SCFIOCRDCLISTMAX) && - (cmd != SCFIOCRDCLISTX)) { - SCFDBGMSG(SCF_DBGFLAG_IOCTL, "Not super-user"); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EPERM; - goto END_ioctl; - } - } - mutex_enter(&scf_comtbl.all_mutex); - - /* Suspend flag check */ - if (scf_comtbl.suspend_flag) { - SCFDBGMSG(SCF_DBGFLAG_IOCTL, "suspend execute"); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EBUSY; - goto END_ioctl; - } - - mutex_exit(&scf_comtbl.all_mutex); - - SCF_DBG_IOCTL_PROC; - - switch ((uint_t)cmd) { - /* - * RAS control interface - */ - case SCFIOCREPORTSTAT: - ret = scf_ioc_reportstat(arg, mode, rval_p, u_mode); - break; - - case SCFIOCCLEARLCD: - ret = scf_ioc_clearlcd(arg, mode, rval_p, u_mode); - break; - - case SCFIOCWRLCD: - ret = scf_ioc_wrlcd(arg, mode, rval_p, u_mode); - break; - - case SCFIOCGETDISKLED: - ret = scf_ioc_getdiskled(arg, mode, rval_p, u_mode); - break; - - case SCFIOCSETDISKLED: - ret = scf_ioc_setdiskled(arg, mode, rval_p, u_mode); - break; - - case SCFIOCGETSDOWNREASON: - ret = scf_ioc_getsdownreason(arg, mode, rval_p, u_mode); - break; - - /* - * System infomarion interface - */ - case SCFIOCOPTIONDISP: - ret = scf_ioc_optiondisp(arg, mode, rval_p, u_mode); - break; - - case SCFIOCGETPCICONFIG: - ret = scf_ioc_getpciconfig(arg, mode, rval_p, u_mode); - break; - - /* - * RCI control interface - */ - case SCFIOCHAC: - ret = scf_ioc_hac(arg, mode, rval_p, u_mode); - break; - - case SCFIOCHSTADRSINFO: - ret = scf_ioc_hstadrsinfo(arg, mode, rval_p, u_mode); - break; - - case SCFIOCRDCLISTMAX: - ret = scf_ioc_rdclistmax(arg, mode, rval_p, u_mode); - break; - - case SCFIOCRDCLISTX: - ret = scf_ioc_rdclistx(arg, mode, rval_p, u_mode); - break; - - case SCFIOCRDCTRL: - ret = scf_ioc_rdctrl(arg, mode, rval_p, u_mode); - break; - - case SCFIOCOPECALL: - ret = scf_ioc_opecall(arg, mode, rval_p, u_mode); - break; - - case SCFIOCGETREPORT: - ret = scf_ioc_getreport(arg, mode, rval_p, u_mode); - break; - - case SCFIOCRCIPWR: - ret = scf_ioc_rcipwr(arg, mode, rval_p, u_mode); - break; - - case SCFIOCPANICREQ: - ret = scf_ioc_panicreq(arg, mode, rval_p, u_mode); - break; - - case SCFIOCPANICCHK: - ret = scf_ioc_panicchk(arg, mode, rval_p, u_mode); - break; - - case SCFIOCPARMSET: - ret = scf_ioc_parmset(arg, mode, rval_p, u_mode); - break; - - case SCFIOCPARMGET: - ret = scf_ioc_parmget(arg, mode, rval_p, u_mode); - break; - - /* - * APCS control interface - */ - case SCFIOCAUTOPWRSET: - ret = scf_ioc_autopwrset(arg, mode, rval_p, u_mode); - break; - - case SCFIOCAUTOPWRGET: - case SCFIOCSYSAUTOPWRGET: - ret = scf_ioc_autopwrget(arg, mode, rval_p, u_mode); - break; - - case SCFIOCSYSAUTOPWRCLR: - ret = scf_ioc_autopwrclr(arg, mode, rval_p, u_mode); - break; - - case SCFIOCAUTOPWRFPOFF: - ret = scf_ioc_autopwrfpoff(arg, mode, rval_p, u_mode); - break; - - case SCFIOCAUTOPWREXSET: - ret = scf_ioc_autopwrexset(arg, mode, rval_p, u_mode); - break; - - case SCFIOCAUTOPWREXGET: - ret = scf_ioc_autopwrexget(arg, mode, rval_p, u_mode); - break; - - /* - * FJDR control interface - */ - case SCFIOCDR: - ret = scf_ioc_dr(arg, mode, rval_p, u_mode); - break; - - /* - * MADM REMCS interface - */ - case SCFIOCEVENTLIST: - ret = scf_ioc_eventlist(arg, mode, rval_p, u_mode); - break; - - case SCFIOCGETEVENT: - ret = scf_ioc_getevent(arg, mode, rval_p, u_mode); - break; - - case SCFIOCSETMADMEVENT: - ret = scf_ioc_setmadmevent(arg, mode, rval_p, u_mode); - break; - - case SCFIOCREMCSCMD: - ret = scf_ioc_remcscmd(arg, mode, rval_p, u_mode); - break; - - case SCFIOCREMCSFILE: - ret = scf_ioc_remcsfile(arg, mode, rval_p, u_mode); - break; - - case SCFIOCSPARECMD: - ret = scf_ioc_sparecmd(arg, mode, rval_p, u_mode); - break; - - /* - * Kernel interface - */ - case SCFIOCSETPHPINFO: - ret = scf_ioc_setphpinfo(arg, mode, rval_p, u_mode); - break; - - default: - SCFDBGMSG(SCF_DBGFLAG_IOCTL, "undefined ioctl command"); - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = ENOTTY; - break; - } - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = ENXIO; - } - -/* - * END_ioctl - */ - END_ioctl: - - if (scf_comtbl.resource_flag & DID_MUTEX_ALL) { - /* - * untimeout() processing of the timer which stopped a timer by - * ioctl processing - * Call of driver mutex status is prohibited. - */ - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, - SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - } - - SC_DBG_DRV_TRACE(TC_IOCTL|TC_OUT, __LINE__, &ret, sizeof (int)); - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_reportstat() - * - * Description: SCFIOCREPORTSTAT ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_reportstat(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_reportstat() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scf_state_t *wk_statep; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - switch (arg) { - case SCF_SHUTDOWN_START: - mutex_enter(&scf_comtbl.all_mutex); - - scf_comtbl.shutdown_start_reported = 1; - sbuf.b[0] = REPORT_STAT_SHUTDOWN_START; - sbuf.b[1] = scf_poff_factor[scf_comtbl.poff_factor][0]; - sbuf.b[2] = scf_poff_factor[scf_comtbl.poff_factor][1]; - sbuf.b[3] = scf_poff_factor[scf_comtbl.poff_factor][2]; - break; - - case SCF_SYSTEM_RUNNING: - mutex_enter(&scf_comtbl.all_mutex); - - sbuf.b[0] = REPORT_STAT_SYSTEM_RUNNING; - sbuf.b[1] = 0; - sbuf.b[2] = 0; - sbuf.b[3] = 0; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_reportstat; - } - - if ((scf_comtbl.scf_report_event_sub == EVENT_SUB_REPORT_RUN_WAIT) || - (scf_comtbl.scf_report_event_sub == - EVENT_SUB_REPORT_SHUT_WAIT)) { - scf_comtbl.scf_report_event_sub = EVENT_SUB_NONE; - } - - scf_cmd.cmd = CMD_REPORT; - scf_cmd.subcmd = SUB_SYSTEM_STATUS_RPT; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - scf_comtbl.scf_last_report = arg; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if ((ret == EBUSY) && - (scf_cmd.stat0 == SCF_STAT0_NOT_PATH) && - (arg == SCF_SHUTDOWN_START)) { - wk_statep = scf_comtbl.scf_stop_p; - ret = EIO; - if (wk_statep != NULL) { - scf_del_queue(wk_statep); - /* Interrupt enable */ - scf_permit_intr(wk_statep, 1); - scf_chg_scf(wk_statep, PATH_STAT_ACTIVE); - scf_comtbl.scf_exec_p = wk_statep; - /* SCF command send sync stop */ - ret = scf_make_send_cmd(&scf_cmd, SCF_USE_STOP); - if (ret == 0) { - /* new report shutdown */ - scf_cmd.subcmd = SUB_SYSTEM_STATUS_RPT_NOPATH; - scf_cmd.flag = (SCF_USE_S_BUF | SCF_USE_SP); - ret = scf_send_cmd_check_bufful(&scf_cmd); - if (ret == 0) { - /* - * SCF command send sync re-stop - */ - ret = scf_make_send_cmd(&scf_cmd, - SCF_USE_STOP); - } - } - /* FIOMPSTART exec status */ - if ((wk_statep == scf_comtbl.scf_exec_p) || - (wk_statep == scf_comtbl.scf_path_p)) { - if (scf_comtbl.watchdog_after_resume) { - /* - * Alive check status recovery - */ - scf_comtbl.alive_running = - SCF_ALIVE_START; - scf_comtbl.watchdog_after_resume = 0; - } - scf_chg_scf(wk_statep, PATH_STAT_ACTIVE); - /* SCF path change send */ - scf_comtbl.scf_exec_p = 0; - scf_comtbl.scf_path_p = 0; - scf_comtbl.scf_pchg_event_sub = - EVENT_SUB_PCHG_WAIT; - scf_next_cmd_check(wk_statep); - } - /* SCF command send sync start */ - (void) scf_make_send_cmd(&scf_cmd, SCF_USE_START); - } - } - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_reportstat - */ - END_reportstat: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_clearlcd() - * - * Description: SCFIOCCLEARLCD ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_clearlcd(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_clearlcd() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - int ii; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scf_cmd.cmd = CMD_PHASE; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - - switch (arg) { - case SCF_CLRLCD_SEQ: - scf_cmd.subcmd = SUB_PHASE_PRINT; - scf_cmd.scount = 1; - scf_cmd.sbuf = &sbuf.b[0]; - - mutex_enter(&scf_comtbl.all_mutex); - - for (ii = 0; ii < SCF_WRLCD_MAX; ii++) { - scf_comtbl.lcd_seq_mes[ii] = '\0'; - sbuf.b[ii] = '\0'; - } - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - break; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_wrlcd() - * - * Description: SCFIOCWRLCD ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_wrlcd(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_wrlcd() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scfwrlcd_t scfwrlcd; - scfwrlcd32_t scfwrlcd32; - int ii; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - if (ddi_copyin((void *)arg, (void *)&scfwrlcd32, - sizeof (scfwrlcd32_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - goto END_wrlcd; - } - scfwrlcd.lcd_type = scfwrlcd32.lcd_type; - scfwrlcd.length = scfwrlcd32.length; - scfwrlcd.string = (unsigned char *)(uintptr_t)scfwrlcd32.string; - } else { - /* DDI_MODEL_NONE */ - if (ddi_copyin((void *)arg, (void *)&scfwrlcd, - sizeof (scfwrlcd_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - goto END_wrlcd; - } - } - - if (scfwrlcd.length < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_wrlcd; - } - if (scfwrlcd.length > SCF_WRLCD_MAX) { - scfwrlcd.length = SCF_WRLCD_MAX; - } - for (ii = 0; ii < SCF_WRLCD_MAX + 1; ii++) { - sbuf.b[ii] = '\0'; - } - sbuf.b[scfwrlcd.length] = '\0'; - - if (ddi_copyin((void *)scfwrlcd.string, (void *)&sbuf.b[0], - (size_t)scfwrlcd.length, mode)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_wrlcd; - } - - scf_cmd.cmd = CMD_PHASE; - scf_cmd.scount = scfwrlcd.length + 1; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - - switch (scfwrlcd.lcd_type) { - case SCF_WRLCD_SEQ: - scf_cmd.subcmd = SUB_PHASE_PRINT; - - mutex_enter(&scf_comtbl.all_mutex); - bcopy((void *)&sbuf.b[0], (void *)&scf_comtbl.lcd_seq_mes[0], - SCF_WRLCD_MAX); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - break; - } - -/* - * END_wrlcd - */ - END_wrlcd: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_getdiskled() - * - * Description: SCFIOCGETDISKLED ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_getdiskled(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_getdiskled() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t rbuf; - scfiocgetdiskled_t *scfiocgetdiskled_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfiocgetdiskled_p = kmem_zalloc((size_t)(sizeof (scfiocgetdiskled_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfiocgetdiskled_p, - sizeof (scfiocgetdiskled_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_getdiskled; - } - - scf_cmd.cmd = CMD_DOMAIN_INFO; - scf_cmd.subcmd = SUB_DISK_LED_DISP; - scf_cmd.sbuf = &scfiocgetdiskled_p->path[0]; - scf_cmd.scount = SCF_DISK_LED_PATH_MAX; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.flag = SCF_USE_LSBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - scfiocgetdiskled_p->led = rbuf.b[0]; - - if (ddi_copyout((void *)scfiocgetdiskled_p, (void *)arg, - sizeof (scfiocgetdiskled_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_getdiskled - */ - END_getdiskled: - - if (scfiocgetdiskled_p) { - kmem_free((void *)scfiocgetdiskled_p, - (size_t)(sizeof (scfiocgetdiskled_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_setdiskled() - * - * Description: SCFIOCSETDISKLED ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_setdiskled(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_setdiskled() " - int ret = 0; - struct scf_cmd scf_cmd; - scfiocgetdiskled_t *scfiocgetdiskled_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfiocgetdiskled_p = kmem_zalloc((size_t)(sizeof (scfiocgetdiskled_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfiocgetdiskled_p, - sizeof (scfiocgetdiskled_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_setdiskled; - } - - switch (scfiocgetdiskled_p->led) { - case SCF_DISK_LED_ON: - scf_cmd.subcmd = SUB_DISK_LED_ON; - break; - - case SCF_DISK_LED_BLINK: - scf_cmd.subcmd = SUB_DISK_LED_BLINK; - break; - - case SCF_DISK_LED_OFF: - scf_cmd.subcmd = SUB_DISK_LED_OFF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_setdiskled; - } - - scf_cmd.cmd = CMD_DOMAIN_INFO; - scf_cmd.sbuf = &scfiocgetdiskled_p->path[0]; - scf_cmd.scount = SCF_DISK_LED_PATH_MAX; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_setdiskled - */ - END_setdiskled: - - if (scfiocgetdiskled_p) { - kmem_free((void *)scfiocgetdiskled_p, - (size_t)(sizeof (scfiocgetdiskled_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_getsdownreason() - * - * Description: SCFIOCGETSDOWNREASON ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_getsdownreason(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_getsdownreason() " - int ret = 0; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyout((void *)&scf_comtbl.scf_shutdownreason, - (void *)arg, sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_optiondisp() - * - * Description: SCFIOCOPTIONDISP ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_optiondisp(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_optiondisp() " - int ret = 0; - struct scf_cmd scf_cmd; - scfoption_t scfoption; - scf_short_buffer_t sbuf; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - bzero((void *)&scfoption, sizeof (scfoption_t)); - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - - scf_cmd.cmd = CMD_DOMAIN_INFO; - scf_cmd.subcmd = SUB_OPTION_DISP; - sbuf.b[13] = (uchar_t)(scf_scfd_comif_version >> 8); - sbuf.b[14] = (uchar_t)scf_scfd_comif_version; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.rbuf = &scfoption.rbuf[0]; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.flag = SCF_USE_SSBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - /* Set XSCF version */ - bcopy((void *)&scfoption.rbuf[13], - (void *)&scf_xscf_comif_version, 2); - - if (ddi_copyout((void *)&scfoption, (void *)arg, - sizeof (scfoption_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_getpciconfig() - * - * Description: SCFIOCGETPCICONFIG ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_getpciconfig(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_getpciconfig() " - int ret = 0; - struct scf_cmd scf_cmd; - scfiocgetpciconfig_t *scfiocgetpciconfig_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfiocgetpciconfig_p = - kmem_zalloc((size_t)(sizeof (scfiocgetpciconfig_t)), KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfiocgetpciconfig_p, - sizeof (scfiocgetpciconfig_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_getpciconfig; - } - - scf_cmd.cmd = CMD_DOMAIN_INFO; - scf_cmd.subcmd = SUB_PCI_DISP; - scf_cmd.sbuf = &scfiocgetpciconfig_p->sbuf[0]; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.rbuf = &scfiocgetpciconfig_p->rbuf[0]; - scf_cmd.rcount = SCF_L_CNT_MAX; - scf_cmd.flag = SCF_USE_SLBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - if (ddi_copyout((void *)scfiocgetpciconfig_p, - (void *)arg, sizeof (scfiocgetpciconfig_t), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_getpciconfig - */ - END_getpciconfig: - - if (scfiocgetpciconfig_p) { - kmem_free((void *)scfiocgetpciconfig_p, - (size_t)(sizeof (scfiocgetpciconfig_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_hac() - * - * Description: SCFIOCHAC ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_hac(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_hac() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scfhac_t scfhac; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfhac, - sizeof (scfhac_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_hac; - } - - if (scfhac.sub_command == SUB_HOSTADDR_DISP2) { - mutex_enter(&scf_comtbl.all_mutex); - if (scf_save_hac_flag != 0) { - mutex_exit(&scf_comtbl.all_mutex); - if (ddi_copyout((void *)&scf_save_hac, (void *)arg, - sizeof (scfhac_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - goto END_hac; - } else { - mutex_exit(&scf_comtbl.all_mutex); - } - scfhac.sub_command = SUB_HOSTADDR_DISP; - } - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = scfhac.sub_command; - scf_cmd.sbuf = &scfhac.sbuf[0]; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.rbuf = &scfhac.rbuf[0]; - scf_cmd.rcount = SCF_S_CNT_15; - - switch (scfhac.sub_command) { - case SUB_REMOTE_POWCTL_SET: - scf_cmd.flag = SCF_USE_S_BUF; - break; - - case SCF_SUB_REMOTE_POWCTL_SET: - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - sbuf.b[0] = scfhac.sbuf[6]; - sbuf.b[1] = scfhac.sbuf[7]; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.subcmd = SUB_REMOTE_POWCTL_SET; - scf_cmd.flag = SCF_USE_S_BUF; - break; - - case SUB_HOSTADDR_DISP: - case SUB_DEVICE_INFO: - scf_cmd.flag = SCF_USE_SSBUF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_hac; - } - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret == 0) { - if (scfhac.sub_command == SUB_HOSTADDR_DISP) { - bcopy((void *)&scfhac, (void *)&scf_save_hac, - sizeof (scfhac_t)); - scf_save_hac_flag = 1; - } - - mutex_exit(&scf_comtbl.all_mutex); - - if (ddi_copyout((void *)&scfhac, (void *)arg, sizeof (scfhac_t), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } else { - mutex_exit(&scf_comtbl.all_mutex); - } - -/* - * END_hac - */ - END_hac: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_hstadrsinfo() - * - * Description: SCFIOCHSTADRSINFO ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_hstadrsinfo(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_hstadrsinfo() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t rbuf; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = SUB_HOSTADDR_DISP; - scf_cmd.scount = 0; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.rcount = SCF_S_CNT_12; - scf_cmd.flag = SCF_USE_SSBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret == 0) { - bcopy((void *)&rbuf.b[0], (void *)&scf_save_hac.rbuf[0], - SCF_S_CNT_12); - scf_save_hac_flag = 1; - - mutex_exit(&scf_comtbl.all_mutex); - - if (ddi_copyout((void *)&rbuf.b[0], (void *)arg, SCF_S_CNT_12, - mode) < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } else { - mutex_exit(&scf_comtbl.all_mutex); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_rdclistmax() - * - * Description: SCFIOCRDCLISTMAX ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_rdclistmax(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_rdclistmax() " - int ret = 0; - int scfrdclistmax; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfrdclistmax = (scf_rci_max * SCF_DEVLIST_MAXCNT); - - if (ddi_copyout((void *)&scfrdclistmax, (void *)arg, sizeof (int), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_rdclistx() - * - * Description: SCFIOCRDCLISTX ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_rdclistx(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_rdclistx() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scfrdclistx_t *rdclistxp = NULL; - scfrdclistx_t *rdclistxp_wk = NULL; - union wk_buffer { - uchar_t b[8]; - uint_t four_bytes_access[2]; - } *rbuf_wk; - int ii; - int jj; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - mutex_enter(&scf_comtbl.all_mutex); - - rdclistxp = - (scfrdclistx_t *)kmem_zalloc((size_t)(sizeof (scfrdclistx_t) * - scf_rci_max * SCF_DEVLIST_MAXCNT), KM_SLEEP); - rdclistxp_wk = - (scfrdclistx_t *)kmem_zalloc((size_t)(sizeof (scfrdclistx_t) * - scf_rci_max), KM_SLEEP); - - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - - /* set device class */ - sbuf.four_bytes_access[0] = 0x00000fff; - sbuf.b[4] = 0; /* 0 system */ - - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = SUB_DEVICE_LIST; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = scf_rci_max * SCF_DEVLIST_ENTSIZE; - scf_cmd.rbuf = (uchar_t *)rdclistxp_wk; - scf_cmd.flag = SCF_USE_SLBUF; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret != 0) { - mutex_exit(&scf_comtbl.all_mutex); - goto END_rdclistx; - } - - rbuf_wk = (union wk_buffer *)rdclistxp_wk; - for (jj = 0; jj < (scf_cmd.rbufleng / SCF_DEVLIST_ENTSIZE); - jj++) { - if (rbuf_wk->four_bytes_access[0] == NULL) { - break; - } - rdclistxp[jj].rci_addr = rbuf_wk->four_bytes_access[0]; - rdclistxp[jj].status = rbuf_wk->b[4]; - rdclistxp[jj].dev_class = - ((ushort_t)rbuf_wk->b[5] << 8) + - (ushort_t)rbuf_wk->b[6]; - rdclistxp[jj].sub_class = rbuf_wk->b[7]; - rbuf_wk++; - } - - /* set device class */ - sbuf.four_bytes_access[0] = 0x00000fff; - sbuf.b[4] = 1; /* 1 system */ - - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = SUB_DEVICE_LIST; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = scf_rci_max * SCF_DEVLIST_ENTSIZE; - scf_cmd.rbuf = (uchar_t *)rdclistxp_wk; - scf_cmd.flag = SCF_USE_SLBUF; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret != 0) { - mutex_exit(&scf_comtbl.all_mutex); - goto END_rdclistx; - } - - mutex_exit(&scf_comtbl.all_mutex); - - rbuf_wk = (union wk_buffer *)rdclistxp_wk; - for (ii = 0; ii < (scf_cmd.rbufleng / SCF_DEVLIST_ENTSIZE); ii++) { - if (rbuf_wk->four_bytes_access[0] == NULL) { - break; - } - rdclistxp[ii + jj].rci_addr = rbuf_wk->four_bytes_access[0]; - rdclistxp[ii + jj].status = rbuf_wk->b[4]; - rdclistxp[ii + jj].dev_class = - ((ushort_t)rbuf_wk->b[5] << 8) + - (ushort_t)rbuf_wk->b[6]; - rdclistxp[ii + jj].sub_class = rbuf_wk->b[7]; - rbuf_wk++; - } - - /* return number of data */ - *rval_p = (ii + jj); - - if (ii + jj) { - if (ddi_copyout((void *)rdclistxp, (void *)arg, - (size_t)(sizeof (scfrdclistx_t) * (ii + jj)), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_rdclistx - */ - END_rdclistx: - - if (rdclistxp) { - kmem_free((void *)rdclistxp, (size_t)(sizeof (scfrdclistx_t) * - scf_rci_max * SCF_DEVLIST_MAXCNT)); - } - if (rdclistxp_wk) { - kmem_free((void *)rdclistxp_wk, - (size_t)(sizeof (scfrdclistx_t) * scf_rci_max)); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_rdctrl() - * - * Description: SCFIOCRDCTRL ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_rdctrl(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_rdctrl() " - int ret = 0; - struct scf_cmd scf_cmd; - scfrdctrl_t scfrdctrl; - int got_sense = 0; - clock_t lb; - int ii; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfrdctrl, - sizeof (scfrdctrl_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_rdctrl; - } - if ((scfrdctrl.sub_cmd != SUB_DEVICE_STATUS_RPT) && - (scfrdctrl.sub_cmd != SCF_SUB_DEVICE_STATUS_RPT) && - ((scfrdctrl.sub_cmd | SCF_RCI_PATH_PARITY) != - SCF_RCI_PATH_40)) { - /* wrong sub_cmd */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_rdctrl; - } - - mutex_enter(&scf_comtbl.all_mutex); - - while (scf_comtbl.rdctrl_busy) { - SC_DBG_DRV_TRACE(TC_W_SIG, __LINE__, &scf_comtbl.rdctrl_cv, - sizeof (kcondvar_t)); - if (cv_wait_sig(&scf_comtbl.rdctrl_cv, - &scf_comtbl.all_mutex) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.rdctrl_cv, sizeof (kcondvar_t)); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINTR; - goto END_rdctrl; - } - } - scf_comtbl.rdctrl_busy = 1; - - for (ii = scfrdctrl.scount; ii < SCF_S_CNT_32; ii++) { - scfrdctrl.sbuf[ii] = 0; - } - if ((scfrdctrl.sub_cmd == SUB_DEVICE_STATUS_RPT) || - (scfrdctrl.sub_cmd == SCF_SUB_DEVICE_STATUS_RPT)) { - scf_cmd.flag = SCF_USE_S_BUF; - } else { - /* SUB_RCI_PATH_4* */ - scf_cmd.flag = SCF_USE_L_BUF; - /* Parameter size set */ - if (scfrdctrl.scount > 6) { - scfrdctrl.sbuf[5] = (scfrdctrl.scount - 6); - } else { - scfrdctrl.sbuf[5] = 0; - } - } - scf_cmd.cmd = CMD_RCI_CTL; - if (scfrdctrl.sub_cmd == SCF_SUB_DEVICE_STATUS_RPT) { - scf_cmd.subcmd = SUB_DEVICE_STATUS_RPT; - } else if (scfrdctrl.sub_cmd == - (SCF_RCI_PATH_40 & (~SCF_RCI_PATH_PARITY))) { - scf_cmd.subcmd = SCF_RCI_PATH_40; - } else { - scf_cmd.subcmd = scfrdctrl.sub_cmd; - } - scf_comtbl.rdctrl_sense_category_code = 0; - scf_cmd.sbuf = &scfrdctrl.sbuf[0]; - scf_cmd.scount = SCF_S_CNT_32; - scf_cmd.rcount = 0; - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret != 0) { - goto END_rdctrl_signal; - } - - /* wait for sense */ - lb = ddi_get_lbolt(); - while (scf_comtbl.rdctrl_sense_category_code == 0) { - SC_DBG_DRV_TRACE(TC_T_WAIT, __LINE__, &scf_comtbl.rdcsense_cv, - sizeof (kcondvar_t)); - scf_comtbl.rdctrl_end_wait = 1; - if (cv_timedwait(&scf_comtbl.rdcsense_cv, &scf_comtbl.all_mutex, - drv_usectohz(scf_rdctrl_sense_wait) + lb) == (-1)) { - /* time out */ - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = ENODATA; - goto END_rdctrl_signal; - } - } - - /* check RCI-addr and category code */ - if ((bcmp((void *)&scf_comtbl.rdctrl_sense[0], - (void *)&scfrdctrl.sbuf[0], 4) == 0) && - (((scf_comtbl.rdctrl_sense_category_code) == - (scfrdctrl.sub_cmd & (~SCF_RCI_PATH_PARITY))) || - ((scf_comtbl.rdctrl_sense_category_code == - DEV_SENSE_STATUS_RPT) && - ((scfrdctrl.sub_cmd == SUB_DEVICE_STATUS_RPT) || - (scfrdctrl.sub_cmd == SCF_SUB_DEVICE_STATUS_RPT))))) { - bcopy((void *)&scf_comtbl.rdctrl_sense[0], - (void *)&scfrdctrl.sense[0], 4); - bcopy((void *)&scf_comtbl.rdctrl_sense[8], - (void *)&scfrdctrl.sense[4], (SCF_INT_REASON_SIZE - 4)); - got_sense = 1; - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = ENODATA; - } - -/* - * END_rdctrl_signal - */ - END_rdctrl_signal: - - scf_comtbl.rdctrl_end_wait = 0; - scf_comtbl.rdctrl_busy = 0; - cv_signal(&scf_comtbl.rdctrl_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.rdctrl_cv, - sizeof (kcondvar_t)); - mutex_exit(&scf_comtbl.all_mutex); - if (got_sense) { - if (ddi_copyout((void *)&scfrdctrl, (void *)arg, - sizeof (scfrdctrl_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_rdctrl - */ - END_rdctrl: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_opecall() - * - * Description: SCFIOCOPECALL ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_opecall(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_opecall() " - int ret = 0; - struct scf_cmd scf_cmd; - scfhac_t scfhac; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfhac, sizeof (scfhac_t), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_opecall; - } - - scf_cmd.cmd = CMD_REPORT; - scf_cmd.subcmd = scfhac.sub_command; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &scfhac.sbuf[0]; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.rbuf = &scfhac.rbuf[0]; - - switch (scfhac.sub_command) { - case SUB_OPECALL_ON_SET: - case SUB_OPECALL_OFF_SET: - scf_cmd.flag = SCF_USE_S_BUF; - break; - - case SUB_OPECALL_DISP: - scf_cmd.flag = SCF_USE_SSBUF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_opecall; - } - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - if (ddi_copyout((void *)&scfhac, (void *)arg, sizeof (scfhac_t), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_opecall - */ - END_opecall: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_getreport() - * - * Description: SCFIOCGETREPORT ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_getreport(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_getreport() " - scfreport_t scfreport; - scfreport32_t scfreport32; - scfreport_t *scfreport_p; - int ret = 0; - int loop_flag = 1; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - if (ddi_copyin((void *)arg, (void *)&scfreport32, - sizeof (scfreport32_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - goto END_getreport; - } - scfreport.flag = scfreport32.flag; - } else { - /* DDI_MODEL_NONE */ - if (ddi_copyin((void *)arg, (void *)&scfreport, - sizeof (scfreport_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - goto END_getreport; - } - } - - switch (scfreport.flag) { - case GETREPORT_WAIT: - case GETREPORT_WAIT_AND_RCIDWN: - mutex_enter(&scf_comtbl.all_mutex); - - scfreport_p = (scfreport_t *)&scf_comtbl.scfreport_rcidown.flag; - while (loop_flag) { - if (scf_pop_reportsense(&scfreport) == 0) { - break; - } - if ((scfreport.flag == GETREPORT_WAIT_AND_RCIDWN) && - (scf_comtbl.rcidown_event_flag)) { - scfreport.rci_addr = scfreport_p->rci_addr; - scfreport.report_sense[0] = - scfreport_p->report_sense[0]; - scfreport.report_sense[1] = - scfreport_p->report_sense[1]; - scfreport.report_sense[2] = - scfreport_p->report_sense[2]; - scfreport.report_sense[3] = - scfreport_p->report_sense[3]; - scfreport.timestamp = scfreport_p->timestamp; - scf_comtbl.rcidown_event_flag = 0; - break; - } - SC_DBG_DRV_TRACE(TC_W_SIG, __LINE__, - &scf_comtbl.rsense_cv, sizeof (kcondvar_t)); - if (cv_wait_sig(&scf_comtbl.rsense_cv, - &scf_comtbl.all_mutex) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.rsense_cv, - sizeof (kcondvar_t)); - - mutex_exit(&scf_comtbl.all_mutex); - ret = EINTR; - goto END_getreport; - } - } - - mutex_exit(&scf_comtbl.all_mutex); - break; - - case GETREPORT_NOWAIT: - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_pop_reportsense(&scfreport) < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = ENODATA; - goto END_getreport; - } - - mutex_exit(&scf_comtbl.all_mutex); - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_getreport; - } - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - if ((scfreport.timestamp < INT32_MIN) || - (scfreport.timestamp > INT32_MAX)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EOVERFLOW; - goto END_getreport; - } - - scfreport32.rci_addr = scfreport.rci_addr; - scfreport32.report_sense[0] = scfreport.report_sense[0]; - scfreport32.report_sense[1] = scfreport.report_sense[1]; - scfreport32.report_sense[2] = scfreport.report_sense[2]; - scfreport32.report_sense[3] = scfreport.report_sense[3]; - scfreport32.timestamp = (time32_t)scfreport.timestamp; - - if (ddi_copyout((void *)&scfreport32, (void *)arg, - sizeof (scfreport32_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } else { - /* DDI_MODEL_NONE */ - if (ddi_copyout((void *)&scfreport, (void *)arg, - sizeof (scfreport_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_getreport - */ - END_getreport: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_rcipwr() - * - * Description: SCFIOCRCIPWR ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_rcipwr(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_rcipwr() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scf_short_buffer_t rbuf; - scfrcipwr_t scfrcipwr; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfrcipwr, - sizeof (scfrcipwr_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_rcipwr; - } - - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = SUB_HOSTADDR_DISP; - scf_cmd.scount = 0; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.rcount = SCF_S_CNT_12; - scf_cmd.flag = SCF_USE_SSBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret != 0) { - mutex_exit(&scf_comtbl.all_mutex); - goto END_rcipwr; - } - - /* check RCI-address */ - if ((scfrcipwr.rci_addr == rbuf.four_bytes_access[0]) || - (scfrcipwr.rci_addr == SCF_CMD_SYSTEM_ADDR)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_rcipwr; - } - - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - - switch (scfrcipwr.sub_cmd) { - case RCI_PWR_ON: - scf_cmd.subcmd = SUB_PON; - break; - - case RCI_PWR_OFF: - scf_cmd.subcmd = SUB_FPOFF; - break; - - case RCI_SYS_RESET: - scf_cmd.subcmd = SUB_RESET; - break; - - case RCI_PWR_NOR_OFF: - scf_cmd.subcmd = SUB_POFF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_rcipwr; - } - - scf_cmd.cmd = CMD_PART_POW_CTR; - scf_cmd.scount = SCF_S_CNT_15; - sbuf.four_bytes_access[0] = scfrcipwr.rci_addr; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_rcipwr - */ - END_rcipwr: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_panicreq() - * - * Description: SCFIOCPANICREQ ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_panicreq(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_panicreq() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scf_short_buffer_t rbuf; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = SUB_HOSTADDR_DISP; - scf_cmd.scount = 0; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.rcount = SCF_S_CNT_12; - scf_cmd.flag = SCF_USE_SSBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - if (ret != 0) { - mutex_exit(&scf_comtbl.all_mutex); - goto END_panicreq; - } - - /* check RCI-address */ - if (((uint_t)arg == rbuf.four_bytes_access[0]) || - (arg == SCF_CMD_SYSTEM_ADDR)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_panicreq; - } - - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - sbuf.four_bytes_access[0] = (unsigned int)arg; - scf_cmd.cmd = CMD_RCI_CTL; - scf_cmd.subcmd = SUB_PANIC; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_panicreq - */ - END_panicreq: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_panicchk() - * - * Description: SCFIOCPANICCHK ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_panicchk(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_panicchk() " - int ret = 0; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyout((void *)&scf_panic_exec_flag2, (void *)arg, - sizeof (int), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_parmset() - * - * Description: SCFIOCPARMSET ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_parmset(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_parmset() " - int ret = 0; - scfparam_t scfparam; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfparam, - sizeof (scfparam_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_parmset; - } - - switch (scfparam.parm) { - case SCF_PARM_RDCTRL_TIMER: - if ((scfparam.value >= SCF_SEC2MICRO(1)) && - (scfparam.value <= SCF_SEC2MICRO(120))) { - mutex_enter(&scf_comtbl.all_mutex); - scf_rdctrl_sense_wait = - scfparam.value - (scfparam.value % 500000); - mutex_exit(&scf_comtbl.all_mutex); - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EINVAL; - goto END_parmset; - } - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_parmset; - } - - if (ddi_copyout((void *)&scfparam, (void *)arg, - sizeof (scfparam_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - -/* - * END_parmset - */ - END_parmset: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_parmget() - * - * Description: SCFIOCPARMGET ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_parmget(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_parmget() " - int ret = 0; - scfparam_t scfparam; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfparam, - sizeof (scfparam_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_parmget; - } - - switch (scfparam.parm) { - case SCF_PARM_RDCTRL_TIMER: - mutex_enter(&scf_comtbl.all_mutex); - scfparam.value = scf_rdctrl_sense_wait; - mutex_exit(&scf_comtbl.all_mutex); - - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_parmget; - } - - if (ddi_copyout((void *)&scfparam, (void *)arg, - sizeof (scfparam_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - -/* - * END_parmget - */ - END_parmget: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_autopwrset() - * - * Description: SCFIOCAUTOPWRSET ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_autopwrset(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_autopwrset() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scfautopwr_t scfautopwr; - int ii; - int jj; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfautopwr, - sizeof (scfautopwr_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_autopwrset; - } - - if ((scfautopwr.valid_entries < 0) || (scfautopwr.valid_entries > 5)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_autopwrset; - } - - bzero((void *)&sbuf.b[0], 5 * SCF_S_CNT_16); - - for (ii = 0, jj = 0; ii < scfautopwr.valid_entries; ii++, - jj = ii * SCF_S_CNT_16) { - /* check pon time */ - if (scf_check_pon_time(&scfautopwr.ptime[ii]) < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EINVAL; - goto END_autopwrset; - } - - if (scf_check_poff_time(&scfautopwr.ptime[ii]) < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EINVAL; - goto END_autopwrset; - } - - sbuf.b[jj] = (uchar_t)(scfautopwr.ptime[ii].pon_year >> 8); - sbuf.b[jj + 1] = (uchar_t)scfautopwr.ptime[ii].pon_year; - sbuf.b[jj + 2] = (uchar_t)scfautopwr.ptime[ii].pon_month; - sbuf.b[jj + 3] = (uchar_t)scfautopwr.ptime[ii].pon_date; - sbuf.b[jj + 4] = (uchar_t)scfautopwr.ptime[ii].pon_hour; - sbuf.b[jj + 5] = (uchar_t)scfautopwr.ptime[ii].pon_minute; - sbuf.b[jj + 6] = 0; - sbuf.b[jj + 7] = 0; - - sbuf.b[jj + 8] = (uchar_t)(scfautopwr.ptime[ii].poff_year >> 8); - sbuf.b[jj + 9] = (uchar_t)scfautopwr.ptime[ii].poff_year; - sbuf.b[jj + 10] = (uchar_t)scfautopwr.ptime[ii].poff_month; - sbuf.b[jj + 11] = (uchar_t)scfautopwr.ptime[ii].poff_date; - sbuf.b[jj + 12] = (uchar_t)scfautopwr.ptime[ii].poff_hour; - sbuf.b[jj + 13] = (uchar_t)scfautopwr.ptime[ii].poff_minute; - sbuf.b[jj + 14] = 0; - sbuf.b[jj + 15] = 0; - } - - scf_cmd.cmd = CMD_SYS_AUTOPOW; - scf_cmd.subcmd = SUB_SYS_AUTO_ONOFF_SET; - scf_cmd.scount = 5 * SCF_S_CNT_16; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_autopwrset - */ - END_autopwrset: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_autopwrget() - * - * Description: SCFIOCAUTOPWRGET or SCFIOCSYSAUTOPWRGET - * ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_autopwrget(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_autopwrget() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t rbuf; - scfautopwr_t scfautopwr; - int ii; - int jj; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - bzero((void *)&scfautopwr, sizeof (scfautopwr_t)); - - scf_cmd.cmd = CMD_SYS_AUTOPOW; - scf_cmd.subcmd = SUB_SYS_AUTO_ONOFF_DISP; - scf_cmd.scount = 0; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.rcount = 5 * SCF_S_CNT_16; - scf_cmd.flag = SCF_USE_SLBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret != 0) { - goto END_autopwrget; - } - - for (ii = 0, jj = 0; ii < (scf_cmd.rbufleng / SCF_S_CNT_16); - ii++, jj = ii * SCF_S_CNT_16) { - scfautopwr.ptime[ii].pon_year = - (int)(rbuf.b[jj] << 8) | (int)rbuf.b[jj + 1]; - scfautopwr.ptime[ii].pon_month = (int)rbuf.b[jj + 2]; - scfautopwr.ptime[ii].pon_date = (int)rbuf.b[jj + 3]; - scfautopwr.ptime[ii].pon_hour = (int)rbuf.b[jj + 4]; - scfautopwr.ptime[ii].pon_minute = (int)rbuf.b[jj + 5]; - - scfautopwr.ptime[ii].poff_year = - (int)(rbuf.b[jj + 8] << 8) | (int)rbuf.b[jj + 9]; - scfautopwr.ptime[ii].poff_month = (int)rbuf.b[jj + 10]; - scfautopwr.ptime[ii].poff_date = (int)rbuf.b[jj + 11]; - scfautopwr.ptime[ii].poff_hour = (int)rbuf.b[jj + 12]; - scfautopwr.ptime[ii].poff_minute = (int)rbuf.b[jj + 13]; - } - scfautopwr.valid_entries = 5; - - if (ddi_copyout((void *)&scfautopwr, (void *)arg, - sizeof (scfautopwr_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - -/* - * END_autopwrget - */ - END_autopwrget: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_autopwrclr() - * - * Description: SCFIOCSYSAUTOPWRCLR ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_autopwrclr(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_autopwrclr() " - int ret = 0; - struct scf_cmd scf_cmd; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scf_cmd.cmd = CMD_SYS_AUTOPOW; - scf_cmd.subcmd = SUB_SYS_AUTO_ONOFF_CLRAR; - scf_cmd.scount = 0; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_autopwrfpoff() - * - * Description: SCFIOCAUTOPWRFPOFF ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_autopwrfpoff(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_autopwrfpoff() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scfautopwrtime_t scfautopwrtime; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfautopwrtime, - sizeof (scfautopwrtime_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_autopwrfpoff; - } - bzero((void *)&sbuf.b[0], 5 * SCF_S_CNT_16); - if (scf_check_poff_time(&scfautopwrtime) < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_autopwrfpoff; - } - sbuf.b[0] = (uchar_t)(scfautopwrtime.poff_year >> 8); - sbuf.b[1] = (uchar_t)scfautopwrtime.poff_year; - sbuf.b[2] = (uchar_t)scfautopwrtime.poff_month; - sbuf.b[3] = (uchar_t)scfautopwrtime.poff_date; - sbuf.b[4] = (uchar_t)scfautopwrtime.poff_hour; - sbuf.b[5] = (uchar_t)scfautopwrtime.poff_minute; - - scf_cmd.cmd = CMD_SYS_AUTOPOW; - scf_cmd.subcmd = SUB_FORCED_POFF_SET; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_autopwrfpoff - */ - END_autopwrfpoff: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_autopwrexset() - * - * Description: SCFIOCAUTOPWREXSET ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_autopwrexset(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_autopwrexset() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t sbuf; - scfautopwrex_t scfautopwrex; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - if (ddi_copyin((void *)arg, (void *)&scfautopwrex, - sizeof (scfautopwrex_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_autopwrexset; - } - - switch (scfautopwrex.rpwr_mode) { - case AUTOPWREX_RESTORE: - case AUTOPWREX_NOPON: - case AUTOPWREX_AUTOPON: - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_autopwrexset; - } - - scf_cmd.cmd = CMD_SYS_AUTOPOW; - scf_cmd.subcmd = SUB_PRESET_MODE_SET; - scf_cmd.scount = SCF_S_CNT_15; - sbuf.b[0] = (unsigned char)scfautopwrex.rpwr_mode; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_autopwrexset - */ - END_autopwrexset: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_autopwrexget() - * - * Description: SCFIOCAUTOPWREXGET ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_autopwrexget(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_autopwrexget() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t rbuf; - scfautopwrex_t scfautopwrex; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - bzero((void *)&scfautopwrex, sizeof (scfautopwrex_t)); - - scf_cmd.cmd = CMD_SYS_AUTOPOW; - scf_cmd.subcmd = SUB_PRESET_MODE_DISP; - scf_cmd.scount = 0; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.flag = SCF_USE_SSBUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - scfautopwrex.rpwr_mode = (int)rbuf.b[0]; - - if (ddi_copyout((void *)&scfautopwrex, (void *)arg, - sizeof (scfautopwrex_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_dr() - * - * Description: SCFIOCDR ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_dr(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_dr() " - int ret = 0; - struct scf_cmd scf_cmd; - scfdr_t *scfdr_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfdr_p = kmem_zalloc((size_t)(sizeof (scfdr_t)), KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfdr_p, sizeof (scfdr_t), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_dr; - } - - scf_cmd.cmd = CMD_DR; - scf_cmd.subcmd = scfdr_p->sub_command; - scf_cmd.sbuf = &scfdr_p->sbuf[0]; - scf_cmd.scount = SCF_S_CNT_15; - - switch (scfdr_p->sub_command) { - case SUB_SB_CONF_CHG: - scf_cmd.rbuf = &scfdr_p->rbuf[0]; - scf_cmd.rcount = SCF_S_CNT_16; - scf_cmd.flag = SCF_USE_S_BUF; - break; - - case SUB_SB_BUILD_COMP: - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - break; - - case SUB_SB_SENSE_ALL: - scf_cmd.rbuf = &scfdr_p->rbuf[0]; - scf_cmd.rcount = sizeof (scfdr_p->rbuf); - scf_cmd.flag = SCF_USE_SLBUF; - break; - - case SUB_SB_SENSE: - scf_cmd.rbuf = &scfdr_p->rbuf[0]; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.flag = SCF_USE_SSBUF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_dr; - } - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret != 0) { - if (scf_cmd.stat0 == E_PARAM) { - ret = EINVAL; - } else { - goto END_dr; - } - } - - if (ddi_copyout((void *)scfdr_p, (void *)arg, sizeof (scfdr_t), - mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - } - -/* - * END_dr - */ - END_dr: - - if (scfdr_p) { - kmem_free((void *)scfdr_p, (size_t)(sizeof (scfdr_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_eventlist() - * - * Description: SCFIOCEVENTLIST ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_eventlist(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_eventlist() " - int ret = 0; - scfeventlist_t *scfeventlist_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfeventlist_p = kmem_zalloc((size_t)(sizeof (scfeventlist_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfeventlist_p, - sizeof (scfeventlist_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_eventlist; - } - if (scfeventlist_p->listcnt > SCF_EVENTLIST_MAX) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_eventlist; - } - - mutex_enter(&scf_comtbl.all_mutex); - - bcopy((void *)scfeventlist_p, (void *)&scf_comtbl.getevent_tbl.listcnt, - sizeof (scfeventlist_t)); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_eventlist - */ - END_eventlist: - - if (scfeventlist_p) { - kmem_free((void *)scfeventlist_p, - (size_t)(sizeof (scfeventlist_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_getevent() - * - * Description: SCFIOCGETEVENT ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_getevent(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_getevent() " - int ret = 0; - scfevent_t scfevent; - scfevent32_t scfevent32; - int loop_flag = 1; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - if (ddi_copyin((void *)arg, (void *)&scfevent32, - sizeof (scfevent32_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - goto END_getevent; - } - scfevent.flag = scfevent32.flag; - } else { - /* DDI_MODEL_NONE */ - if (ddi_copyin((void *)arg, (void *)&scfevent, - sizeof (scfevent_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - goto END_getevent; - } - } - - switch (scfevent.flag) { - case GETEVENT_WAIT: - mutex_enter(&scf_comtbl.all_mutex); - - while (loop_flag) { - if (scf_pop_getevent(&scfevent) == 0) { - break; - } - SC_DBG_DRV_TRACE(TC_W_SIG, __LINE__, - &scf_comtbl.getevent_cv, sizeof (kcondvar_t)); - if (cv_wait_sig(&scf_comtbl.getevent_cv, - &scf_comtbl.all_mutex) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.getevent_cv, - sizeof (kcondvar_t)); - - mutex_exit(&scf_comtbl.all_mutex); - ret = EINTR; - goto END_getevent; - } - } - - mutex_exit(&scf_comtbl.all_mutex); - break; - - case GETEVENT_NOWAIT: - mutex_enter(&scf_comtbl.all_mutex); - - if (scf_pop_getevent(&scfevent) < 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - - mutex_exit(&scf_comtbl.all_mutex); - ret = ENODATA; - goto END_getevent; - } - - mutex_exit(&scf_comtbl.all_mutex); - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_getevent; - } - - if (u_mode == DDI_MODEL_ILP32) { - /* DDI_MODEL_ILP32 */ - if ((scfevent.timestamp < INT32_MIN) || - (scfevent.timestamp > INT32_MAX)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EOVERFLOW; - goto END_getevent; - } - bcopy((void *)&scfevent.rci_addr, (void *)&scfevent32.rci_addr, - SCF_INT_REASON_SIZE); - scfevent32.timestamp = (time32_t)scfevent.timestamp; - - if (ddi_copyout((void *)&scfevent32, (void *)arg, - sizeof (scfevent32_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } else { - /* DDI_MODEL_NONE */ - if (ddi_copyout((void *)&scfevent, (void *)arg, - sizeof (scfevent_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_getevent - */ - END_getevent: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_setmadmevent() - * - * Description: SCFIOCSETMADMEVENT ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_setmadmevent(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_setmadmevent() " - int ret = 0; - struct scf_cmd scf_cmd; - scfiocsetmadmevent_t *scfiocsetmadmevent_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfiocsetmadmevent_p = - kmem_zalloc((size_t)(sizeof (scfiocsetmadmevent_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfiocsetmadmevent_p, - sizeof (scfiocsetmadmevent_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_setmadmevent; - } - - if (scfiocsetmadmevent_p->size > SCF_L_CNT_MAX) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_setmadmevent; - } - - scf_cmd.cmd = CMD_ERRLOG; - scf_cmd.subcmd = SUB_ERRLOG_SET_MADMIN; - scf_cmd.sbuf = &scfiocsetmadmevent_p->buf[0]; - scf_cmd.scount = scfiocsetmadmevent_p->size; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_setmadmevent - */ - END_setmadmevent: - - if (scfiocsetmadmevent_p) { - kmem_free((void *)scfiocsetmadmevent_p, - (size_t)(sizeof (scfiocsetmadmevent_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_remcscmd() - * - * Description: SCFIOCREMCSCMD ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_remcscmd(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_remcscmd() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t rbuf; - scfiocremcscmd_t scfiocremcscmd; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfiocremcscmd, - sizeof (scfiocremcscmd_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_remcscmd; - } - - if (scfiocremcscmd.size > SCF_S_CNT_15) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_remcscmd; - } - - scf_cmd.cmd = CMD_REMCS_SPT; - - switch (scfiocremcscmd.sub_command) { - case SUB_CMD_EX_REMCS: - scf_cmd.subcmd = scfiocremcscmd.sub_command; - scf_cmd.scount = scfiocremcscmd.size; - scf_cmd.sbuf = &scfiocremcscmd.buf[0]; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.flag = SCF_USE_SSBUF; - break; - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_remcscmd; - } - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - scfiocremcscmd.size = scf_cmd.rbufleng; - if (scfiocremcscmd.size != 0) { - bcopy((void *)&rbuf.b[0], - (void *)&scfiocremcscmd.buf[0], - scfiocremcscmd.size); - } - - if (ddi_copyout((void *)&scfiocremcscmd, (void *)arg, - sizeof (scfiocremcscmd_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_remcscmd - */ - END_remcscmd: - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_remcsfile() - * - * Description: SCFIOCREMCSFILE ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_remcsfile(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_remcsfile() " - int ret = 0; - struct scf_cmd scf_cmd; - scf_short_buffer_t rbuf; - scfiocremcsfile_t *scfiocremcsfile_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfiocremcsfile_p = kmem_zalloc((size_t)(sizeof (scfiocremcsfile_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfiocremcsfile_p, - sizeof (scfiocremcsfile_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_remcsfile; - } - - if (scfiocremcsfile_p->size > SCF_L_CNT_MAX) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_remcsfile; - } - - scf_cmd.cmd = CMD_FILE_DOWNLOAD; - scf_cmd.subcmd = scfiocremcsfile_p->sub_command; - - switch (scfiocremcsfile_p->sub_command) { - case SUB_FILEUP_READY: - if (scfiocremcsfile_p->size > SCF_L_CNT_MAX) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EINVAL; - goto END_remcsfile; - } - scf_cmd.scount = scfiocremcsfile_p->size; - scf_cmd.sbuf = &scfiocremcsfile_p->buf[0]; - scf_cmd.rcount = SCF_S_CNT_15; - scf_cmd.rbuf = &rbuf.b[0]; - scf_cmd.flag = SCF_USE_LSBUF; - break; - - case SUB_FILEUP_SET: - scf_cmd.scount = scfiocremcsfile_p->size; - scf_cmd.sbuf = &scfiocremcsfile_p->buf[0]; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - break; - - case SUB_TRANSFER_STOP: - scf_cmd.scount = 0; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_S_BUF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_remcsfile; - } - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - scfiocremcsfile_p->size = scf_cmd.rbufleng; - if (scfiocremcsfile_p->size != 0) { - bcopy((void *)&rbuf.b[0], - (void *)&scfiocremcsfile_p->buf[0], - scfiocremcsfile_p->size); - } - - if (ddi_copyout((void *)scfiocremcsfile_p, (void *)arg, - sizeof (scfiocremcsfile_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_remcsfile - */ - END_remcsfile: - - if (scfiocremcsfile_p) { - kmem_free((void *)scfiocremcsfile_p, - (size_t)(sizeof (scfiocremcsfile_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_sparecmd() - * - * Description: SCFIOCSPARECMD ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_sparecmd(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_sparecmd() " - int ret = 0; - struct scf_cmd scf_cmd; - scfiocsparecmd_t *scfiocsparecmd_p = NULL; - uint_t madm_scount; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfiocsparecmd_p = kmem_zalloc((size_t)(sizeof (scfiocsparecmd_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfiocsparecmd_p, - sizeof (scfiocsparecmd_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_sparecmd; - } - - if (scfiocsparecmd_p->size > SCF_L_CNT_MAX) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_sparecmd; - } - - scf_cmd.cmd = CMD_SPARE; - scf_cmd.subcmd = scfiocsparecmd_p->spare_sub_command; - scf_cmd.sbuf = &scfiocsparecmd_p->buf[0]; - scf_cmd.rbuf = &scfiocsparecmd_p->buf[0]; - scf_cmd.cexr[0] = scfiocsparecmd_p->command; - scf_cmd.cexr[1] = scfiocsparecmd_p->sub_command; - - switch (scfiocsparecmd_p->spare_sub_command) { - case SUB_SPARE_SS: - scf_cmd.scount = SCF_S_CNT_12; - scf_cmd.rcount = SCF_S_CNT_12; - scf_cmd.flag = SCF_USE_SSBUF; - break; - - case SUB_SPARE_SL: - scf_cmd.scount = SCF_S_CNT_12; - scf_cmd.rcount = SCF_L_CNT_MAX; - scf_cmd.flag = SCF_USE_SLBUF; - break; - - case SUB_SPARE_LS: - madm_scount = (scfiocsparecmd_p->size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV; - scf_cmd.scount = madm_scount; - scf_cmd.rcount = SCF_S_CNT_12; - scf_cmd.flag = SCF_USE_LSBUF; - break; - - default: - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_sparecmd; - } - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - - if (ret == 0) { - scfiocsparecmd_p->size = scf_cmd.rbufleng; - if (ddi_copyout((void *)scfiocsparecmd_p, (void *)arg, - sizeof (scfiocsparecmd_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "ioctl ", 8); - ret = EFAULT; - } - } - -/* - * END_sparecmd - */ - END_sparecmd: - - if (scfiocsparecmd_p) { - kmem_free((void *)scfiocsparecmd_p, - (size_t)(sizeof (scfiocsparecmd_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_ioc_setphpinfo() - * - * Description: SCFIOCSETPHPINFO ioctl command processing. - * - */ -/* ARGSUSED */ -int -scf_ioc_setphpinfo(intptr_t arg, int mode, int *rval_p, int u_mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_ioc_setphpinfo() " - int ret = 0; - struct scf_cmd scf_cmd; - scfsetphpinfo_t *scfsetphpinfo_p = NULL; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - scfsetphpinfo_p = kmem_zalloc((size_t)(sizeof (scfsetphpinfo_t)), - KM_SLEEP); - - if (ddi_copyin((void *)arg, (void *)scfsetphpinfo_p, - sizeof (scfsetphpinfo_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EFAULT; - goto END_setphpinfo; - } - - if (scfsetphpinfo_p->size > SCF_L_CNT_MAX) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "ioctl ", 8); - ret = EINVAL; - goto END_setphpinfo; - } - - scf_cmd.cmd = CMD_DOMAIN_INFO; - scf_cmd.subcmd = SUB_PCI_HP_CONFIG; - scf_cmd.sbuf = &scfsetphpinfo_p->buf[0]; - scf_cmd.scount = scfsetphpinfo_p->size; - scf_cmd.rcount = 0; - scf_cmd.flag = SCF_USE_L_BUF; - - mutex_enter(&scf_comtbl.all_mutex); - - ret = scf_send_cmd_check_bufful(&scf_cmd); - - mutex_exit(&scf_comtbl.all_mutex); - -/* - * END_setphpinfo - */ - END_setphpinfo: - - if (scfsetphpinfo_p) { - kmem_free((void *)scfsetphpinfo_p, - (size_t)(sizeof (scfsetphpinfo_t))); - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_push_reportsense() - * - * Description: Set processing of SCFIOCGETREPORT information. - * - */ -int -scf_push_reportsense(unsigned int rci_addr, unsigned char *sense, - time_t timestamp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_push_reportsense() " - int top = scf_comtbl.report_sense_top; - scfreport_t *rsensep = scf_comtbl.report_sensep; - int overflow = 0; - int ret = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (rsensep[top].flag != 0) { - SCFDBGMSG(SCF_DBGFLAG_IOCTL, "reportsense overflow"); - overflow = 1; - /* increment counter */ - scf_comtbl.scf_rsense_overflow++; - } - - rsensep[top].flag = 1; - rsensep[top].rci_addr = rci_addr; - bcopy((void *)&sense[0], (void *)&rsensep[top].report_sense[0], 4); - rsensep[top].timestamp = timestamp; - - scf_comtbl.report_sense_top = - ((scf_report_sense_pool_max - 1) == top) ? 0 : top + 1; - - if (overflow) { - scf_comtbl.report_sense_oldest = scf_comtbl.report_sense_top; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, - SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_pop_reportsense() - * - * Description: Get processing of SCFIOCGETREPORT information. - * - */ -int -scf_pop_reportsense(scfreport_t *rsense) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_pop_reportsense() " - int oldest = scf_comtbl.report_sense_oldest; - scfreport_t *drv_rsensep = scf_comtbl.report_sensep; - int ret = (-1); - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (drv_rsensep[oldest].flag != 0) { - rsense->rci_addr = drv_rsensep[oldest].rci_addr; - bcopy((void *)&drv_rsensep[oldest].report_sense[0], - (void *)&rsense->report_sense[0], 4); - rsense->timestamp = drv_rsensep[oldest].timestamp; - /* clear flag */ - drv_rsensep[oldest].flag = 0; - scf_comtbl.report_sense_oldest = - ((scf_report_sense_pool_max - 1) == oldest) - ? 0 : oldest + 1; - ret = 0; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, - SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_push_getevent() - * - * Description: Set processing of SCFIOCGETEVENT information. - * - */ -int -scf_push_getevent(unsigned char *event_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_push_getevent() " - int top = scf_comtbl.getevent_sense_top; - scfevent_t *scfevent_p = scf_comtbl.getevent_sensep; - int overflow = 0; - int ii; - time_t timestamp; - int ret = 1; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - /* Event check */ - for (ii = 0; ii < scf_comtbl.getevent_tbl.listcnt; ii++) { - if (event_p[4] == scf_comtbl.getevent_tbl.codelist[ii]) { - ret = 0; - break; - } - } - if (ret == 0) { - /* Event set */ - if (scfevent_p[top].flag != 0) { - SCFDBGMSG(SCF_DBGFLAG_IOCTL, "getevent overflow"); - overflow = 1; - /* increment counter */ - scf_comtbl.scf_getevent_overflow++; - } - timestamp = ddi_get_time(); - scfevent_p[top].flag = 1; - bcopy((void *)event_p, (void *)&scfevent_p[top].rci_addr, - SCF_INT_REASON_SIZE); - scfevent_p[top].timestamp = timestamp; - scf_comtbl.getevent_sense_top = - ((scf_getevent_pool_max - 1) == top) ? 0 : top + 1; - if (overflow) { - scf_comtbl.getevent_sense_oldest = - scf_comtbl.getevent_sense_top; - } - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, - SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_pop_reportsense() - * - * Description: Get processing of SCFIOCGETEVENT information. - * - */ -int -scf_pop_getevent(scfevent_t *event_p) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_pop_getevent() " - int oldest = scf_comtbl.getevent_sense_oldest; - scfevent_t *scfevent_p = scf_comtbl.getevent_sensep; - int ret = (-1); - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if (scfevent_p[oldest].flag != 0) { - bcopy((void *)&scfevent_p[oldest].rci_addr, - (void *)&event_p->rci_addr, SCF_INT_REASON_SIZE); - event_p->timestamp = scfevent_p[oldest].timestamp; - /* clear flag */ - scfevent_p[oldest].flag = 0; - scf_comtbl.getevent_sense_oldest = - ((scf_getevent_pool_max - 1) == oldest) - ? 0 : oldest + 1; - ret = 0; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, - SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_valid_date() - * - * Description: Validity check processing of date. - * - */ -int -scf_valid_date(int year, int month, int date) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_valid_date() " - int leap = 0; - int ret = 0; - static int scf_m2d[2][12] = { - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } - }; - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - if ((year % 400) == 0) { - leap = 1; - } else { - if ((year % 100) == 0) { - leap = 0; - } else { - if ((year % 4) == 0) { - leap = 1; - } - } - } - if (scf_m2d[leap][month - 1] < date) { - ret = 1; - } - - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_check_pon_time() - * - * Description: Power-on time range check processing. - * - */ -int -scf_check_pon_time(scfautopwrtime_t *ptime) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_check_pon_time() " - int ret = (-1); - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - /* check date, time */ - if ((ptime->pon_year == 0) && (ptime->pon_month == 0) && - (ptime->pon_date == 0) && (ptime->pon_hour == 0) && - (ptime->pon_minute == 0)) { - ret = 0; - goto END_check_pon_time; - } - - /* check date, time */ - if ((ptime->pon_year < 1970) || (ptime->pon_year > 9999)) { - goto END_check_pon_time; - } - if ((ptime->pon_month < 1) || (ptime->pon_month > 12)) { - goto END_check_pon_time; - } - if (ptime->pon_date < 1) { - goto END_check_pon_time; - } - if ((ptime->pon_hour < 0) || (ptime->pon_hour > 23)) { - goto END_check_pon_time; - } - if ((ptime->pon_minute < 0) || (ptime->pon_minute > 59)) { - goto END_check_pon_time; - } - if (scf_valid_date(ptime->pon_year, - ptime->pon_month, ptime->pon_date)) { - goto END_check_pon_time; - } - ret = 0; - -/* - * END_check_pon_time - */ - END_check_pon_time: - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, - SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_check_poff_time() - * - * Description: Power-off time range check processing. - * - */ -int -scf_check_poff_time(scfautopwrtime_t *ptime) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_check_poff_time() " - int ret = (-1); - - SCFDBGMSG(SCF_DBGFLAG_IOCTL, SCF_FUNC_NAME ": start"); - - /* all zero? */ - if ((ptime->poff_year == 0) && (ptime->poff_month == 0) && - (ptime->poff_date == 0) && (ptime->poff_hour == 0) && - (ptime->poff_minute == 0)) { - if ((ptime->flag != 0) || (ptime->sarea != 0)) { - goto END_check_poff_time; - } - ret = 0; - goto END_check_poff_time; - } - - /* check date, time */ - if ((ptime->poff_year < 1970) || (ptime->poff_year > 9999)) { - goto END_check_poff_time; - } - if ((ptime->poff_month < 1) || (ptime->poff_month > 12)) { - goto END_check_poff_time; - } - if (ptime->poff_date < 1) { - goto END_check_poff_time; - } - if ((ptime->poff_hour < 0) || (ptime->poff_hour > 23)) { - goto END_check_poff_time; - } - if ((ptime->poff_minute < 0) || (ptime->poff_minute > 59)) { - goto END_check_poff_time; - } - if (scf_valid_date(ptime->poff_year, ptime->poff_month, - ptime->poff_date)) { - goto END_check_poff_time; - } - ret = 0; - -/* - * END_check_poff_time - */ - END_check_poff_time: - SCFDBGMSG1(SCF_DBGFLAG_IOCTL, - SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfostoescf.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,307 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/ksynch.h> -#include <sys/types.h> -#include <sys/cmn_err.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> - - -/* - * scf_service_putinfo() - * - * Description: Data request to send processing from the OS to ESCF. - * - */ -/* ARGSUSED */ -int -scf_service_putinfo(uint32_t key, uint8_t type, uint32_t transid, - uint32_t length, void *datap) -{ -#define SCF_FUNC_NAME "scf_service_putinfo() " - scf_cmd_t scf_cmd; /* SCF command table */ - uchar_t *bufp = NULL; /* Working value : buff addr */ - int ret = 0; /* Return value */ - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG(SCF_DBGFLAG_SRV, SCF_FUNC_NAME ": start"); - SC_DBG_DRV_TRACE(TC_S_PUTINFO | TC_IN, __LINE__, &key, sizeof (key)); - - /* SCF command table clear */ - bzero((void *)&scf_cmd, sizeof (scf_cmd_t)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check "key" */ - if (key != KEY_ESCF) { - /* Invalid "key" */ - SC_DBG_DRV_TRACE(TC_S_PUTINFO | TC_ERRCD, __LINE__, &key, - sizeof (key)); - ret = EINVAL; - goto END_service_putinfo; - } - - /* Check "length" and "datap" */ - if ((length != 0) && (datap == NULL)) { - /* Invalid "length" or "datap" */ - SC_DBG_DRV_TRACE(TC_S_PUTINFO | TC_ERRCD, __LINE__, &length, - sizeof (length)); - ret = EINVAL; - goto END_service_putinfo; - } - - /* Check "length" is max length */ - if (length > SCF_L_CNT_MAX) { - /* Invalid "length" */ - SC_DBG_DRV_TRACE(TC_S_PUTINFO | TC_ERRCD, __LINE__, &length, - sizeof (length)); - ret = EINVAL; - goto END_service_putinfo; - } - - /* Check putinfo exec flag */ - if (scf_comtbl.putinfo_exec_flag == FLAG_ON) { - /* Multiplex, putinfo */ - SC_DBG_DRV_TRACE(TC_S_PUTINFO, __LINE__, - &scf_comtbl.putinfo_exec_flag, - sizeof (scf_comtbl.putinfo_exec_flag)); - ret = EBUSY; - goto END_service_putinfo; - } - - /* putinfo exec flag ON */ - scf_comtbl.putinfo_exec_flag = FLAG_ON; - - /* Check "length" is 0 */ - if (length != 0) { - /* Send buffer allocation */ - bufp = (uchar_t *)kmem_zalloc(length, KM_SLEEP); - - /* Data copy to send buffer */ - bcopy(datap, bufp, length); - } - - /* Make SCF command */ - scf_cmd.flag = SCF_USE_L_BUF; - scf_cmd.cmd = CMD_OS_XSCF_CTL; - scf_cmd.subcmd = type; - scf_cmd.sbuf = bufp; - scf_cmd.scount = length; - scf_cmd.rbuf = NULL; - scf_cmd.rcount = 0; - - /* Send SCF command */ - ret = scf_send_cmd_check_bufful(&scf_cmd); - - /* Check send buffer */ - if (bufp != NULL) { - /* Send data release */ - kmem_free((void *)bufp, length); - } - - /* putinfo exec flag OFF */ - scf_comtbl.putinfo_exec_flag = FLAG_OFF; - -/* - * END_service_putinfo - */ - END_service_putinfo: - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_S_PUTINFO | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_SRV, SCF_FUNC_NAME ": end return = %d", ret); - - return (ret); -} - - -/* - * scf_service_getinfo() - * - * Description: Data request to receive processing from the OS to ESCF. - * - */ -int -scf_service_getinfo(uint32_t key, uint8_t type, uint32_t transid, - uint32_t *lengthp, void *datap) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_service_getinfo() " - scf_cmd_t scf_cmd; /* SCF command table */ - scf_short_buffer_t sbuf; /* Send buffer */ - uchar_t *bufp = NULL; /* Working value : buff addr */ - uint_t wkleng; /* Working value : length */ - int ret = 0; /* Return value */ - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG(SCF_DBGFLAG_SRV, SCF_FUNC_NAME ": start"); - SC_DBG_DRV_TRACE(TC_S_GETINFO | TC_IN, __LINE__, &key, sizeof (key)); - - /* SCF command table/Send buffer clear */ - bzero((void *)&scf_cmd, sizeof (scf_cmd_t)); - bzero((void *)&sbuf.b[0], SCF_S_CNT_16); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Check "key" */ - if (key != KEY_ESCF) { - /* Invalid "key" */ - SC_DBG_DRV_TRACE(TC_S_GETINFO | TC_ERRCD, __LINE__, &key, - sizeof (key)); - ret = EINVAL; - goto END_service_getinfo; - } - - /* Check "lengthp" and "datap" */ - if (lengthp == NULL) { - /* Invalid "lengthp" */ - SC_DBG_DRV_TRACE(TC_S_GETINFO | TC_ERRCD, __LINE__, &lengthp, - sizeof (lengthp)); - ret = EINVAL; - goto END_service_getinfo; - } - - /* Check "lengthp" is max length */ - if (*lengthp > SCF_L_CNT_MAX) { - /* Invalid "lengthp" */ - SC_DBG_DRV_TRACE(TC_S_GETINFO | TC_ERRCD, __LINE__, lengthp, - sizeof (*lengthp)); - ret = EINVAL; - goto END_service_getinfo; - } - - /* Check, parameter "length" and "datap" */ - if ((*lengthp != 0) && (datap == NULL)) { - /* Invalid "lengthp" or "datap" */ - SC_DBG_DRV_TRACE(TC_S_GETINFO | TC_ERRCD, __LINE__, lengthp, - sizeof (*lengthp)); - ret = EINVAL; - goto END_service_getinfo; - } - - /* Check getinfo exec flag */ - if (scf_comtbl.getinfo_exec_flag == FLAG_ON) { - /* Multiplex, getinfo */ - SC_DBG_DRV_TRACE(TC_S_GETINFO, __LINE__, - &scf_comtbl.getinfo_exec_flag, - sizeof (scf_comtbl.getinfo_exec_flag)); - ret = EBUSY; - goto END_service_getinfo; - } - - /* getinfo exec flag ON */ - scf_comtbl.getinfo_exec_flag = FLAG_ON; - - /* Check "lengthp" is 0 */ - if (*lengthp != 0) { - /* - * Receive buffer allocation - */ - wkleng = *lengthp; - bufp = (uchar_t *)kmem_zalloc(wkleng, KM_SLEEP); - } else { - wkleng = 0; - } - - /* Make SCF command */ - sbuf.four_bytes_access[0] = transid; - scf_cmd.flag = SCF_USE_SLBUF; - scf_cmd.cmd = CMD_OS_XSCF_CTL; - scf_cmd.subcmd = type; - scf_cmd.scount = SCF_S_CNT_15; - scf_cmd.sbuf = &sbuf.b[0]; - scf_cmd.rcount = wkleng; - scf_cmd.rbuf = bufp; - - /* Send SCF command */ - ret = scf_send_cmd_check_bufful(&scf_cmd); - - /* Check return code */ - if (ret == 0) { - /* Set receive length */ - if (*lengthp > scf_cmd.rbufleng) { - /* Set receive data length */ - *lengthp = scf_cmd.rbufleng; - } - - /* Check receive data length is not 0 */ - if (*lengthp != 0) { - /* Data copy to "datap" */ - bcopy(bufp, datap, *lengthp); - } - } - - /* Check receive buffer */ - if (bufp != NULL) { - /* - * Receive data release - */ - kmem_free((void *)bufp, wkleng); - } - - /* getinfo exec flag OFF */ - scf_comtbl.getinfo_exec_flag = FLAG_OFF; - -/* - * END_service_getinfo - */ - END_service_getinfo: - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_S_GETINFO | TC_OUT, __LINE__, &ret, sizeof (ret)); - SCFDBGMSG1(SCF_DBGFLAG_SRV, SCF_FUNC_NAME ": end return = %d", ret); - - return (ret); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfparam.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfsys.h> - -/* - * Common table - */ -scf_comtbl_t scf_comtbl; /* SCF driver common table */ -void *scfstate; /* root of soft state */ -char *scf_driver_name = SCF_DRIVER_NAME; /* SCF driver name */ - -/* - * SCF driver control mode - */ -uint_t scf_halt_proc_mode = HALTPROC_STOP; /* SCFHALT after processing mode */ -uint_t scf_last_detach_mode = 0; /* Last detach mode */ - -/* - * SRAM trace date size - */ -uint_t scf_sram_trace_data_size = 12; /* Get SRAM trace data size */ - -/* - * Wait timer value (Micro-second) - */ -uint_t scf_rdctrl_sense_wait = 60000000; - /* SCFIOCRDCTRL wait timer value (60s) */ - -/* - * Wait timer value (Milli-second) - */ -uint_t scf_buf_ful_rtime = 500; - /* Buff full wait retry timer value (500ms) */ -uint_t scf_rci_busy_rtime = 3000; /* RCI busy wait retry timer value (3s) */ - -/* - * Re-try counter - */ -uint_t scf_buf_ful_rcnt = 10; /* Buff full retry counter */ -uint_t scf_rci_busy_rcnt = 15; /* RCI busy retry counter */ -uint_t scf_tesum_rcnt = 1; /* Tx sum retry counter */ -uint_t scf_resum_rcnt = 1; /* Rx sum retry counter */ -uint_t scf_cmd_to_rcnt = 1; /* Command to retry counter */ -uint_t scf_devbusy_wait_rcnt = 6; /* Command device busy retry counter */ -uint_t scf_online_wait_rcnt = 30; /* SCF online retry counter */ -uint_t scf_path_change_max = 4; /* SCF path change retry counter */ - -/* - * Max value - */ -uint_t scf_report_sense_pool_max = 96; /* Report sense max */ -uint_t scf_getevent_pool_max = 96; /* SCFIOCGETEVENT max */ -uint_t scf_rci_max = 32 + 94; /* RCI device max */ -uint_t scf_rxbuff_max_size = 4096; /* SCF command data division max size */ - -/* - * Poff factor (reported on shutdown start) - */ -unsigned char scf_poff_factor[2][3] = { - { 0x00, 0x00, 0x00 }, /* Shutdown (except pfail) */ - { 0x01, 0x00, 0x00 }}; /* Shutdown by pfail */ - -/* - * Alive check parameter - */ -uchar_t scf_alive_watch_code = 0x10; /* alive code for SCF driver */ -uchar_t scf_alive_phase_code = 0x00; /* alive phase code */ -uchar_t scf_alive_interval_time = INTERVAL_TIME_DEF; /* interval time */ -uchar_t scf_alive_monitor_time = MONITOR_TIME_DEF; /* monitor timeout */ -ushort_t scf_alive_panic_time = PANIC_TIME_DEF; /* panic timeout */ - -uchar_t scf_acr_phase_code = 0x00; /* Alive check register phase code */ - -/* - * FMEMA interface - */ -caddr_t scf_avail_cmd_reg_vaddr = 0; /* SCF Command register address */ - -/* - * Send break interface - */ -int scf_dm_secure_mode = 0; /* secure mode */ - -/* - * SCF driver version interface - */ -ushort_t scf_scfd_comif_version = 0x0000; /* SCF driver version */ - -/* - * XSCF version interface - */ -ushort_t scf_xscf_comif_version = 0xffff; /* XSCF version */ - -/* - * ioctl control value and flag - */ -int scf_save_hac_flag = 0; /* Host address disp flag */ -scfhac_t scf_save_hac; /* Host address disp save */ - -/* - * Register read sync value - */ -uint8_t scf_rs8; -uint16_t scf_rs16; -uint32_t scf_rs32; - -/* - * Panic value - */ -uint_t scf_panic_reported = 0; /* Panic report after */ -uint_t scf_panic_report_maxretry = 15; /* Same as busy_maxretry */ -uint_t scf_cmdend_wait_time_panic = 1000; - /* SCF command end wait timer value (1s) */ -uint_t scf_cmdend_wait_rcnt_panic = 4; /* SCF command end retry counter */ - -uint_t scf_panic_exec_wait_time = 100; /* Panic wait timer value (100ms) */ -uint_t scf_panic_exec_flag = 0; /* Panic exec flag */ -uint_t scf_panic_exec_flag2 = 0; /* Panic exec flag (report send) */ - -/* - * Panic trace - */ -ushort_t scf_panic_trc_w_off = 0; /* Panic trcae next write offset */ -uint16_t scf_panic_trc_command = 0; /* Panic SCF command register memo */ -uint16_t scf_panic_trc_status = 0; /* Panic SCF status register memo */ -ushort_t scf_panic_trc[16]; /* Panic trace area */
--- a/usr/src/uts/sun4u/opl/io/scfd/scfreg.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1977 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/kmem.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> - - -/* - * SCF command send control area save - */ -struct scf_cmd scfcmd_save; -uchar_t scf_sbuf_save[SCF_L_CNT_MAX]; -uchar_t scf_rbuf_save[SCF_L_CNT_MAX]; - -/* - * Function list - */ -int scf_map_regs(dev_info_t *dip, scf_state_t *statep); -void scf_unmap_regs(scf_state_t *statep); -int scf_send_cmd_check_bufful(struct scf_cmd *scfcmdp); -int scf_send_cmd(struct scf_cmd *scfcmdp); -void scf_i_send_cmd(struct scf_cmd *scfcmdp, struct scf_state *statep); -void scf_p_send_cmd(struct scf_cmd *scfcmdp, struct scf_state *statep); -int scf_path_check(scf_state_t **statep); -int scf_offline_check(scf_state_t *statep, uint_t timer_exec_flag); -int scf_cmdbusy_check(scf_state_t *statep); -void scf_alivecheck_start(scf_state_t *statep); -void scf_alivecheck_stop(scf_state_t *statep); -void scf_forbid_intr(struct scf_state *statep); -void scf_permit_intr(struct scf_state *statep, int flag); -int scf_check_state(scf_state_t *statep); -void scf_chg_scf(scf_state_t *statep, int status); -void scf_del_queue(scf_state_t *statep); -int scf_make_send_cmd(struct scf_cmd *scfcmdp, uint_t flag); -void scf_sram_trace_init(struct scf_state *statep); -void scf_sram_trace(struct scf_state *statep, uint8_t log_id); - -/* - * External function - */ -extern void scf_dscp_stop(uint32_t factor); - - -/* - * scf_map_regs() - * - * Description: Register and SRAM map processing. - * - */ -int -scf_map_regs(dev_info_t *dip, scf_state_t *statep) -{ -#define SCF_FUNC_NAME "scf_map_regs() " - int ret = 1; - uint32_t wkoffset = 0; - - ddi_device_acc_attr_t access_attr = { - DDI_DEVICE_ATTR_V0, - DDI_STRUCTURE_BE_ACC, - DDI_STRICTORDER_ACC - }; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - SCF_DBG_TEST_MAP_REGS(statep); - - /* map register 1 : SCF register */ - if (ddi_regs_map_setup(dip, REG_INDEX_SCF, - (caddr_t *)&statep->scf_regs, 0, 0, &access_attr, - &statep->scf_regs_handle) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_regs_map_setup failed.\n", - scf_driver_name); - goto END_map_regs; - } - statep->resource_flag |= S_DID_REG1; - - /* map register 2 : SCF contorol register */ - if (ddi_regs_map_setup(dip, REG_INDEX_SCFCNTL, - (caddr_t *)&statep->scf_regs_c, 0, 0, &access_attr, - &statep->scf_regs_c_handle) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_regs_map_setup failed.\n", - scf_driver_name); - goto END_map_regs; - } - statep->resource_flag |= S_DID_REG2; - - /* get size of register 3 : SCF DSCP SRAM */ - if (ddi_dev_regsize(dip, REG_INDEX_DSCPSRAM, - &statep->scf_dscp_sram_len) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_dev_regsize failed.\n", - scf_driver_name); - goto END_map_regs; - } - /* check size */ - if (statep->scf_dscp_sram_len < SRAM_MAX_DSCP) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_dev_regsize failed.\n", - scf_driver_name); - goto END_map_regs; - } else if (statep->scf_dscp_sram_len > SRAM_MAX_DSCP) { - statep->scf_dscp_sram_len = SRAM_MAX_DSCP; - } - /* map register 3 : SCF DSCP SRAM */ - if (ddi_regs_map_setup(dip, REG_INDEX_DSCPSRAM, - (caddr_t *)&statep->scf_dscp_sram, 0, - (offset_t)statep->scf_dscp_sram_len, &access_attr, - &statep->scf_dscp_sram_handle) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_regs_map_setup failed.\n", - scf_driver_name); - goto END_map_regs; - } - statep->resource_flag |= S_DID_REG3; - - /* get size of register 4 : SCF system SRAM */ - if (ddi_dev_regsize(dip, REG_INDEX_SYSTEMSRAM, - &statep->scf_sys_sram_len) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_dev_regsize failed.\n", - scf_driver_name); - goto END_map_regs; - } - /* check size */ - if (statep->scf_sys_sram_len < SRAM_MAX_SYSTEM) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_dev_regsize failed.\n", - scf_driver_name); - goto END_map_regs; - } else if (statep->scf_sys_sram_len > SRAM_MAX_SYSTEM) { - statep->scf_sys_sram_len = SRAM_MAX_SYSTEM; - } - /* map register 4 : SCF system SRAM */ - if (ddi_regs_map_setup(dip, REG_INDEX_SYSTEMSRAM, - (caddr_t *)&statep->scf_sys_sram, 0, - (offset_t)statep->scf_sys_sram_len, &access_attr, - &statep->scf_sys_sram_handle) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_regs_map_setup failed.\n", - scf_driver_name); - goto END_map_regs; - } - statep->resource_flag |= S_DID_REG4; - - /* get size of register 5 : SCF interface block */ - if (ddi_dev_regsize(dip, REG_INDEX_INTERFACE, - &statep->scf_interface_len) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_dev_regsize failed.\n", - scf_driver_name); - goto END_map_regs; - } - /* check size */ - if (statep->scf_interface_len < sizeof (scf_interface_t)) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_dev_regsize failed.\n", - scf_driver_name); - goto END_map_regs; - } else { - statep->scf_interface_len = sizeof (scf_interface_t); - } - /* map register 5 : SCF interface block */ - if (ddi_regs_map_setup(dip, REG_INDEX_INTERFACE, - (caddr_t *)&statep->scf_interface, 0, - (offset_t)statep->scf_interface_len, &access_attr, - &statep->scf_interface_handle) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: ddi_regs_map_setup failed.\n", - scf_driver_name); - goto END_map_regs; - } - statep->resource_flag |= S_DID_REG5; - - /* get size of register : SRAM driver trace */ - wkoffset = SCF_DDI_GET32(statep, statep->scf_interface_handle, - &statep->scf_interface->DRVTRC_OFFSET); - statep->scf_reg_drvtrc_len = - SCF_DDI_GET32(statep, statep->scf_interface_handle, - &statep->scf_interface->DRVTRC_SIZE); - - if ((wkoffset != 0) && (statep->scf_reg_drvtrc_len != 0)) { - /* map register : SRAM driver trace */ - if (ddi_regs_map_setup(dip, REG_INDEX_INTERFACE, - (caddr_t *)&statep->scf_reg_drvtrc, wkoffset, - (offset_t)statep->scf_reg_drvtrc_len, &access_attr, - &statep->scf_reg_drvtrc_handle) != DDI_SUCCESS) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "map_regs", 8); - cmn_err(CE_WARN, - "%s: scf_map_regs: " - "ddi_regs_map_setup failed.\n", - scf_driver_name); - goto END_map_regs; - } - statep->resource_flag |= S_DID_REG6; - } - - /* SRAM trace initialize */ - scf_sram_trace_init(statep); - - ret = 0; - -/* - * END_map_regs - */ - END_map_regs: - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_unmap_regs() - * - * Description: Register and SRAM un-map processing. - * - */ -void -scf_unmap_regs(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_unmap_regs() " - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - SCF_DBG_TEST_UNMAP_REGS(statep); - - /* Register and SRAM un-map */ - if (statep->resource_flag & S_DID_REG1) { - ddi_regs_map_free(&statep->scf_regs_handle); - statep->resource_flag &= ~S_DID_REG1; - } - - if (statep->resource_flag & S_DID_REG2) { - ddi_regs_map_free(&statep->scf_regs_c_handle); - statep->resource_flag &= ~S_DID_REG2; - } - - if (statep->resource_flag & S_DID_REG3) { - ddi_regs_map_free(&statep->scf_dscp_sram_handle); - statep->resource_flag &= ~S_DID_REG3; - } - - if (statep->resource_flag & S_DID_REG4) { - ddi_regs_map_free(&statep->scf_sys_sram_handle); - statep->resource_flag &= ~S_DID_REG4; - } - - if (statep->resource_flag & S_DID_REG5) { - ddi_regs_map_free(&statep->scf_interface_handle); - statep->resource_flag &= ~S_DID_REG5; - } - - if (statep->resource_flag & S_DID_REG6) { - ddi_regs_map_free(&statep->scf_reg_drvtrc_handle); - statep->resource_flag &= ~S_DID_REG6; - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_send_cmd_check_bufful() - * - * Description: SCF command send and buffer busy check processing. - * - */ -int -scf_send_cmd_check_bufful(struct scf_cmd *scfcmdp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_send_cmd_check_bufful() " - int ret = 0; - int buf_ful_cnt = scf_buf_ful_rcnt; - int rci_busy_cnt = scf_rci_busy_rcnt; - clock_t lb; - struct scf_state *statep; - int cv_ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - ret = scf_send_cmd(scfcmdp); - - while (((scfcmdp->stat0 == BUF_FUL) && (buf_ful_cnt != 0)) || - ((scfcmdp->stat0 == RCI_BUSY) && (rci_busy_cnt != 0))) { - if (scfcmdp->stat0 == BUF_FUL) { - buf_ful_cnt--; - lb = ddi_get_lbolt(); - lb += drv_usectohz(SCF_MIL2MICRO(scf_buf_ful_rtime)); - cv_ret = 0; - while (cv_ret != (-1)) { - SC_DBG_DRV_TRACE(TC_T_WAIT, __LINE__, - &scf_comtbl.cmdbusy_cv, - sizeof (kcondvar_t)); - if ((cv_ret = - cv_timedwait_sig(&scf_comtbl.cmdbusy_cv, - &scf_comtbl.all_mutex, lb)) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.cmdbusy_cv, - sizeof (kcondvar_t)); - ret = EINTR; - goto END_send_cmd_check_bufful; - } - } - } else if (scfcmdp->stat0 == RCI_BUSY) { - rci_busy_cnt--; - lb = ddi_get_lbolt(); - lb += drv_usectohz(SCF_MIL2MICRO(scf_rci_busy_rtime)); - cv_ret = 0; - while (cv_ret != (-1)) { - SC_DBG_DRV_TRACE(TC_T_WAIT, __LINE__, - &scf_comtbl.cmdbusy_cv, - sizeof (kcondvar_t)); - if ((cv_ret = - cv_timedwait_sig(&scf_comtbl.cmdbusy_cv, - &scf_comtbl.all_mutex, lb)) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.cmdbusy_cv, - sizeof (kcondvar_t)); - ret = EINTR; - goto END_send_cmd_check_bufful; - } - } - } else { - break; - } - ret = scf_send_cmd(scfcmdp); - } - - if (scf_comtbl.scf_exec_p) { - statep = scf_comtbl.scf_exec_p; - } else if (scf_comtbl.scf_path_p) { - statep = scf_comtbl.scf_path_p; - } - if (statep != NULL) { - if ((scfcmdp->stat0 == BUF_FUL) && (buf_ful_cnt == 0)) { - cmn_err(CE_WARN, - "%s,Buffer busy occurred in XSCF. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], - scfcmdp->subcmd, scfcmdp->cmd); - } else if ((scfcmdp->stat0 == RCI_BUSY) && - (rci_busy_cnt == 0)) { - cmn_err(CE_WARN, - "%s,RCI busy occurred in XSCF. " - "SCF command = 0x%02x%02x\n", - &statep->pathname[0], - scfcmdp->subcmd, scfcmdp->cmd); - } - } - -/* - * END_send_cmd_check_bufful - */ - END_send_cmd_check_bufful: - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); - -} - - -/* - * scf_send_cmd() - * - * Description: Synchronized SCF command send processing. - * - */ -int -scf_send_cmd(struct scf_cmd *scfcmdp) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_send_cmd() " - struct scf_state *statep; - int ret = 0; - int offline_ret; - int cmdbusy_ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - scfcmdp->stat0 = 0; - /* Check SCF command send sync re-start */ - if (scfcmdp->flag == SCF_USE_START) { - if (scf_comtbl.path_stop_flag != 0) { - /* Check path stop */ - scf_comtbl.path_stop_flag = 0; - goto END_scf_send_cmd; - } - goto END_scf_send_cmd99; - } - /* Check SCF command send sync re-stop */ - if ((scfcmdp->flag == SCF_USE_STOP) && - (scf_comtbl.path_stop_flag != 0)) { - goto STOP_scf_send_cmd; - } - /* Check SCF command send sync stop status */ - if ((scfcmdp->flag & SCF_USE_SP) != 0) { - goto SP_scf_send_cmd; - } - /* IOCTL/DETACH/SUSPEND send sync */ - while (scf_comtbl.cmd_busy != 0) { - scf_comtbl.cmd_wait += 1; - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmd_cv, - sizeof (kcondvar_t)); - if (cv_wait_sig(&scf_comtbl.cmd_cv, - &scf_comtbl.all_mutex) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, &scf_comtbl.cmd_cv, - sizeof (kcondvar_t)); - scf_comtbl.cmd_wait -= 1; - ret = EINTR; - goto END_scf_send_cmd99; - } - scf_comtbl.cmd_wait -= 1; - } - scf_comtbl.cmd_busy = 1; - -/* - * STOP_scf_send_cmd - */ - STOP_scf_send_cmd: - - /* Check SUSPEND flag */ - if (scf_comtbl.suspend_flag) { - ret = EBUSY; - scfcmdp->stat0 = SCF_STAT0_NOT_PATH; - goto END_scf_send_cmd; - } - - (void) scf_path_check(&statep); - if (statep == NULL) { - /* not exec SCF device */ - ret = EIO; - scfcmdp->stat0 = SCF_STAT0_NOT_PATH; - goto END_scf_send_cmd; - } - - offline_ret = scf_offline_check(statep, FLAG_ON); - cmdbusy_ret = scf_cmdbusy_check(statep); - - /* send comannd for interrupt */ - while ((scf_comtbl.scf_cmd_exec_flag != 0) || - (offline_ret != SCF_PATH_ONLINE) || - (cmdbusy_ret != SCF_COMMAND_READY)) { - scf_comtbl.cmd_busy_wait = 1; - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmdwait_cv, - sizeof (kcondvar_t)); - if (cv_wait_sig(&scf_comtbl.cmdwait_cv, - &scf_comtbl.all_mutex) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.cmdwait_cv, sizeof (kcondvar_t)); - scf_comtbl.cmd_busy_wait = 0; - ret = EINTR; - goto END_scf_send_cmd; - } - scf_comtbl.cmd_busy_wait = 0; - - (void) scf_path_check(&statep); - if (statep == NULL) { - /* not exec SCF device */ - ret = EIO; - scfcmdp->stat0 = SCF_STAT0_NOT_PATH; - goto END_scf_send_cmd; - } - - offline_ret = scf_offline_check(statep, FLAG_ON); - cmdbusy_ret = scf_cmdbusy_check(statep); - - if ((scf_comtbl.scf_cmd_exec_flag == 0) && - (offline_ret != SCF_PATH_ONLINE)) { - scf_timer_stop(SCF_TIMERCD_CMDBUSY); - scf_timer_stop(SCF_TIMERCD_ONLINE); - ret = EBUSY; - scfcmdp->stat0 = SCF_STAT0_NOT_PATH; - goto END_scf_send_cmd; - } - } - -/* - * SP_scf_send_cmd - */ - SP_scf_send_cmd: - - /* Check SUSPEND flag */ - if (scf_comtbl.suspend_flag) { - ret = EBUSY; - scfcmdp->stat0 = SCF_STAT0_NOT_PATH; - goto END_scf_send_cmd; - } - if ((statep = scf_comtbl.scf_exec_p) == 0) { - ret = EIO; - scfcmdp->stat0 = SCF_STAT0_NOT_PATH; - goto END_scf_send_cmd; - } - - if (scfcmdp->flag == SCF_USE_STOP) { - /* SCF command send sync stop */ - scf_comtbl.path_stop_flag = 1; - goto END_scf_send_cmd99; - } - - bcopy((char *)scfcmdp, (char *)&scfcmd_save, sizeof (struct scf_cmd)); - if (scfcmdp->sbuf != NULL) { - scfcmd_save.sbuf = &scf_sbuf_save[0]; - if (scfcmdp->scount) { - bcopy(scfcmdp->sbuf, scf_sbuf_save, scfcmdp->scount); - } - } - if (scfcmdp->rbuf != NULL) { - scfcmd_save.rbuf = &scf_rbuf_save[0]; - } - scfcmd_save.flag &= (~SCF_USE_SP); - scf_i_send_cmd(&scfcmd_save, statep); - scf_comtbl.scf_cmdp = &scfcmd_save; - - scf_comtbl.scf_exec_cmd_id = 1; - - scf_comtbl.cmd_end_wait = 1; - while (scf_comtbl.cmd_end_wait != 0) { - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmdend_cv, - sizeof (kcondvar_t)); - if (cv_wait_sig(&scf_comtbl.cmdend_cv, - &scf_comtbl.all_mutex) == 0) { - SC_DBG_DRV_TRACE(TC_KILL, __LINE__, - &scf_comtbl.cmdend_cv, sizeof (kcondvar_t)); - scf_comtbl.cmd_end_wait = 0; - ret = EINTR; - goto END_scf_send_cmd; - } - } - scfcmdp->stat0 = scfcmd_save.stat0; - scfcmdp->rbufleng = scfcmd_save.rbufleng; - scfcmdp->status = scfcmd_save.status; - if (scfcmdp->rbuf != NULL) { - if (scfcmdp->rbufleng < scfcmdp->rcount) { - bcopy(&scf_rbuf_save[0], scfcmdp->rbuf, - scfcmdp->rbufleng); - } else { - bcopy(&scf_rbuf_save[0], scfcmdp->rbuf, - scfcmdp->rcount); - } - } - scf_comtbl.cmd_end_wait = 0; - - switch (scfcmdp->stat0) { - case NORMAL_END: - break; - - case E_NOT_SUPPORT: - case RCI_NS: - ret = ENOTSUP; - break; - - default: - /* BUF_FUL/RCI_BUSY/other */ - ret = EIO; - } - - if ((scfcmdp->flag & SCF_USE_SP) != 0) { - goto END_scf_send_cmd99; - } - -/* - * END_scf_send_cmd - */ - END_scf_send_cmd: - - scf_comtbl.cmd_busy = 0; - if (scf_comtbl.cmd_wait) { - cv_signal(&scf_comtbl.cmd_cv); - SC_DBG_DRV_TRACE(TC_SIGNAL, __LINE__, &scf_comtbl.cmd_cv, - sizeof (kcondvar_t)); - } - - if ((scfcmdp->flag & SCF_USE_SP) != 0) { - scf_comtbl.path_stop_flag = 0; - } - -/* - * END_scf_send_cmd99 - */ - END_scf_send_cmd99: - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_i_send_cmd() - * - * Description: SCF command send processing. (for hard access) - * - */ -void -scf_i_send_cmd(struct scf_cmd *scfcmdp, struct scf_state *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_i_send_cmd() " - uint8_t sdata[16]; - uint8_t *wk_charp; - uint8_t sum = SCF_MAGICNUMBER_S; - uint32_t sum4 = SCF_MAGICNUMBER_L; - int scount; - int wkleng; - int ii; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - bzero((void *)sdata, 16); - - switch (scfcmdp->flag) { - case SCF_USE_S_BUF: - case SCF_USE_SSBUF: - case SCF_USE_SLBUF: - /* - * Use Tx data register, Not use Tx buffer data - */ - /* Set Tx data register memo */ - wk_charp = (uint8_t *)&scfcmdp->sbuf[0]; - if (scfcmdp->scount < SCF_S_CNT_16) { - scount = scfcmdp->scount; - } else { - scount = SCF_S_CNT_15; - } - for (ii = 0; ii < scount; ii++, wk_charp++) { - sdata[ii] = *wk_charp; - } - - /* Set CMD_SPARE data */ - if (scfcmdp->cmd == CMD_SPARE) { - sdata[12] = scfcmdp->cexr[0]; - sdata[13] = scfcmdp->cexr[1]; - } - - break; - - case SCF_USE_L_BUF: - case SCF_USE_LSBUF: - /* - * Use Tx data register, Use Tx buffer data - */ - /* Make Tx buffer data sum */ - for (ii = 0; ii < (scfcmdp->scount / 4); ii++) { - sum4 += ((scfcmdp->sbuf[ii * 4 + 0] << 24) | - (scfcmdp->sbuf[ii * 4 + 1] << 16) | - (scfcmdp->sbuf[ii * 4 + 2] << 8) | - (scfcmdp->sbuf[ii * 4 + 3])); - } - if ((scfcmdp->scount % 4) == 3) { - sum4 += ((scfcmdp->sbuf[ii * 4 + 0] << 24) | - (scfcmdp->sbuf[ii * 4 + 1] << 16) | - (scfcmdp->sbuf[ii * 4 + 2] << 8)); - } else if ((scfcmdp->scount % 4) == 2) { - sum4 += ((scfcmdp->sbuf[ii * 4 + 0] << 24) | - (scfcmdp->sbuf[ii * 4 + 1] << 16)); - } else if ((scfcmdp->scount % 4) == 1) { - sum4 += (scfcmdp->sbuf[ii * 4 + 0] << 24); - } - - /* Set Tx data register memo : data length */ - wk_charp = (uint8_t *)&scfcmdp->scount; - for (ii = 0; ii < 4; ii++, wk_charp++) { - sdata[ii] = *wk_charp; - } - - /* Set Tx data register memo : sum */ - wk_charp = (uint8_t *)&sum4; - for (ii = 8; ii < 12; ii++, wk_charp++) { - sdata[ii] = *wk_charp; - } - - /* Set CMD_SPARE data */ - if (scfcmdp->cmd == CMD_SPARE) { - sdata[12] = scfcmdp->cexr[0]; - sdata[13] = scfcmdp->cexr[1]; - } - - /* SRAM data write */ - wk_in_p = (uint8_t *)scfcmdp->sbuf; - wk_out_p = (uint8_t *)&statep->scf_sys_sram->DATA[0]; - for (ii = 0; ii < scfcmdp->scount; - ii++, wk_in_p++, wk_out_p++) { - SCF_DDI_PUT8(statep, statep->scf_sys_sram_handle, - wk_out_p, *wk_in_p); - } - - break; - } - - /* Make Tx data sum */ - for (ii = 0; ii < SCF_S_CNT_15; ii++) { - sum += sdata[ii]; - } - /* Set Tx data sum */ - sdata[15] = sum; - - /* TxDATA register set */ - statep->reg_tdata[0] = - (sdata[0] << 24) | (sdata[1] << 16) | - (sdata[2] << 8) | sdata[3]; - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->TDATA0, statep->reg_tdata[0]); - - statep->reg_tdata[1] = - (sdata[4] << 24) | (sdata[5] << 16) | - (sdata[6] << 8) | sdata[7]; - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->TDATA1, statep->reg_tdata[1]); - - SC_DBG_DRV_TRACE(TC_W_TDATA0, __LINE__, &statep->reg_tdata[0], - sizeof (statep->reg_tdata[0]) + sizeof (statep->reg_tdata[1])); - - statep->reg_tdata[2] = - (sdata[8] << 24) | (sdata[9] << 16) | - (sdata[10] << 8) | sdata[11]; - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->TDATA2, statep->reg_tdata[2]); - - statep->reg_tdata[3] = - (sdata[12] << 24) | (sdata[13] << 16) | - (sdata[14] << 8) | sdata[15]; - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->TDATA3, statep->reg_tdata[3]); - - SC_DBG_DRV_TRACE(TC_W_TDATA2, __LINE__, &statep->reg_tdata[2], - sizeof (statep->reg_tdata[2]) + sizeof (statep->reg_tdata[3])); - - /* SCF command extendedregister set */ - if (scf_comtbl.scf_cmd_resend_flag == 0) { - statep->reg_command_exr = 0x00; - } else { - scf_comtbl.scf_cmd_resend_flag = 0; - statep->reg_command_exr = COMMAND_ExR_RETRY; - } - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND_ExR, statep->reg_command_exr); - SC_DBG_DRV_TRACE(TC_W_COMMAND_ExR, __LINE__, &statep->reg_command_exr, - sizeof (statep->reg_command_exr)); - - /* SCF command register set */ - statep->reg_command = ((scfcmdp->subcmd << 8) | scfcmdp->cmd); - - /* Set sub command code */ - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - (uint8_t *)&statep->scf_regs->COMMAND, - (uint8_t)(statep->reg_command >> 8)); - /* Set command code : SCF interrupt */ - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - (uint8_t *)&statep->scf_regs->COMMAND + 1, - (uint8_t)statep->reg_command); - - SC_DBG_DRV_TRACE(TC_W_COMMAND, __LINE__, &statep->reg_command, - sizeof (statep->reg_command)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND); - - SCFDBGMSG2(SCF_DBGFLAG_REG, "CMD = 0x%04x CMDExR = 0x%02x", - statep->reg_command, statep->reg_command_exr); - SCFDBGMSG4(SCF_DBGFLAG_REG, "TxDR = 0x%08x 0x%08x 0x%08x 0x%08x", - statep->reg_tdata[0], statep->reg_tdata[1], - statep->reg_tdata[2], statep->reg_tdata[3]); - - scf_comtbl.scf_cmd_exec_flag = 1; - scf_comtbl.scf_exec_cmd_id = 0; - - /* SCF command timer start */ - scf_timer_start(SCF_TIMERCD_CMDEND); - - /* SRAM trace */ - SCF_SRAM_TRACE(statep, DTC_CMD); - SCF_SRAM_TRACE(statep, DTC_SENDDATA); - - if (((scfcmdp->flag == SCF_USE_L_BUF) || - (scfcmdp->flag == SCF_USE_LSBUF)) && - (scfcmdp->scount != 0)) { - if (scfcmdp->scount > scf_sram_trace_data_size) { - scount = scf_sram_trace_data_size; - } else { - scount = scfcmdp->scount; - } - wk_in_p = (uint8_t *)scfcmdp->sbuf; - while (scount != 0) { - bzero((void *)&statep->memo_scf_drvtrc.INFO[0], - sizeof (statep->memo_scf_drvtrc.INFO)); - wk_out_p = (uint8_t *)&statep->memo_scf_drvtrc.INFO[0]; - if (scount > sizeof (statep->memo_scf_drvtrc.INFO)) { - wkleng = sizeof (statep->memo_scf_drvtrc.INFO); - } else { - wkleng = scount; - } - scount -= wkleng; - bcopy(wk_in_p, wk_out_p, wkleng); - SCF_SRAM_TRACE(statep, DTC_SENDDATA_SRAM); - wk_in_p += wkleng; - } - } - - SC_DBG_DRV_TRACE(TC_SEND, __LINE__, &scfcmdp->flag, 8); - SC_DBG_DRV_TRACE(TC_SEND, __LINE__, &scfcmdp->scount, 8); - - SCF_DBG_TEST_SEND_CMD(statep, scfcmdp); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * panic send cmd function - */ -void -scf_p_send_cmd(struct scf_cmd *scfcmdp, struct scf_state *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_p_send_cmd() " - uint8_t sdata[16]; - uint8_t *wk_charp; - uint8_t sum = SCF_MAGICNUMBER_S; - uint32_t sum4 = SCF_MAGICNUMBER_L; - int scount; - int ii; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - uint16_t wk_int16; - - SCFDBGMSG(SCF_DBGFLAG_FOCK, SCF_FUNC_NAME ": start"); - - bzero((void *)sdata, 16); - - switch (scfcmdp->flag) { - case SCF_USE_S_BUF: - case SCF_USE_SSBUF: - case SCF_USE_SLBUF: - /* - * Use Tx data register, Not use Tx buffer data - */ - /* Set Tx data register memo */ - wk_charp = (uint8_t *)&scfcmdp->sbuf[0]; - if (scfcmdp->scount < SCF_S_CNT_16) { - scount = scfcmdp->scount; - } else { - scount = SCF_S_CNT_15; - } - for (ii = 0; ii < scount; ii++, wk_charp++) { - sdata[ii] = *wk_charp; - } - - break; - - case SCF_USE_L_BUF: - case SCF_USE_LSBUF: - /* - * Use Tx data register, Use Tx buffer data - */ - /* Make Tx buffer data sum */ - for (ii = 0; ii < (scfcmdp->scount / 4); ii++) { - sum4 += ((scfcmdp->sbuf[ii * 4 + 0] << 24) | - (scfcmdp->sbuf[ii * 4 + 1] << 16) | - (scfcmdp->sbuf[ii * 4 + 2] << 8) | - (scfcmdp->sbuf[ii * 4 + 3])); - } - if ((scfcmdp->scount % 4) == 3) { - sum4 += ((scfcmdp->sbuf[ii * 4 + 0] << 24) | - (scfcmdp->sbuf[ii * 4 + 1] << 16) | - (scfcmdp->sbuf[ii * 4 + 2] << 8)); - } else if ((scfcmdp->scount % 4) == 2) { - sum4 += ((scfcmdp->sbuf[ii * 4 + 0] << 24) | - (scfcmdp->sbuf[ii * 4 + 1] << 16)); - } else if ((scfcmdp->scount % 4) == 1) { - sum4 += (scfcmdp->sbuf[ii * 4 + 0] << 24); - } - - /* Set Tx data register memo : data length */ - wk_charp = (uint8_t *)&scfcmdp->scount; - for (ii = 0; ii < 4; ii++, wk_charp++) { - sdata[ii] = *wk_charp; - } - - /* Set Tx data register memo : sum */ - wk_charp = (uint8_t *)&sum4; - for (ii = 8; ii < 12; ii++, wk_charp++) { - sdata[ii] = *wk_charp; - } - - /* Set CMD_SPARE data */ - if (scfcmdp->cmd == CMD_SPARE) { - sdata[12] = scfcmdp->cexr[0]; - sdata[13] = scfcmdp->cexr[1]; - } - - /* SRAM data write */ - wk_in_p = (uint8_t *)scfcmdp->sbuf; - wk_out_p = (uint8_t *)&statep->scf_sys_sram->DATA[0]; - for (ii = 0; ii < scfcmdp->scount; - ii++, wk_in_p++, wk_out_p++) { - SCF_P_DDI_PUT8(statep->scf_sys_sram_handle, - wk_out_p, *wk_in_p); - } - - break; - } - - /* Make Tx data sum */ - for (ii = 0; ii < SCF_S_CNT_15; ii++) { - sum += sdata[ii]; - } - /* Set Tx data sum */ - sdata[15] = sum; - - /* TxDATA register set */ - SCF_P_DDI_PUT32(statep->scf_regs_handle, &statep->scf_regs->TDATA0, - (sdata[0] << 24) | (sdata[1] << 16) | - (sdata[2] << 8) | sdata[3]); - SCF_P_DDI_PUT32(statep->scf_regs_handle, &statep->scf_regs->TDATA1, - (sdata[4] << 24) | (sdata[5] << 16) | - (sdata[6] << 8) | sdata[7]); - SCF_P_DDI_PUT32(statep->scf_regs_handle, &statep->scf_regs->TDATA2, - (sdata[8] << 24) | (sdata[9] << 16) | - (sdata[10] << 8) | sdata[11]); - SCF_P_DDI_PUT32(statep->scf_regs_handle, &statep->scf_regs->TDATA3, - (sdata[12] << 24) | (sdata[13] << 16) | - (sdata[14] << 8) | sdata[15]); - - /* SCF command extendedregister set */ - SCF_P_DDI_PUT8(statep->scf_regs_handle, - &statep->scf_regs->COMMAND_ExR, 0x00); - - /* SCF command register set */ - SCF_P_DDI_PUT8(statep->scf_regs_handle, - (uint8_t *)&statep->scf_regs->COMMAND, - (uint8_t)scfcmdp->subcmd); - SCF_P_DDI_PUT8(statep->scf_regs_handle, - (uint8_t *)&statep->scf_regs->COMMAND + 1, - (uint8_t)scfcmdp->cmd); - /* Register read sync */ - wk_int16 = SCF_P_DDI_GET16(statep->scf_regs_handle, - &statep->scf_regs->COMMAND); - scf_panic_trc_command = wk_int16; - - SCFDBGMSG(SCF_DBGFLAG_FOCK, SCF_FUNC_NAME ": end"); -} - - -/* - * SCF path status check - */ -int -scf_path_check(scf_state_t **statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_path_check() " - int ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - if (scf_comtbl.scf_exec_p != NULL) { - /* SCF path exec status */ - if (statep != NULL) { - *statep = scf_comtbl.scf_exec_p; - } - - ret = scf_offline_check(scf_comtbl.scf_exec_p, FLAG_ON); - - } else if (scf_comtbl.scf_path_p != NULL) { - /* SCF path change status */ - if (statep != NULL) { - *statep = scf_comtbl.scf_path_p; - } - - ret = scf_offline_check(scf_comtbl.scf_path_p, FLAG_ON); - - if (ret == SCF_PATH_ONLINE) { - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF path change status"); - ret = SCF_PATH_CHANGE; - } - - } else { - /* SCF path halt status */ - if (statep != NULL) { - *statep = NULL; - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF path halt status"); - ret = SCF_PATH_HALT; - - } - - SCF_DBG_MAKE_PATH_CHECK(ret); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * ESCF offline check - */ -int -scf_offline_check(scf_state_t *statep, uint_t timer_exec_flag) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_offline_check() " - int ret; - uint8_t scf_unit; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Get SCF Status extended register */ - statep->reg_status_exr = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR); - SC_DBG_DRV_TRACE(TC_R_STATUS_ExR, __LINE__, &statep->reg_status_exr, - sizeof (statep->reg_status_exr)); - - SCF_DBG_MAKE_ONLINE(statep->reg_status_exr); - - /* Check SCF online */ - if ((statep->reg_status_exr & STATUS_SCF_STATUS) == STATUS_SCF_ONLINE) { - if (scf_comtbl.scf_status == SCF_STATUS_OFFLINE) { - cmn_err(CE_NOTE, "%s: SCF online.\n", scf_driver_name); - } - scf_comtbl.scf_status = SCF_STATUS_ONLINE; - - if (timer_exec_flag == FLAG_ON) { - /* Check online wait timer exec */ - if (scf_timer_check(SCF_TIMERCD_ONLINE) == - SCF_TIMER_NOT_EXEC) { - ret = SCF_PATH_ONLINE; - } else { - ret = SCF_PATH_OFFLINE_DRV; - } - } else { - ret = SCF_PATH_ONLINE; - } - } else { - if (scf_comtbl.scf_status != SCF_STATUS_OFFLINE) { - if (statep->reg_status_exr & STATUS_SCF_NO) { - scf_unit = 1; - } else { - scf_unit = 0; - } - cmn_err(CE_WARN, - "%s: SCF went to offline mode. unit=%d", - scf_driver_name, scf_unit); - } - scf_comtbl.scf_status = SCF_STATUS_OFFLINE; - - if (timer_exec_flag == FLAG_ON) { - /* Check online wait timer exec */ - if (scf_timer_check(SCF_TIMERCD_ONLINE) == - SCF_TIMER_NOT_EXEC) { - /* DCSP interface stop */ - scf_dscp_stop(FACTOR_OFFLINE); - - /* SCF online timer start */ - statep->online_to_rcnt = 0; - scf_timer_start(SCF_TIMERCD_ONLINE); - } - } - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF path offline"); - ret = SCF_PATH_OFFLINE; - } - - SCF_DBG_MAKE_OFFLINE_CHECK(ret); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * SCF command busy check - */ -int -scf_cmdbusy_check(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_cmdbusy_check() " - int ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - SCF_DBG_RTN_MAKE_CMD_READY; - - /* Get SCF command register */ - statep->reg_command = SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND); - SC_DBG_DRV_TRACE(TC_R_COMMAND, __LINE__, &statep->reg_command, - sizeof (statep->reg_command)); - statep->reg_command_exr = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->COMMAND_ExR); - SC_DBG_DRV_TRACE(TC_R_COMMAND_ExR, __LINE__, &statep->reg_command_exr, - sizeof (statep->reg_command_exr)); - - SCF_DBG_MAKE_CMD_BUSY(statep->reg_command, statep->reg_command_exr); - - /* Check busy flag */ - if (((statep->reg_command & COMMAND_BUSY) == 0x0000) && - ((statep->reg_command_exr & COMMAND_ExR_BUSY) == 0x00)) { - /* Check busy timer exec */ - if (scf_timer_check(SCF_TIMERCD_CMDBUSY) == - SCF_TIMER_NOT_EXEC) { - ret = SCF_COMMAND_READY; - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF command busy"); - } else { - ret = SCF_COMMAND_BUSY_DRV; - SCFDBGMSG(SCF_DBGFLAG_SYS, "SCF command exr busy"); - } - } else { - if (scf_comtbl.scf_cmd_exec_flag == FLAG_OFF) { - /* Check busy timer exec */ - if (scf_timer_check(SCF_TIMERCD_CMDBUSY) == - SCF_TIMER_NOT_EXEC) { - /* busy timer start */ - statep->devbusy_to_rcnt = 0; - scf_timer_start(SCF_TIMERCD_CMDBUSY); - } - } - ret = SCF_COMMAND_BUSY; - } - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -void -scf_alivecheck_start(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_alivecheck_start() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Check alive check exec */ - if (scf_comtbl.alive_running == SCF_ALIVE_START) { - /* Alive check value initialize */ - scf_acr_phase_code = 0; - scf_comtbl.scf_alive_int_count = scf_alive_interval_time / 3; - - /* Alive timer register initialize */ - statep->reg_atr = ATR_INTERVAL_STOP; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR, statep->reg_atr); - SC_DBG_DRV_TRACE(TC_W_ATR, __LINE__, &statep->reg_atr, - sizeof (statep->reg_atr)); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR); - - /* Alive Interrupt enable */ - statep->reg_control |= CONTROL_ALIVEINE; - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, statep->reg_control); - SC_DBG_DRV_TRACE(TC_W_CONTROL, __LINE__, &statep->reg_control, - sizeof (statep->reg_control)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - /* Alive timer register set */ - statep->reg_atr = ATR_INTERVAL_30S; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR, statep->reg_atr); - SC_DBG_DRV_TRACE(TC_W_ATR, __LINE__, &statep->reg_atr, - sizeof (statep->reg_atr)); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR); - - /* Alive check register set */ - statep->reg_acr = scf_acr_phase_code | ACR_ALIVE_INT; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->ACR, statep->reg_acr); - SC_DBG_DRV_TRACE(TC_W_ACR, __LINE__, &statep->reg_acr, - sizeof (statep->reg_acr)); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->ACR); - - SCFDBGMSG1(SCF_DBGFLAG_REG, "ACR = 0x%02x", statep->reg_acr); - - scf_acr_phase_code++; - - SCF_DBG_TEST_ALIVE_START(statep); - } - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -void -scf_alivecheck_stop(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_alivecheck_stop() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Alive Interrupt disable */ - statep->reg_control &= (~CONTROL_ALIVEINE); - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, statep->reg_control); - SC_DBG_DRV_TRACE(TC_W_CONTROL, __LINE__, &statep->reg_control, - sizeof (statep->reg_control)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - /* Alive timer register clear */ - statep->reg_atr = ATR_INTERVAL_STOP; - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR, statep->reg_atr); - SC_DBG_DRV_TRACE(TC_W_ATR, __LINE__, &statep->reg_atr, - sizeof (statep->reg_atr)); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->ATR); - - SCF_DBG_TEST_ALIVE_STOP(statep); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * forbid SCF interrupt - */ -void -scf_forbid_intr(struct scf_state *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_forbid_intr() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - /* Interrupt disable */ - statep->reg_control = CONTROL_DISABLE; - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, statep->reg_control); - SC_DBG_DRV_TRACE(TC_W_CONTROL, __LINE__, &statep->reg_control, - sizeof (statep->reg_control)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - scf_alivecheck_stop(statep); - - statep->resource_flag &= (~S_DID_REGENB); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * permit SCF interrupt - */ -void -scf_permit_intr(struct scf_state *statep, int flag) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_permit_intr() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - if (flag) { - /* SCF Status register interrupt clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS, 0xffff); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS); - - /* SCF Status extended register interrupt clear */ - SCF_DDI_PUT32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR, 0xffffffff); - /* Register read sync */ - scf_rs32 = SCF_DDI_GET32(statep, statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR); - - /* DSCP buffer status register interrupt clear */ - SCF_DDI_PUT8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR, 0xff); - /* Register read sync */ - scf_rs8 = SCF_DDI_GET8(statep, statep->scf_regs_handle, - &statep->scf_regs->DSR); - - /* SCF interrupt status register interrupt clear */ - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST, - (INT_ST_PATHCHGIE | CONTROL_ALIVEINE)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - } - - /* Interrupt enable */ - statep->reg_control = CONTROL_ENABLE; - SCF_DDI_PUT16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL, statep->reg_control); - SC_DBG_DRV_TRACE(TC_W_CONTROL, __LINE__, &statep->reg_control, - sizeof (statep->reg_control)); - /* Register read sync */ - scf_rs16 = SCF_DDI_GET16(statep, statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - - statep->resource_flag |= S_DID_REGENB; - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * Path status check - */ -int -scf_check_state(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_check_state() " - scf_state_t *wkstatep; - int ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start"); - - if (statep != NULL) { - if ((statep == scf_comtbl.scf_exec_p) || - (statep == scf_comtbl.scf_path_p)) { - /* PATH_STAT_ACTIVE status */ - ret = PATH_STAT_ACTIVE; - } else { - wkstatep = scf_comtbl.scf_wait_p; - while (wkstatep) { - if (statep == wkstatep) { - /* PATH_STAT_STANDBY status */ - ret = PATH_STAT_STANDBY; - goto END_check_state; - } else { - wkstatep = wkstatep->next; - } - } - wkstatep = scf_comtbl.scf_stop_p; - while (wkstatep) { - if (statep == wkstatep) { - /* PATH_STAT_STOP status */ - ret = PATH_STAT_STOP; - goto END_check_state; - } else { - wkstatep = wkstatep->next; - } - } - wkstatep = scf_comtbl.scf_err_p; - while (wkstatep) { - if (statep == wkstatep) { - /* PATH_STAT_FAIL status */ - ret = PATH_STAT_FAIL; - goto END_check_state; - } else { - wkstatep = wkstatep->next; - } - } - wkstatep = scf_comtbl.scf_disc_p; - while (wkstatep) { - if (statep == wkstatep) { - /* PATH_STAT_DISCON status */ - ret = PATH_STAT_DISCON; - goto END_check_state; - } else { - wkstatep = wkstatep->next; - } - } - /* scf_comtbl.scf_suspend_p queue */ - /* PATH_STAT_DISCON status */ - ret = PATH_STAT_EMPTY; - } - } else { - /* PATH_STAT_DISCON status */ - ret = PATH_STAT_EMPTY; - } - -/* - * END_check_state - */ - END_check_state: - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * Multi path status change and queue change - */ -void -scf_chg_scf(scf_state_t *statep, int status) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_chg_scf() " - scf_state_t *wkstatep; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG2(SCF_DBGFLAG_SYS, - SCF_FUNC_NAME ": start instance = %d status = %d", - statep->instance, statep->path_status); - - /* Set path status */ - if (statep->path_status != status) { - statep->old_path_status = statep->path_status; - statep->path_status = status; - } - switch (status) { - case PATH_STAT_ACTIVE: - /* Not queue change */ - break; - - case PATH_STAT_EMPTY: - /* Change empty queue */ - if (scf_comtbl.scf_suspend_p) { - wkstatep = scf_comtbl.scf_suspend_p; - while (wkstatep->next) { - wkstatep = wkstatep->next; - } - wkstatep->next = statep; - } else { - scf_comtbl.scf_suspend_p = statep; - } - statep->next = 0; - break; - - case PATH_STAT_STANDBY: - /* Change standby queue */ - if (scf_comtbl.scf_wait_p) { - wkstatep = scf_comtbl.scf_wait_p; - while (wkstatep->next) { - wkstatep = wkstatep->next; - } - wkstatep->next = statep; - } else { - scf_comtbl.scf_wait_p = statep; - } - statep->next = 0; - break; - - case PATH_STAT_STOP: - /* Change stop queue */ - if (scf_comtbl.scf_stop_p) { - wkstatep = scf_comtbl.scf_stop_p; - while (wkstatep->next) { - wkstatep = wkstatep->next; - } - wkstatep->next = statep; - } else { - scf_comtbl.scf_stop_p = statep; - } - statep->next = 0; - break; - - case PATH_STAT_FAIL: - /* Change fail queue */ - if (scf_comtbl.scf_err_p) { - wkstatep = scf_comtbl.scf_err_p; - while (wkstatep->next) { - wkstatep = wkstatep->next; - } - wkstatep->next = statep; - } else { - scf_comtbl.scf_err_p = statep; - } - statep->next = 0; - break; - - case PATH_STAT_DISCON: - /* Change disconnect queue */ - if (scf_comtbl.scf_disc_p) { - wkstatep = scf_comtbl.scf_disc_p; - while (wkstatep->next) { - wkstatep = wkstatep->next; - } - wkstatep->next = statep; - } else { - scf_comtbl.scf_disc_p = statep; - } - statep->next = 0; - break; - } - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end status = %d", - statep->path_status); -} - -/* - * Multi path queue check and delete queue - */ -void -scf_del_queue(scf_state_t *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_del_queue() " - scf_state_t *wkstatep; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start instance = %d", - statep->instance); - - if ((wkstatep = scf_comtbl.scf_exec_p) == statep) { - /* Delete active(exec) queue */ - scf_comtbl.scf_exec_p = NULL; - return; - } else if ((wkstatep = scf_comtbl.scf_path_p) == statep) { - /* Delete active(path change) queue */ - scf_comtbl.scf_path_p = NULL; - return; - } else { - if ((wkstatep = scf_comtbl.scf_suspend_p) != 0) { - /* Delete empty(suspend) queue */ - if (wkstatep == statep) { - scf_comtbl.scf_suspend_p = wkstatep->next; - return; - } else { - while (wkstatep->next) { - if (wkstatep->next == statep) { - wkstatep->next = statep->next; - return; - } - wkstatep = wkstatep->next; - } - } - } - if ((wkstatep = scf_comtbl.scf_wait_p) != 0) { - /* Delete standby(wait) queue */ - if (wkstatep == statep) { - scf_comtbl.scf_wait_p = wkstatep->next; - return; - } else { - while (wkstatep->next) { - if (wkstatep->next == statep) { - wkstatep->next = statep->next; - return; - } - wkstatep = wkstatep->next; - } - } - } - if ((wkstatep = scf_comtbl.scf_err_p) != 0) { - /* Delete fail(error) queue */ - if (wkstatep == statep) { - scf_comtbl.scf_err_p = wkstatep->next; - return; - } else { - while (wkstatep->next) { - if (wkstatep->next == statep) { - wkstatep->next = statep->next; - return; - } - wkstatep = wkstatep->next; - } - } - } - if ((wkstatep = scf_comtbl.scf_stop_p) != 0) { - /* Delete stop queue */ - if (wkstatep == statep) { - scf_comtbl.scf_stop_p = wkstatep->next; - return; - } else { - while (wkstatep->next) { - if (wkstatep->next == statep) { - wkstatep->next = statep->next; - return; - } - wkstatep = wkstatep->next; - } - } - } - if ((wkstatep = scf_comtbl.scf_disc_p) != 0) { - /* Delete disconnect queue */ - if (wkstatep == statep) { - scf_comtbl.scf_disc_p = wkstatep->next; - return; - } else { - while (wkstatep->next) { - if (wkstatep->next == statep) { - wkstatep->next = statep->next; - return; - } - wkstatep = wkstatep->next; - } - } - } - } - SCFDBGMSG(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end"); -} - - -/* - * SCF command send sync - */ -int -scf_make_send_cmd(struct scf_cmd *scfcmdp, uint_t flag) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_make_send_cmd() " - /* falg = SCF_USE_STOP : SCF command stop wait */ - /* falg = SCF_USE_START : SCF_USE_STOP signal */ - - int ret; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": start flag = 0x%08x", - flag); - - scfcmdp->cmd = 0; - scfcmdp->subcmd = 0; - scfcmdp->scount = 0; - scfcmdp->sbuf = NULL; - scfcmdp->rcount = 0; - scfcmdp->rbuf = NULL; - scfcmdp->flag = flag; - ret = scf_send_cmd_check_bufful(scfcmdp); - - SCFDBGMSG1(SCF_DBGFLAG_SYS, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_sram_trace_init() - * - * SRAM trace initialize processing. - * - */ -void -scf_sram_trace_init(struct scf_state *statep) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_sram_trace_init() " - uint8_t wk_drv_id; - uint32_t wk_data_top; - uint32_t wk_data_last; - uint32_t wk_data_write; - off_t min_len; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - int wk_leng; - int ii; - uint8_t drv_name[DRV_ID_SIZE]; - uint8_t *wk_drv_vl = (uint8_t *)SCF_DRIVER_VERSION; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_TRACE, SCF_FUNC_NAME ": start"); - - /* Check SRAM map */ - if (statep->resource_flag & S_DID_REG6) { - wk_drv_id = - SCF_DDI_GET8(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DRV_ID[0]); - wk_data_top = - SCF_DDI_GET32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_TOP); - wk_data_last = - SCF_DDI_GET32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_LAST); - wk_data_write = - SCF_DDI_GET32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_WRITE); - if ((wk_drv_id == 0) || - (wk_data_top != statep->memo_DATA_TOP) || - (wk_data_last != statep->memo_DATA_LAST) || - ((wk_data_write >= wk_data_top) && - (wk_data_write <= wk_data_last))) { - /* Make SRAM driver trace header */ - min_len = (off_t)(sizeof (scf_if_drvtrc_t) + - sizeof (scf_drvtrc_ent_t)); - if (statep->scf_reg_drvtrc_len >= min_len) { - statep->memo_DATA_TOP = - (uint32_t)(sizeof (scf_if_drvtrc_t)); - statep->memo_DATA_WRITE = - (uint32_t)(sizeof (scf_if_drvtrc_t)); - statep->memo_DATA_LAST = - (uint32_t)(statep->scf_reg_drvtrc_len - - sizeof (scf_drvtrc_ent_t)); - } else { - statep->memo_DATA_TOP = 0; - statep->memo_DATA_WRITE = 0; - statep->memo_DATA_LAST = 0; - } - SCF_DDI_PUT32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_TOP, - statep->memo_DATA_TOP); - SCF_DDI_PUT32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_WRITE, - statep->memo_DATA_WRITE); - SCF_DDI_PUT32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_LAST, - statep->memo_DATA_LAST); - } else { - statep->memo_DATA_TOP = SCF_DDI_GET32(statep, - statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_TOP); - statep->memo_DATA_WRITE = SCF_DDI_GET32(statep, - statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_WRITE); - statep->memo_DATA_LAST = SCF_DDI_GET32(statep, - statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_LAST); - } - - wk_leng = sizeof (SCF_DRIVER_VERSION); - if (wk_leng > DRV_ID_SIZE) { - wk_leng = DRV_ID_SIZE; - } - wk_in_p = wk_drv_vl; - wk_out_p = (uint8_t *)&drv_name[0]; - for (ii = 0; ii < wk_leng; ii++, wk_in_p++, wk_out_p++) { - *wk_out_p = *wk_in_p; - } - for (; ii < DRV_ID_SIZE; ii++, wk_out_p++) { - *wk_out_p = ' '; - } - wk_in_p = (uint8_t *)&drv_name[0]; - wk_out_p = (uint8_t *)&statep->scf_reg_drvtrc->DRV_ID[0]; - for (ii = 0; ii < DRV_ID_SIZE; ii++, wk_in_p++, wk_out_p++) { - SCF_DDI_PUT8(statep, statep->scf_reg_drvtrc_handle, - wk_out_p, *wk_in_p); - } - } else { - statep->memo_DATA_TOP = 0; - statep->memo_DATA_WRITE = 0; - statep->memo_DATA_LAST = 0; - } - - SCFDBGMSG(SCF_DBGFLAG_TRACE, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_sram_trace() - * - * SRAM trace get processing. - * - */ -void -scf_sram_trace(struct scf_state *statep, uint8_t log_id) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_sram_trace() " - uint8_t *wk_in_p; - uint8_t *wk_out_p; - clock_t clock_val; - uint32_t log_time; - uint8_t wk_log_id; - int ii; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_TRACE, SCF_FUNC_NAME ": start"); - - if (statep->memo_DATA_WRITE) { - statep->memo_scf_drvtrc.LOG_ID = log_id; - clock_val = ddi_get_lbolt(); - log_time = (uint32_t)(drv_hztousec(clock_val) / 100000); - statep->memo_scf_drvtrc.LOG_TIME[0] = (uint8_t)(log_time >> 16); - statep->memo_scf_drvtrc.LOG_TIME[1] = (uint8_t)(log_time >> 8); - statep->memo_scf_drvtrc.LOG_TIME[2] = (uint8_t)(log_time); - - if ((log_id & DTC_MASK_HIGH) == DTC_ERRRTN) { - wk_log_id = DTC_ERRRTN; - } else { - wk_log_id = log_id; - } - - /* Check log id */ - switch (wk_log_id) { - case DTC_ONLINETO: /* SCF online timeout */ - case DTC_ONLINE: /* SCF online start */ - case DTC_OFFLINE: /* SCF offline start */ - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA2_2(4, statep->reg_command, - statep->reg_status); - SCF_SET_SRAM_DATA4_1(8, statep->reg_status_exr); - break; - - case DTC_SENDDATA: /* SCF send command data */ - SCF_SET_SRAM_DATA4_3(0, statep->reg_tdata[0], - statep->reg_tdata[2], statep->reg_tdata[3]); - break; - - case DTC_RECVDATA: /* SCF recv command data */ - SCF_SET_SRAM_DATA4_3(0, statep->reg_rdata[0], - statep->reg_rdata[2], statep->reg_rdata[3]); - break; - - case DTC_ERRRTN: /* SCF command retuen error */ - SCF_SET_SRAM_DATA4_3(0, statep->reg_tdata[0], - statep->reg_tdata[1], statep->reg_tdata[2]); - break; - - - case DTC_RSUMERR: /* SCF command receive sum error */ - SCF_SET_SRAM_DATA4_3(0, statep->reg_rdata[0], - statep->reg_rdata[1], statep->reg_rdata[2]); - break; - - case DTC_DSCP_TXREQ: /* DSCP TxREQ request */ - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA1_2(4, statep->reg_dcr, - statep->reg_dsr); - SCF_SET_SRAM_DATA2_1(6, statep->reg_txdcr_c_flag); - SCF_SET_SRAM_DATA4_1(8, statep->reg_txdcr_c_length); - break; - - case DTC_DSCP_RXACK: /* DSCP RxACK request */ - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA1_2(4, statep->reg_dcr, - statep->reg_dsr); - SCF_SET_SRAM_DATA2_1(6, statep->reg_rxdcr_c_flag); - SCF_SET_SRAM_DATA2_2(8, statep->reg_rxdcr_c_offset, 0); - break; - - case DTC_DSCP_RXEND: /* DSCP RxEND request */ - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA1_2(4, statep->reg_dcr, - statep->reg_dsr); - SCF_SET_SRAM_DATA2_1(6, statep->reg_rxdsr_c_flag); - SCF_SET_SRAM_DATA2_2(8, statep->reg_rxdsr_c_offset, 0); - break; - - case DTC_DSCP_RXREQ: - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA1_2(4, statep->reg_dcr, - statep->reg_dsr); - SCF_SET_SRAM_DATA2_1(6, statep->reg_rxdcr_c_flag); - SCF_SET_SRAM_DATA4_1(8, statep->reg_rxdcr_c_length); - break; - - - case DTC_DSCP_TXACK: /* DSCP TxACK interrupt */ - case DTC_DSCP_ACKTO: /* DSCP ACK timeout */ - case DTC_DSCP_ENDTO: /* DSCP END timeout */ - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA1_2(4, statep->reg_dcr, - statep->reg_dsr); - SCF_SET_SRAM_DATA2_1(6, statep->reg_txdcr_c_flag); - SCF_SET_SRAM_DATA2_2(8, statep->reg_txdcr_c_offset, 0); - break; - - case DTC_DSCP_TXEND: /* DSCP TxEND interrupt */ - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA1_2(4, statep->reg_dcr, - statep->reg_dsr); - SCF_SET_SRAM_DATA2_1(6, statep->reg_txdsr_c_flag); - SCF_SET_SRAM_DATA2_2(8, statep->reg_txdsr_c_offset, 0); - break; - - case DTC_SENDDATA_SRAM: /* SCF send command data for SRAM */ - case DTC_RECVDATA_SRAM: /* SCF recv command data for SRAM */ - case DTC_DSCP_SENDDATA: /* DSCP send data */ - case DTC_DSCP_RECVDATA: /* DSCP send data */ - /* Information is already set */ - break; - - case DTC_CMD: /* SCF command start */ - case DTC_INT: /* SCF interrupt */ - case DTC_CMDTO: /* SCF command timeout */ - case DTC_CMDBUSYTO: /* SCF command busy timeout */ - default: - SCF_SET_SRAM_DATA2_2(0, statep->reg_control, - statep->reg_int_st); - SCF_SET_SRAM_DATA2_2(4, statep->reg_command, - statep->reg_status); - SCF_SET_SRAM_DATA1_2(8, statep->reg_command_exr, - (statep->reg_status_exr >> 24)); - SCF_SET_SRAM_DATA1_2(10, statep->reg_acr, - statep->reg_atr); - break; - } - /* Set trace data */ - wk_in_p = (uint8_t *)&statep->memo_scf_drvtrc.LOG_ID; - wk_out_p = (uint8_t *)statep->scf_reg_drvtrc + - statep->memo_DATA_WRITE; - for (ii = 0; ii < sizeof (scf_drvtrc_ent_t); - ii++, wk_in_p++, wk_out_p++) { - SCF_DDI_PUT8(statep, statep->scf_reg_drvtrc_handle, - wk_out_p, *wk_in_p); - } - - /* Next offset update */ - statep->memo_DATA_WRITE += sizeof (scf_drvtrc_ent_t); - if (statep->memo_DATA_WRITE > statep->memo_DATA_LAST) { - statep->memo_DATA_WRITE = statep->memo_DATA_TOP; - } - SCF_DDI_PUT32(statep, statep->scf_reg_drvtrc_handle, - &statep->scf_reg_drvtrc->DATA_WRITE, - statep->memo_DATA_WRITE); - } - - SCFDBGMSG(SCF_DBGFLAG_TRACE, SCF_FUNC_NAME ": end"); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scfsnap.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,766 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/file.h> -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> -#include <sys/scfd/scfdscp.h> - -#ifdef DEBUG -/* - * Function list - */ -int scf_snapshotsize(intptr_t arg, int mode); -int scf_get_snapize(int type, int info); -int scf_snapshot(intptr_t arg, int mode); -int scf_get_snap(int type, int info, scfsnap_value_t *snap_p, - int snap_size); - - -/* - * External function - */ -extern scf_dscp_comtbl_t scf_dscp_comtbl; - - -/* - * scf_snapshotsize() - */ -int -scf_snapshotsize(intptr_t arg, int mode) -{ -#define SCF_FUNC_NAME "scf_snapshotsize() " - int snap_size; - scfsnapsize_t scfsnapsize; - int ret = 0; - - SCFDBGMSG(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": start"); - - if (ddi_copyin((void *)arg, (void *)&scfsnapsize, - sizeof (scfsnapsize_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "dbg_snap", 8); - ret = EFAULT; - goto END_snapshotsize; - } - - if (mutex_tryenter(&scf_comtbl.all_mutex) != 0) { - snap_size = scf_get_snapize(scfsnapsize.type, scfsnapsize.info); - - mutex_exit(&scf_comtbl.all_mutex); - - if (snap_size == (-1)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EINVAL; - goto END_snapshotsize; - } - - scfsnapsize.size = snap_size; - - if (ddi_copyout((void *)&scfsnapsize, (void *)arg, - sizeof (scfsnapsize_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EFAULT; - } - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "dbg_snap", 8); - ret = EBUSY; - } - -/* - * END_snapshotsize - */ - END_snapshotsize: - - SCFDBGMSG1(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_get_snapize() - */ -int -scf_get_snapize(int type, int info) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_get_snapize() " - scf_state_t *statep = NULL; - int wk_size; - int ii; - int snap_driver_size; - int snap_register_size; - int snap_sram_size; - int ret = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": start type = %d", type); - - if (info == SCFSNAPINFO_AUTO) { - statep = scf_comtbl.scf_exec_p; - if (statep == NULL) { - statep = scf_comtbl.scf_path_p; - } - } else if (info < scf_comtbl.path_num) { - statep = scf_comtbl.iomp_scf[info]; - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "snapsize", 8); - ret = (-1); - goto END_get_snapize; - } - - /* Set driver area size */ - wk_size = DRV_ID_SIZE; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size = wk_size; - - wk_size = sizeof (scf_timer); - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - - wk_size = sizeof (scf_comtbl_t); - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - - if (statep != NULL) { - wk_size = sizeof (scf_state_t); - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - } - - wk_size = sizeof (scf_dscp_comtbl_t); - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - - if (scf_dscp_comtbl.tx_dscp != NULL) { - wk_size = scf_dscp_comtbl.tx_dscsize; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - } - - if (scf_dscp_comtbl.rx_dscp != NULL) { - wk_size = scf_dscp_comtbl.rx_dscsize; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - } - - if (scf_dscp_comtbl.tx_sramp != NULL) { - wk_size = scf_dscp_comtbl.tx_sramsize; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - } - - for (ii = 0; ii < MBIF_MAX; ii++) { - if (scf_dscp_comtbl.scf_dscp_main[ii].ev_quep != NULL) { - wk_size = scf_dscp_comtbl.scf_dscp_main[ii].ev_quesize; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - } - if (scf_dscp_comtbl.scf_dscp_main[ii].rd_datap != NULL) { - wk_size = scf_dscp_comtbl.scf_dscp_main[ii].rd_datasize; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV); - snap_driver_size += wk_size; - } - } - - /* Set register area size */ - if (statep != NULL) { - wk_size = sizeof (scf_regs_t) + sizeof (scf_regs_c_t); - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_register_size = wk_size; - } else { - snap_register_size = 0; - } - - /* Set sram area size */ - if (statep != NULL) { - wk_size = sizeof (scf_dscp_sram_t) + - sizeof (scf_sys_sram_t) + statep->scf_reg_drvtrc_len; - wk_size = sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV); - snap_sram_size = wk_size; - } else { - snap_sram_size = 0; - } - - switch (type) { - case SCFSNAPTYPE_ALL: - /* Set all area snap size */ - if (statep != NULL) { - ret = snap_driver_size + snap_register_size + - snap_sram_size; - } else { - ret = snap_driver_size; - } - break; - - case SCFSNAPTYPE_DRIVER: - /* Set driver area snap size */ - ret = snap_driver_size; - break; - - case SCFSNAPTYPE_REGISTER: - /* Set register area snap size */ - ret = snap_register_size; - break; - - case SCFSNAPTYPE_SRAM: - /* Set use SRAM area snap size */ - ret = snap_sram_size; - break; - - default: - /* Invalid parameter */ - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "snapsize", 8); - ret = (-1); - break; - } - -/* - * END_get_snapize - */ - END_get_snapize: - - SCFDBGMSG1(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_snapshot() - */ -int -scf_snapshot(intptr_t arg, int mode) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_snapshot() " - int snap_size; - scfsnap_t scfsnap; - scfsnap32_t scfsnap32; - scfsnap_value_t *scfsnap_p = NULL; - int ret = 0; - - SCFDBGMSG(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": start"); - -#ifdef _MULTI_DATAMODEL - switch (ddi_model_convert_from(mode & FMODELS)) { - case DDI_MODEL_ILP32: - if (ddi_copyin((void *)arg, (void *)&scfsnap32, - sizeof (scfsnap32_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EFAULT; - goto END_snapshot; - } - scfsnap.type = scfsnap32.type; - scfsnap.info = scfsnap32.info; - break; - - case DDI_MODEL_NONE: - if (ddi_copyin((void *)arg, (void *)&scfsnap, - sizeof (scfsnap_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EFAULT; - goto END_snapshot; - } - break; - } -#else /* ! _MULTI_DATAMODEL */ - if (ddi_copyin((void *)arg, (void *)&scfsnap, - sizeof (scfsnap_t), mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "dbg_snap", 8); - ret = EFAULT; - goto END_snapshot; - } -#endif /* _MULTI_DATAMODEL */ - - if (mutex_tryenter(&scf_comtbl.all_mutex) != 0) { - - snap_size = scf_get_snapize(scfsnap.type, scfsnap.info); - - if (snap_size == (-1)) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - mutex_exit(&scf_comtbl.all_mutex); - ret = EINVAL; - goto END_snapshot; - } - - if (snap_size != 0) { - scfsnap_p = kmem_zalloc((size_t)snap_size, KM_SLEEP); - - ret = scf_get_snap(scfsnap.type, scfsnap.info, - scfsnap_p, snap_size); - } else { - ret = ENODATA; - } - - mutex_exit(&scf_comtbl.all_mutex); - } else { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, "dbg_snap", 8); - ret = EBUSY; - } - - if (ret == 0) { - -#ifdef _MULTI_DATAMODEL - switch (ddi_model_convert_from(mode & FMODELS)) { - case DDI_MODEL_ILP32: - if (ddi_copyout((void *)scfsnap_p, - (void *)(uintptr_t)scfsnap32.ss_entries, - (size_t)snap_size, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EFAULT; - } - - break; - - case DDI_MODEL_NONE: - if (ddi_copyout((void *)scfsnap_p, - (void *)scfsnap.ss_entries, - (size_t)snap_size, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EFAULT; - } - break; - } - -#else /* ! _MULTI_DATAMODEL */ - if (ddi_copyout((void *)scfsnap_p, (void *)scfsnap.ss_entries, - (size_t)snap_size, mode) != 0) { - SC_DBG_DRV_TRACE(TC_IOCTL|TC_ERR, __LINE__, - "dbg_snap", 8); - ret = EFAULT; - } -#endif /* _MULTI_DATAMODEL */ - } - -/* - * END_snapshot - */ - END_snapshot: - - if (scfsnap_p) { - kmem_free((void *)scfsnap_p, - (size_t)snap_size); - } - - SCFDBGMSG1(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_get_snap() - */ -int -scf_get_snap(int type, int info, scfsnap_value_t *snap_top_p, int snap_size) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_get_snap() " - scf_state_t *statep; - scfsnap_value_t *snap_p; - int wk_size; - int wk_nextoff; - int exec_model; - uint8_t *wk_in_p; - uint8_t *wk_out_p; - scf_dscp_main_t *mainp; - scf_regs_t *wk_regs_p; - scf_regs_c_t *wk_regs_c_p; - int ii; - - int ret = 0; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": start type = %d", type); - -#ifdef _MULTI_DATAMODEL - exec_model = SCF_DRIVER_64BIT; -#else /* ! _MULTI_DATAMODEL */ - exec_model = SCF_DRIVER_32BIT; -#endif /* _MULTI_DATAMODEL */ - - if ((scf_get_snapize(type, info) > snap_size) || (snap_size <= 0)) { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "snapshot", 8); - ret = EINVAL; - goto END_get_snap; - } - - if (info == SCFSNAPINFO_AUTO) { - statep = scf_comtbl.scf_exec_p; - if (statep == NULL) { - statep = scf_comtbl.scf_path_p; - } - } else if (info < scf_comtbl.path_num) { - statep = scf_comtbl.iomp_scf[info]; - } else { - SC_DBG_DRV_TRACE(TC_ERR, __LINE__, "snapshot", 8); - ret = EINVAL; - goto END_get_snap; - } - - snap_p = snap_top_p; - wk_nextoff = 0; - if ((type == SCFSNAPTYPE_ALL) || (type == SCFSNAPTYPE_DRIVER)) { - /* Set driver vl area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_SCF_DRIVER_VL); - wk_size = sizeof (SCF_DRIVER_VERSION); - if (wk_size > DRV_ID_SIZE) { - wk_size = DRV_ID_SIZE; - } - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)SCF_DRIVER_VERSION, - (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - - /* Set driver timer area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_SCF_TIMER_TBL); - wk_size = sizeof (scf_timer); - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)scf_timer, (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - - /* Set driver common area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_SCF_COMTBL); - wk_size = sizeof (scf_comtbl); - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)&scf_comtbl, (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - - if (statep != NULL) { - /* Set device area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_SCF_STATE); - wk_size = sizeof (scf_state_t); - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)statep, (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - } - - /* Set driver DSCP common area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_SCF_DSCP_COMTBL); - wk_size = sizeof (scf_dscp_comtbl_t); - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)&scf_dscp_comtbl, (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - - /* Set driver DSCP TxDSC area */ - if (scf_dscp_comtbl.tx_dscp != NULL) { - strcpy((char *)&snap_p->ss_name[0], - SNAP_SCF_DSCP_TXDSC); - wk_size = scf_dscp_comtbl.tx_dscsize; - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)scf_dscp_comtbl.tx_dscp, - (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - } - - /* Set driver DSCP RxDSC area */ - if (scf_dscp_comtbl.rx_dscp != NULL) { - strcpy((char *)&snap_p->ss_name[0], - SNAP_SCF_DSCP_RXDSC); - wk_size = scf_dscp_comtbl.rx_dscsize; - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)scf_dscp_comtbl.rx_dscp, - (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - } - - /* Set driver DSCP Tx SRAM area */ - if (scf_dscp_comtbl.tx_sramp != NULL) { - strcpy((char *)&snap_p->ss_name[0], - SNAP_SCF_DSCP_TXSRAM); - wk_size = scf_dscp_comtbl.tx_sramsize; - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)scf_dscp_comtbl.tx_sramp, - (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - } - - for (ii = 0; ii < MBIF_MAX; ii++) { - mainp = &scf_dscp_comtbl.scf_dscp_main[ii]; - /* Set driver DSCP Event data area */ - if (mainp->ev_quep != NULL) { - strcpy((char *)&snap_p->ss_name[0], - SNAP_SCF_DSCP_EVENT); - wk_size = mainp->ev_quesize; - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)mainp->ev_quep, - (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + - wk_nextoff); - } - /* Set driver DSCP Recv data area */ - if (mainp->rd_datap != NULL) { - strcpy((char *)&snap_p->ss_name[0], - SNAP_SCF_DSCP_RDATA); - wk_size = mainp->rd_datasize; - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - bcopy((void *)mainp->rd_datap, - (void *)(snap_p + 1), wk_size); - snap_p = (void *)((caddr_t)snap_top_p + - wk_nextoff); - } - } - } - - if ((type == SCFSNAPTYPE_ALL) || (type == SCFSNAPTYPE_REGISTER)) { - if (statep != NULL) { - /* Set register area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_REGISTER); - wk_size = sizeof (scf_regs_t) + sizeof (scf_regs_c_t); - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - - wk_regs_p = (scf_regs_t *)(snap_p + 1); - wk_regs_p->COMMAND = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->COMMAND); - wk_regs_p->STATUS = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->STATUS); - wk_regs_p->VERSION = SCF_DDI_GET8(statep, - statep->scf_regs_handle, - &statep->scf_regs->VERSION); - wk_regs_p->TDATA0 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->TDATA0); - wk_regs_p->TDATA1 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->TDATA1); - wk_regs_p->TDATA2 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->TDATA2); - wk_regs_p->TDATA3 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->TDATA3); - wk_regs_p->RDATA0 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->RDATA0); - wk_regs_p->RDATA1 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->RDATA1); - wk_regs_p->RDATA2 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->RDATA2); - wk_regs_p->RDATA3 = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->RDATA3); - wk_regs_p->COMMAND_ExR = SCF_DDI_GET8(statep, - statep->scf_regs_handle, - &statep->scf_regs->COMMAND_ExR); - wk_regs_p->ACR = SCF_DDI_GET8(statep, - statep->scf_regs_handle, - &statep->scf_regs->ACR); - wk_regs_p->ATR = SCF_DDI_GET8(statep, - statep->scf_regs_handle, - &statep->scf_regs->ATR); - wk_regs_p->STATUS_ExR = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->STATUS_ExR); - wk_regs_p->DCR = SCF_DDI_GET8(statep, - statep->scf_regs_handle, - &statep->scf_regs->DCR); - wk_regs_p->DSR = SCF_DDI_GET8(statep, - statep->scf_regs_handle, - &statep->scf_regs->DSR); - wk_regs_p->TxDCR_C_FLAG = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->TxDCR_C_FLAG); - wk_regs_p->TxDCR_OFFSET = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->TxDCR_OFFSET); - wk_regs_p->TxDCR_LENGTH = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->TxDCR_LENGTH); - wk_regs_p->TxDSR_C_FLAG = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->TxDSR_C_FLAG); - wk_regs_p->TxDSR_OFFSET = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->TxDSR_OFFSET); - wk_regs_p->RxDCR_C_FLAG = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->RxDCR_C_FLAG); - wk_regs_p->RxDCR_OFFSET = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->RxDCR_OFFSET); - wk_regs_p->RxDCR_LENGTH = SCF_DDI_GET32(statep, - statep->scf_regs_handle, - &statep->scf_regs->RxDCR_LENGTH); - wk_regs_p->RxDSR_C_FLAG = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->RxDSR_C_FLAG); - wk_regs_p->RxDSR_OFFSET = SCF_DDI_GET16(statep, - statep->scf_regs_handle, - &statep->scf_regs->RxDSR_OFFSET); - - wk_regs_c_p = (scf_regs_c_t *)(wk_regs_p + 1); - wk_regs_c_p->CONTROL = SCF_DDI_GET16(statep, - statep->scf_regs_c_handle, - &statep->scf_regs_c->CONTROL); - wk_regs_c_p->INT_ST = SCF_DDI_GET16(statep, - statep->scf_regs_c_handle, - &statep->scf_regs_c->INT_ST); - - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - } else { - if (type == SCFSNAPTYPE_REGISTER) { - ret = ENODATA; - } - } - } - - - if ((type == SCFSNAPTYPE_ALL) || (type == SCFSNAPTYPE_SRAM)) { - if (statep != NULL) { - /* Set use SRAM area */ - strcpy((char *)&snap_p->ss_name[0], SNAP_SRAM); - wk_size = sizeof (scf_dscp_sram_t) + - sizeof (scf_sys_sram_t) + - statep->scf_reg_drvtrc_len; - wk_nextoff += (sizeof (scfsnap_value_t) + - ((wk_size + SCF_S_CNT_15) & - SCF_LENGTH_16BYTE_CNV)); - snap_p->ss_flag = exec_model; - snap_p->ss_size = wk_size; - snap_p->ss_nextoff = wk_nextoff; - - wk_in_p = (uint8_t *)&statep->scf_dscp_sram->DATA[0]; - wk_out_p = (uint8_t *)(snap_p + 1); - for (ii = 0; ii < sizeof (scf_dscp_sram_t); - ii++, wk_in_p++, wk_out_p++) { - *wk_out_p = SCF_DDI_GET8(statep, - statep->scf_dscp_sram_handle, wk_in_p); - } - - wk_in_p = (uint8_t *)&statep->scf_sys_sram->DATA[0]; - for (ii = 0; ii < sizeof (scf_sys_sram_t); - ii++, wk_in_p++, wk_out_p++) { - *wk_out_p = SCF_DDI_GET8(statep, - statep->scf_sys_sram_handle, wk_in_p); - } - - wk_in_p = (uint8_t *)statep->scf_reg_drvtrc; - for (ii = 0; ii < statep->scf_reg_drvtrc_len; - ii++, wk_in_p++, wk_out_p++) { - *wk_out_p = SCF_DDI_GET8(statep, - statep->scf_reg_drvtrc_handle, wk_in_p); - } - snap_p = (void *)((caddr_t)snap_top_p + wk_nextoff); - } else { - if (type == SCFSNAPTYPE_SRAM) { - ret = ENODATA; - } - } - } - -/* - * END_get_snap - */ - END_get_snap: - - SCFDBGMSG1(SCF_DBGFLAG_SNAP, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} -#endif /* DEBUG */
--- a/usr/src/uts/sun4u/opl/io/scfd/scftimer.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,625 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/ksynch.h> -#include <sys/types.h> -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> -#include <sys/scfd/scfdscp.h> - -/* - * Timer control table and control flag - */ -static int scf_timer_stop_flag = FLAG_OFF; /* Timer stop flag */ -scf_timer_t scf_timer[SCF_TIMERCD_MAX]; /* Timer contorol table */ - -/* - * Timer value - */ - /* SCF command busy watch timer */ -int scf_devbusy_wait_time = SCF_TIMER_VALUE_DEVBUSY; - /* SCF command completion watch timer */ -int scf_cmdend_wait_time = SCF_TIMER_VALUE_CMDEND; - /* SCF online watch timer */ -int scf_online_wait_time = SCF_TIMER_VALUE_ONLINE; - /* Next receive wait timer */ -int scf_rxbuff_wait_time = SCF_TIMER_VALUE_NEXTRCV; - /* DSCP interface TxACK watch timer */ -int scf_dscp_ack_wait_time = SCF_TIMER_VALUE_DSCP_ACK; - /* DSCP interface TxEND watch timer */ -int scf_dscp_end_wait_time = SCF_TIMER_VALUE_DSCP_END; - /* DSCP interface busy watch timer */ -int scf_dscp_txbusy_time = SCF_TIMER_VALUE_DSCP_BUSY; - /* DSCP interface callback timer */ -int scf_dscp_callback_time = SCF_TIMER_VALUE_DSCP_CALLBACK; - /* DSCP INIT_REQ retry timer */ -int scf_dscp_init_time = SCF_TIMER_VALUE_DSCP_INIT; - -/* - * Function list - */ -void scf_timer_init(void); -void scf_timer_start(int tmcd); -void scf_timer_stop(int tmcd); -void scf_timer_all_stop(void); -int scf_timer_check(int tmcd); -uint32_t scf_timer_value_get(int tmcd); -void scf_tout(void *arg); -int scf_timer_stop_collect(timeout_id_t *tmids, int size); -void scf_timer_untimeout(timeout_id_t *tmids, int size); - -/* - * External function - */ -extern void scf_cmdbusy_tout(void); -extern void scf_cmdend_tout(void); -extern void scf_online_wait_tout(void); -extern void scf_next_rxdata_get(void); -extern void scf_dscp_ack_tout(void); -extern void scf_dscp_end_tout(void); -extern void scf_dscp_busy_tout(void); -extern void scf_dscp_callback_tout(void); -extern void scf_report_send_wait_tout(void); -extern void scf_dscp_init_tout(uint8_t id); - -/* - * scf_timer_init() - * - * Description: Timer initialization processing. - * - */ -void -scf_timer_init(void) -{ -#define SCF_FUNC_NAME "scf_timer_init() " - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start"); - - /* Set timer code and timer value */ - scf_timer[SCF_TIMERCD_CMDBUSY].value = scf_devbusy_wait_time; - scf_timer[SCF_TIMERCD_CMDBUSY].tbl[0].code = SCF_TIMERCD_CMDBUSY; - scf_timer[SCF_TIMERCD_CMDBUSY].tbl[1].code = SCF_TIMERCD_CMDBUSY; - - scf_timer[SCF_TIMERCD_CMDEND].value = scf_cmdend_wait_time; - scf_timer[SCF_TIMERCD_CMDEND].tbl[0].code = SCF_TIMERCD_CMDEND; - scf_timer[SCF_TIMERCD_CMDEND].tbl[1].code = SCF_TIMERCD_CMDEND; - - scf_timer[SCF_TIMERCD_ONLINE].value = scf_online_wait_time; - scf_timer[SCF_TIMERCD_ONLINE].tbl[0].code = SCF_TIMERCD_ONLINE; - scf_timer[SCF_TIMERCD_ONLINE].tbl[1].code = SCF_TIMERCD_ONLINE; - - scf_timer[SCF_TIMERCD_NEXTRECV].value = scf_rxbuff_wait_time; - scf_timer[SCF_TIMERCD_NEXTRECV].tbl[0].code = SCF_TIMERCD_NEXTRECV; - scf_timer[SCF_TIMERCD_NEXTRECV].tbl[1].code = SCF_TIMERCD_NEXTRECV; - - scf_timer[SCF_TIMERCD_DSCP_ACK].value = scf_dscp_ack_wait_time; - scf_timer[SCF_TIMERCD_DSCP_ACK].tbl[0].code = SCF_TIMERCD_DSCP_ACK; - scf_timer[SCF_TIMERCD_DSCP_ACK].tbl[1].code = SCF_TIMERCD_DSCP_ACK; - - scf_timer[SCF_TIMERCD_DSCP_END].value = scf_dscp_end_wait_time; - scf_timer[SCF_TIMERCD_DSCP_END].tbl[0].code = SCF_TIMERCD_DSCP_END; - scf_timer[SCF_TIMERCD_DSCP_END].tbl[1].code = SCF_TIMERCD_DSCP_END; - - scf_timer[SCF_TIMERCD_DSCP_BUSY].value = scf_dscp_txbusy_time; - scf_timer[SCF_TIMERCD_DSCP_BUSY].tbl[0].code = SCF_TIMERCD_DSCP_BUSY; - scf_timer[SCF_TIMERCD_DSCP_BUSY].tbl[1].code = SCF_TIMERCD_DSCP_BUSY; - - scf_timer[SCF_TIMERCD_DSCP_CALLBACK].value = scf_dscp_callback_time; - scf_timer[SCF_TIMERCD_DSCP_CALLBACK].tbl[0].code = - SCF_TIMERCD_DSCP_CALLBACK; - scf_timer[SCF_TIMERCD_DSCP_CALLBACK].tbl[1].code = - SCF_TIMERCD_DSCP_CALLBACK; - - scf_timer[SCF_TIMERCD_BUF_FUL].value = scf_buf_ful_rtime; - scf_timer[SCF_TIMERCD_BUF_FUL].tbl[0].code = SCF_TIMERCD_BUF_FUL; - scf_timer[SCF_TIMERCD_BUF_FUL].tbl[1].code = SCF_TIMERCD_BUF_FUL; - - scf_timer[SCF_TIMERCD_RCI_BUSY].value = scf_rci_busy_rtime; - scf_timer[SCF_TIMERCD_RCI_BUSY].tbl[0].code = SCF_TIMERCD_RCI_BUSY; - scf_timer[SCF_TIMERCD_RCI_BUSY].tbl[1].code = SCF_TIMERCD_RCI_BUSY; - - scf_timer[SCF_TIMERCD_DSCP_INIT].value = scf_dscp_init_time; - scf_timer[SCF_TIMERCD_DSCP_INIT].tbl[0].code = SCF_TIMERCD_DSCP_INIT; - scf_timer[SCF_TIMERCD_DSCP_INIT].tbl[1].code = SCF_TIMERCD_DSCP_INIT; - - scf_timer[SCF_TIMERCD_DKMD_INIT].value = scf_dscp_init_time; - scf_timer[SCF_TIMERCD_DKMD_INIT].tbl[0].code = SCF_TIMERCD_DKMD_INIT; - scf_timer[SCF_TIMERCD_DKMD_INIT].tbl[1].code = SCF_TIMERCD_DKMD_INIT; - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_timer_start() - * - * Description: Timer start subroutine. - * - */ -void -scf_timer_start(int tmcd) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_start() " - scf_timer_t *tm_p; /* Timer table address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start tmcd = %d", tmcd); - - /* Check timer code */ - if (tmcd >= SCF_TIMERCD_MAX) { - goto END_timer_start; - } - - /* Get timer table address */ - tm_p = &scf_timer[tmcd]; - - /* Check timer value and timer start flag */ - if ((tm_p->value == 0) || (tm_p->start == FLAG_ON)) { - goto END_timer_start; - } - - /* Check timer stop flag */ - if (tm_p->stop == FLAG_OFF) { - /* - * Timer start and judgment - */ - /* Change timer table side */ - tm_p->side = (tm_p->side == 0) ? 1 : 0; - - /* timer start */ - tm_p->tbl[tm_p->side].id = timeout(scf_tout, - &tm_p->tbl[tm_p->side], - drv_usectohz(SCF_MIL2MICRO(tm_p->value))); - - /* Timer start flag ON */ - tm_p->start = FLAG_ON; - - SC_DBG_DRV_TRACE(TC_T_START, __LINE__, &tmcd, sizeof (tmcd)); - SCFDBGMSG(SCF_DBGFLAG_TIMER, "timeout() call"); - } else { - /* - * Timer restart and judgment - */ - SCFDBGMSG(SCF_DBGFLAG_TIMER, "timer restart"); - - /* Check current table timer use */ - if (tm_p->tbl[tm_p->side].id != 0) { - /* Change timer table side */ - tm_p->side = (tm_p->side == 0) ? 1 : 0; - } - - /* Timer start and restart flag ON */ - tm_p->start = FLAG_ON; - tm_p->restart = FLAG_ON; - } - -/* - * END_timer_start - */ - END_timer_start: - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_timer_stop() - * - * Description: Timer stop subroutine. - * - */ -void -scf_timer_stop(int tmcd) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_stop() " - scf_timer_t *tm_p; /* Timer table address */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start tmcd = %d", tmcd); - - /* Check timer code */ - if (tmcd < SCF_TIMERCD_MAX) { - /* Get timer table address */ - tm_p = &scf_timer[tmcd]; - - /* Check timer start flag */ - if (tm_p->start == FLAG_ON) { - /* - * Timer start and judgment - */ - - /* Timer start and restart flag OFF */ - tm_p->start = FLAG_OFF; - tm_p->restart = FLAG_OFF; - - /* Timer stop flag ON */ - tm_p->stop = FLAG_ON; - scf_timer_stop_flag = FLAG_ON; - } - } - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_timer_all_stop() - * - * Description: Timer all stop subroutine. - * - */ -void -scf_timer_all_stop(void) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_all_stop() " - int tm_cd; - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start"); - - for (tm_cd = 0; tm_cd < SCF_TIMERCD_MAX; tm_cd++) { - scf_timer_stop(tm_cd); - } - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_timer_check() - * - * Description: Timer status check subroutine. - * - */ -int -scf_timer_check(int tmcd) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_check() " - scf_timer_t *tm_p; /* Timer table address */ - int ret = SCF_TIMER_NOT_EXEC; /* Return value */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start tmcd = %d", tmcd); - - /* Check timer code */ - if (tmcd < SCF_TIMERCD_MAX) { - /* Get timer table address */ - tm_p = &scf_timer[tmcd]; - - /* Check timer start flag */ - if (tm_p->start == FLAG_ON) { - /* Timer exec state */ - ret = SCF_TIMER_EXEC; - } - } - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_timer_value_get() - * - * Description: Timer value get subroutine. - * - */ -uint32_t -scf_timer_value_get(int tmcd) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_value_get() " - uint32_t ret = 0; /* Return value */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start tmcd = %d", tmcd); - - /* Check timer code */ - if (tmcd < SCF_TIMERCD_MAX) { - /* Set timer value */ - ret = scf_timer[tmcd].value; - } - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end return = %d", ret); - return (ret); -} - - -/* - * scf_tout() - * - * Description: Timeout main processing. - * - */ -void -scf_tout(void *arg) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_tout() " - scf_timer_tbl_t *tm_tblp = (scf_timer_tbl_t *)arg; - scf_timer_t *tm_p; /* Timer table address */ - timeout_id_t save_tmids[SCF_TIMERCD_MAX]; - int tm_stop_cnt; - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start tmcd = %d", - tm_tblp->code); - - SC_DBG_DRV_TRACE(TC_T_TOUT | TC_IN, __LINE__, &tm_tblp->code, - sizeof (tm_tblp->code)); - - /* Lock driver mutex */ - mutex_enter(&scf_comtbl.all_mutex); - - /* Get timer table address */ - tm_p = &scf_timer[tm_tblp->code]; - - /* Check timer exec state */ - if ((tm_p->start == FLAG_ON) && (tm_tblp->id != 0) && - (tm_p->stop == FLAG_OFF)) { - /* Timer flag OFF and timer id clear */ - tm_p->start = FLAG_OFF; - tm_tblp->id = 0; - - /* Check timer code */ - switch (tm_tblp->code) { - case SCF_TIMERCD_CMDBUSY: - /* SCF command busy watch timeout */ - scf_cmdbusy_tout(); - break; - - case SCF_TIMERCD_CMDEND: - /* SCF command completion watch timeout */ - scf_cmdend_tout(); - break; - - case SCF_TIMERCD_ONLINE: - /* SCF online watch timeout */ - scf_online_wait_tout(); - break; - - case SCF_TIMERCD_NEXTRECV: - /* Next receive wait timeout */ - scf_next_rxdata_get(); - break; - - case SCF_TIMERCD_DSCP_ACK: - /* DSCP interface TxACK watch timeout */ - scf_dscp_ack_tout(); - break; - - case SCF_TIMERCD_DSCP_END: - /* DSCP interface TxEND watch timeout */ - scf_dscp_end_tout(); - break; - - case SCF_TIMERCD_DSCP_BUSY: - /* DSCP interface busy watch timeout */ - scf_dscp_busy_tout(); - break; - - case SCF_TIMERCD_DSCP_CALLBACK: - /* DSCP interface callback timeout */ - scf_dscp_callback_tout(); - break; - - case SCF_TIMERCD_BUF_FUL: - /* SCF command BUF_FUL timeout */ - case SCF_TIMERCD_RCI_BUSY: - /* SCF command RCI_BUSY timeout */ - scf_report_send_wait_tout(); - break; - - case SCF_TIMERCD_DSCP_INIT: - /* DSCP INIT_REQ retry timeout */ - scf_dscp_init_tout(MBIF_DSCP); - break; - - case SCF_TIMERCD_DKMD_INIT: - /* DKMD INIT_REQ retry timeout */ - scf_dscp_init_tout(MBIF_DKMD); - break; - - default: - /* NOP */ - break; - } - } else { - /* Timer flag OFF and timer id clear */ - tm_p->stop = FLAG_OFF; - tm_tblp->id = 0; - - /* Check timer restart flag */ - if (tm_p->restart == FLAG_ON) { - /* - * Timer start and judgment - */ - /* timer start */ - tm_p->tbl[tm_p->side].id = timeout(scf_tout, - &tm_p->tbl[tm_p->side], - drv_usectohz(SCF_MIL2MICRO(tm_p->value))); - - /* Timer start flag is already ON */ - - /* Timer restart flag OFF */ - tm_p->restart = FLAG_OFF; - - SC_DBG_DRV_TRACE(TC_T_START, __LINE__, &tm_tblp->code, - sizeof (tm_tblp->code)); - SCFDBGMSG(SCF_DBGFLAG_TIMER, "timeout() call"); - } - } - - /* Collect the timers which need to be stopped */ - tm_stop_cnt = scf_timer_stop_collect(save_tmids, SCF_TIMERCD_MAX); - - /* Unlock driver mutex */ - mutex_exit(&scf_comtbl.all_mutex); - - /* Timer stop */ - if (tm_stop_cnt != 0) { - scf_timer_untimeout(save_tmids, SCF_TIMERCD_MAX); - } - - SC_DBG_DRV_TRACE(TC_T_TOUT | TC_OUT, __LINE__, NULL, 0); - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end"); -} - - -/* - * scf_timer_stop_collect() - * - * Description: Collect the timers which need to be stopped. - * - */ -int -scf_timer_stop_collect(timeout_id_t *tmids, int size) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_stop_collect() " - scf_timer_t *tm_p; /* Timer table address */ - int ii; /* Working value : counter */ - int tm_stop_cnt = 0; /* Timer stop counter */ - - ASSERT(MUTEX_HELD(&scf_comtbl.all_mutex)); - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start"); - - /* Clear save timer table */ - bzero((caddr_t)tmids, (sizeof (timeout_id_t) * size)); - - /* Check timer stop factor */ - if (scf_timer_stop_flag == FLAG_OFF) { - goto END_timer_stop_collect; - } - - /* Timer stop flag OFF */ - scf_timer_stop_flag = FLAG_OFF; - - /* Get timer table address */ - tm_p = &scf_timer[0]; - - /* Check all timer table */ - for (ii = 0; ii < size; ii++, tm_p++) { - /* Check timer stop flag */ - if (tm_p->stop == FLAG_ON) { - /* Timer stop flag OFF */ - tm_p->stop = FLAG_OFF; - - /* Check timer side 0 table timer use */ - if (tm_p->tbl[0].id != 0) { - /* Save stop timer id */ - tmids[tm_stop_cnt++] = tm_p->tbl[0].id; - - /* Timer id clear */ - tm_p->tbl[0].id = 0; - - SC_DBG_DRV_TRACE(TC_T_STOP, __LINE__, &ii, - sizeof (ii)); - } - - /* Check timer side 1 table timer use */ - if (tm_p->tbl[1].id != 0) { - /* Save stop timer id */ - tmids[tm_stop_cnt++] = tm_p->tbl[1].id; - - /* Timer id clear */ - tm_p->tbl[1].id = 0; - - SC_DBG_DRV_TRACE(TC_T_STOP, __LINE__, &ii, - sizeof (ii)); - } - } - /* Check timer restart flag */ - if (tm_p->restart == FLAG_ON) { - /* - * Timer start and judgment - */ - - /* timer start */ - tm_p->tbl[tm_p->side].id = timeout(scf_tout, - &tm_p->tbl[tm_p->side], - drv_usectohz(SCF_MIL2MICRO(tm_p->value))); - - /* Timer start flag ON */ - tm_p->restart = FLAG_OFF; - - SC_DBG_DRV_TRACE(TC_T_START, __LINE__, &ii, - sizeof (ii)); - } - } - -/* - * END_timer_stop_collect - */ - END_timer_stop_collect: - - SCFDBGMSG1(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end tm_stop_cnt = %d", - tm_stop_cnt); - return (tm_stop_cnt); -} - - -/* - * scf_timer_untimeout() - * - * Description: Timer stop subroutine. - * - */ -void -scf_timer_untimeout(timeout_id_t *tmids, int size) -{ -#undef SCF_FUNC_NAME -#define SCF_FUNC_NAME "scf_timer_untimeout() " - int ii; /* Working value : counter */ - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": start"); - - /* Save timer id stop */ - for (ii = 0; ii < size; ii++) { - if (tmids[ii] != 0) { - (void) untimeout(tmids[ii]); - } - } - - SCFDBGMSG(SCF_DBGFLAG_TIMER, SCF_FUNC_NAME ": end"); -}
--- a/usr/src/uts/sun4u/opl/io/scfd/scftrace.c Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/conf.h> -#include <sys/cmn_err.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> - -#include <sys/scfd/scfparam.h> - -#ifdef DEBUG -/* - * SCF driver trace flag - */ -ushort_t scf_trace_exec = 1; /* 1:trace exec, 0:Trace no exec */ - -ushort_t scf_trace_flag = 0xff00; -/* - * xxxx xxxx : scf_trace_flag - * 1 : Error trace exec - * 1 : Busy trace exec - * 1 : Messege trace exec - * 1 : RD register trace exec - * 1 : WR register trace exec - * 1 : Timer trace exec - * 1 : Func out trace exec - * 1 : Func in trace exec - */ - -/* - * SCF driver trace debug flag - */ -uint_t scf_trace_msg_flag = 0x00000000; /* trace massege flag */ - - -/* - * Function list - */ -void scf_trace(ushort_t code, ushort_t line, uchar_t *info, ushort_t size); - - -/* - * scf_trace() - * - * SCF Driver trace get processing. - * - * 0 +--------------+ - * | sorce line | trace get source line - * 2 +--------------+ - * | time | trace get time (100ms) - * 4 +--------------+ - * | triger code | trace triger code - * 6 +--------------+ - * | info size | infomarion size - * 8 +--------------+ - * | | - * A + + - * | | - * C + info + infomarion - * | | - * E + + - * | | - * 10 +--------------+ - * - */ -void -scf_trace(ushort_t code, ushort_t line, uchar_t *info, ushort_t size) -{ - scf_trctbl_t trace_wk; - scf_trctbl_t *trcp; - uchar_t *in_p; - uchar_t *out_p; - clock_t clock_val; - int ii; - int trcflag = 0; - - if ((scf_trace_exec) && - ((code & scf_trace_flag) || (!(code & 0xFF00)))) { - if (scf_comtbl.resource_flag & DID_MUTEX_TRC) { - mutex_enter(&scf_comtbl.trc_mutex); - trcflag = 1; - } - } - - if (!trcflag) { - return; - } - - trcp = (scf_trctbl_t *)&trace_wk.line; - trcp->line = line; - clock_val = ddi_get_lbolt(); - trcp->tmvl = (ushort_t)(drv_hztousec(clock_val) / 100000); - trcp->code = code; - trcp->size = size; - for (ii = 0; ii < sizeof (trace_wk.info); ii++) { - if (ii < size) { - trcp->info[ii] = *(info+ii); - } else { - trcp->info[ii] = 0; - } - } - - if (trcflag) { - in_p = (uchar_t *)trcp; - out_p = (uchar_t *)scf_comtbl.trace_w; - scf_comtbl.trace_w++; - if (scf_comtbl.trace_w == scf_comtbl.trace_l) { - scf_comtbl.trace_w = scf_comtbl.trace_f; - } - for (ii = 0; ii < 16; ii++, in_p++, out_p++) *out_p = *in_p; - if (trcp->code & (TC_ERR | TC_ERRCD)) { - in_p = (uchar_t *)trcp; - out_p = (uchar_t *)scf_comtbl.err_trace_w; - for (ii = 0; ii < 16; ii++, in_p++, out_p++) - *out_p = *in_p; - scf_comtbl.err_trace_w++; - if (scf_comtbl.err_trace_w == scf_comtbl.err_trace_l) { - scf_comtbl.err_trace_w = scf_comtbl.err_trace_f; - } - } - } - - if (trcflag) { - mutex_exit(&scf_comtbl.trc_mutex); - } -} -#endif
--- a/usr/src/uts/sun4u/opl/scfd/Makefile Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -# ident "%Z%%M% %I% %E% SMI" -# -# This makefile drives the production of the scfd driver -# loadable module. -# -# sun4u opl implementation architecture dependent -# -# Path to the base of the uts directory tree (usually /usr/src/uts). -# -# uts/sun4u/opl/scf/Makefile - -UTSBASE = ../../.. - -# -# Define the module and object file sets. -# -MODULE = scfd -OBJECTS = $(SCFD_OBJS:%=$(OBJS_DIR)/%) -LINTS = $(SCFD_OBJS:%.o=$(LINTS_DIR)/%.ln) -ROOTMODULE = $(ROOT_OPL_DRV_DIR)/$(MODULE) -CONF_SRCDIR = $(UTSBASE)/sun4u/opl/io/$(MODULE) - -# -# Include common rules. -# -include $(UTSBASE)/sun4u/opl/Makefile.opl - -# -# Define targets -# -ALL_TARGET = $(BINARY) $(SRC_CONFFILE) -LINT_TARGET = $(MODULE).lint -INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE) - -# -# lint pass one enforcement -# -CFLAGS += $(CCVERBOSE) - -# -# Default build targets. -# -.KEEP_STATE: - -all: $(ALL_DEPS) - -def: $(DEF_DEPS) - -clean: $(CLEAN_DEPS) - -clobber: $(CLOBBER_DEPS) - -lint: $(LINT_DEPS) - -modlintlib: $(MODLINTLIB_DEPS) - -clean.lint: $(CLEAN_LINT_DEPS) - -install: $(INSTALL_DEPS) - -# -# Include common targets. -# -include $(UTSBASE)/sun4u/opl/Makefile.targ
--- a/usr/src/uts/sun4u/opl/sys/Makefile Mon Nov 27 11:21:25 2006 -0800 +++ b/usr/src/uts/sun4u/opl/sys/Makefile Mon Nov 27 11:55:12 2006 -0800 @@ -64,21 +64,9 @@ pcmu_types.h \ pcmu_util.h -SCFDHDRS= iomp_drv.h \ - opcio.h \ - scfdebug.h \ - scfdscp.h \ +SCFDHDRS= opcioif.h \ scfdscpif.h \ - scfio32.h \ - scfkstat.h \ - scfostoescf.h \ - scfparam.h \ - scfreg.h \ - scfsnap.h \ - scfstate.h \ - scfsys.h \ - scftimer.h \ - scftrace.h + scfostoescf.h NGDRHDRS= $(UTSBASE)/sun4u/ngdr/sys/dr.h \ $(UTSBASE)/sun4u/ngdr/sys/dr_util.h
--- a/usr/src/uts/sun4u/opl/sys/scfd/iomp_drv.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _IOMP_DRV_H -#define _IOMP_DRV_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/types.h> -#include <sys/types32.h> -#include <sys/fiomp.h> - -#define SCF_IOMP_NAME "mscf0" -#define SCF_REAL_NAME "/pseudo/scfd@200:mscf0" -#define SCF_LOGCAL_PATH "/dev/FJSVhwr/scfc" -#define SCF_USER_PATH "/dev/FJSVhwr/pwrctl" - -#define SCF_MAX_STR 256 -#define FIOMP_STAT_ONLINE 10 -#define FIOMP_STAT_OFFLINE 11 -#define FIOMP_STAT_UNCONFIGURED 12 - -#define FIOMP_STAT_RECOVER 20 - -#define FIOMP_STAT_BUSY -1 - -struct fiompdev_32 { - int api_level; /* API level = 0 */ - int inst_no; /* instance number */ - minor32_t inst_minor; /* instance management node */ - minor32_t user_minor; /* user access node */ - int num; /* number of devices */ - caddr32_t devs; /* device names */ - int mpmode; /* multi pathing */ - int autopath; /* automatic path change */ - int block; /* able to block physical device */ - int needsync; /* need synchronize path status */ - caddr32_t ext; /* for extension = NULL */ -}; - -struct fiomp_devinfo_32 { - int inst_no; /* instance number */ - char real_name[FIOMP_MAX_STR]; /* instance management node */ - char user_path[FIOMP_MAX_STR]; /* user access path */ - int path_num; /* number of paths */ - int mpmode; /* multi pathing */ - int autopath; /* automatic path change */ - int block; /* able to block physical device */ - int needsync; /* need synchronize path status */ - caddr32_t ext; /* for extension = NULL */ -}; - -struct fiomp_all_devinfo_32 { - int num; /* number of instances */ - caddr32_t devinfo; /* device informations */ -}; - -struct fiompprop_32 { - caddr32_t iomp_name; /* instance name */ - caddr32_t iomp_real_name; - /* instance management node (/devices) */ - caddr32_t iomp_user_path; - /* instance management node (/dev) */ - caddr32_t iomp_status; /* status of the instance */ - int num; /* number of paths */ - caddr32_t iomp_path; /* target device nodes (/devices) */ - caddr32_t iomp_logical_path; /* target device nodes (/dev) */ - caddr32_t iomp_path_status; /* status of target devices */ - caddr32_t iomp_path_block; /* access block */ -}; - -struct fiompstatus_32 { - int pathnum; /* path number */ - int status; /* FIOMP_STAT_xxxx */ - caddr32_t message; /* some messages */ - int block_status; /* access block status */ - caddr32_t ext; /* reservesd (= NULL) */ -}; - -struct fiomppath_32 { - int num; /* number of paths */ - caddr32_t devs; /* device names */ -}; - -struct fiomp_all_stat_32 { - int num; /* number of paths */ - caddr32_t status; /* path status */ -}; - -struct fiompchg_32 { - int num; /* number of all paths */ - caddr32_t set_status; /* setting values */ - caddr32_t pre_status; /* previous values */ - caddr32_t status; /* current values */ -}; - -struct fiompevent_32 { - int event; /* event type = FIOMP_EVT_xx */ - int num; /* instance number(meta management) or */ - /* number of all path(instance management) */ - caddr32_t pre_status; /* previous status */ - caddr32_t status; /* current status */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _IOMP_DRV_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/opcio.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,318 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SYS_OPCIO_H -#define _SYS_OPCIO_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/ioccom.h> - -/* - * ioctl - */ -#define SCFIOC 'p'<<8 - -/* - * ioctl - */ -#define SCFIOCCLEARLCD (SCFIOC|10|0x80040000) -#define SCFIOCWRLCD (SCFIOC|11|0x800c0000) -#define SCFIOCREPORTSTAT (SCFIOC|22|0x80040000) -#define SCFIOCHAC (SCFIOC|28|0x80810000) -#define SCFIOCRDCLIST (SCFIOC|37|0xc00c0000) -#define SCFIOCHSTADRSINFO (SCFIOC|41|0x40040000) -#define SCFIOCAUTOPWRSET (SCFIOC|42|0x80f40000) -#define SCFIOCAUTOPWRGET (SCFIOC|43|0x40f40000) -#define SCFIOCAUTOPWREXSET (SCFIOC|44|0x80100000) -#define SCFIOCAUTOPWREXGET (SCFIOC|45|0x40100000) -#define SCFIOCAUTOPWRFPOFF (SCFIOC|46|0x80f40000) -#define SCFIOCRCIPWR (SCFIOC|48|0xc0080000) -#define SCFIOCGETREPORT (SCFIOC|49|0x40100000) -#define SCFIOCRDCLISTMAX (SCFIOC|50|0x40040000) -#define SCFIOCRDCLISTX (SCFIOC|51|0x800c0000) -#define SCFIOCRDCTRL (SCFIOC|52|0xc0820000) -#define SCFIOCPANICREQ (SCFIOC|53|0x80040000) -#define SCFIOCSYSAUTOPWRGET (SCFIOC|60|0x20000000) -#define SCFIOCOPECALL (SCFIOC|62|0x20000000) -#define SCFIOCSYSAUTOPWRCLR (SCFIOC|66|0x20000000) -#define SCFIOCPANICCHK (SCFIOC|67|0x80040000) -#define SCFIOCDR (SCFIOC|68|0x80040000) -#define SCFIOCEVENTLIST (SCFIOC|70|0x80040000) -#define SCFIOCGETEVENT (SCFIOC|71|0x80040000) -#define SCFIOCOPTIONDISP (SCFIOC|80|0x80040000) -#define SCFIOCPARMSET (SCFIOC|82|0x80040000) -#define SCFIOCPARMGET (SCFIOC|83|0x80040000) - -#define SCFIOCGETDISKLED (SCFIOC|101|0x80040000) -#define SCFIOCSETDISKLED (SCFIOC|102|0x80040000) -#define SCFIOCGETSDOWNREASON (SCFIOC|103|0x80040000) -#define SCFIOCGETPCICONFIG (SCFIOC|104|0x80040000) -#define SCFIOCSETMADMEVENT (SCFIOC|105|0x80040000) -#define SCFIOCREMCSCMD (SCFIOC|106|0x80040000) -#define SCFIOCSPARECMD (SCFIOC|107|0x80040000) -#define SCFIOCREMCSFILE (SCFIOC|108|0x80040000) - -#define SCFIOCSETPHPINFO (SCFIOC|1|0xe0000000) - -/* SCFIOCOPECALL */ -#define SUB_OPECALL_DISP 0x10 /* OP call disp */ -#define SUB_OPECALL_ON_SET 0x20 /* OP call ON set */ -#define SUB_OPECALL_OFF_SET 0x31 /* OP call OFF set */ - -/* SCFIOCCLEARLCD */ -#define SCF_CLRLCD_SEQ 0 - -/* SCFIOCWRLCD */ -typedef struct scfwrlcd { - int lcd_type; - int length; - unsigned char *string; -} scfwrlcd_t; -/* for lcd_type field */ -#define SCF_WRLCD_SEQ 0 - -#define SCF_WRLCD_MAX 32 - -/* SCFIOCREPORTSTAT */ -#define SCF_SHUTDOWN_START 0 -#define SCF_SYSTEM_RUNNING 1 -#define SCF_RE_REPORT 9 - -/* SCFIOCHAC */ -typedef struct scfhac { - unsigned char sbuf[64]; - unsigned char rbuf[64]; - unsigned char sub_command; -} scfhac_t; -/* for sub_command field */ -#define SUB_HOSTADDR_DISP 0x00 /* Host address disp */ -#define SUB_REMOTE_POWCTL_SET 0x11 /* Remote power control set */ -#define SCF_SUB_REMOTE_POWCTL_SET 0x10 -#define SUB_DEVICE_INFO 0x0c /* Device information disp */ - -/* SCFIOCAUTOPWRSET, SCFIOCAUTOPWRGET, SCFIOCAUTOPWRFPOFF */ -typedef struct scfautopwrtime { - int pon_year; /* 1970 - 9999 */ - int pon_month; /* 1 - 12 */ - int pon_date; /* 1 - 31 */ - int pon_hour; /* 0 - 23 */ - int pon_minute; /* 0 - 59 */ - int poff_year; /* 1970 - 9999 */ - int poff_month; /* 1 - 12 */ - int poff_date; /* 1 - 31 */ - int poff_hour; /* 0 - 23 */ - int poff_minute; /* 0 - 59 */ - int flag; - int sarea; -} scfautopwrtime_t; - -typedef struct scfautopwr { - int valid_entries; - struct scfautopwrtime ptime[5]; -} scfautopwr_t; - -/* SCFIOCAUTOPWREXSET, SCFIOCAUTOPWREXGET */ -typedef struct scfautopwrex { - int rpwr_mode; - int rpwr_time; /* minutes */ - int w_time; /* minutes */ - int a_time; /* minutes */ -} scfautopwrex_t; -/* for rpwr_mode field */ -#define AUTOPWREX_RESTORE 0x00 -#define AUTOPWREX_NOPON 0x01 -#define AUTOPWREX_AUTOPON 0x80 - -/* SCFIOCRCIPWR */ -typedef struct scfrcipwr { - int sub_cmd; - unsigned int rci_addr; -} scfrcipwr_t; -/* for sub_cmd field */ -#define RCI_PWR_ON 0x80 -#define RCI_PWR_OFF 0x40 -#define RCI_SYS_RESET 0x20 -#define RCI_PFCTR 0x00 -#define RCI_PWR_NOR_OFF 0x41 - -/* SCFIOCGETREPORT */ -typedef struct scfreport { - int flag; - unsigned int rci_addr; - unsigned char report_sense[4]; - time_t timestamp; -} scfreport_t; -/* for flag field */ -#define GETREPORT_WAIT 1 -#define GETREPORT_NOWAIT 2 -#define GETREPORT_WAIT_AND_RCIDWN 3 - -/* SCFIOCRDCLISTX */ -typedef struct scfrdclistx { - unsigned int rci_addr; - unsigned char status; - unsigned short dev_class; - unsigned char sub_class; -} scfrdclistx_t; - -/* SCFIOCRDCTRL */ -typedef struct scfrdctrl { - unsigned char sub_cmd; - unsigned char scount; - unsigned char sbuf[64]; - unsigned char sense[64]; -} scfrdctrl_t; -/* for sub_cmd field */ -#define SUB_DEVICE_STATUS_RPT 0x14 /* Device status print */ -#define SCF_SUB_DEVICE_STATUS_RPT 0x71 -#define SCF_RCI_PATH_40 0x50 /* RCI device request */ - -/* SCFIOCDR */ -typedef struct scfdr { - unsigned char sbuf[16]; - unsigned char rbuf[16 * 64]; - unsigned char sub_command; -} scfdr_t; -/* for sub_command field */ -#define SUB_SB_CONF_CHG 0x11 /* SB configuration change */ -#define SUB_SB_SENSE 0x00 /* SB status disp */ -#define SUB_SB_SENSE_ALL 0x18 /* SB status all disp */ -#define SUB_SB_BUILD_COMP 0x12 /* SB build completion */ - -/* SCFIOCEVENTLIST */ -#define SCF_EVENTLIST_MAX 128 -typedef struct scfeventlist { - int listcnt; - unsigned char codelist[SCF_EVENTLIST_MAX]; -} scfeventlist_t; - -/* SCFIOCGETEVENT */ -typedef struct scfevent { - int flag; - unsigned int rci_addr; - unsigned char code; - unsigned char size; - unsigned char rsv[2]; - unsigned char event_sense[24]; - time_t timestamp; -} scfevent_t; -/* for flag field */ -#define GETEVENT_WAIT 1 -#define GETEVENT_NOWAIT 2 - -/* SCFIOCOPTIONDISP */ -typedef struct scfoption { - unsigned char rbuf[16]; -} scfoption_t; - -/* SCFIOCPARMSET, SCFIOCPARMGET */ -typedef struct scfparam { - int parm; - int value; -} scfparam_t; -/* for parm field */ -#define SCF_PARM_RDCTRL_TIMER 0x00000001 - -/* SCFIOCGETDISKLED/SCFIOCSETDISKLED */ -#define SCF_DISK_LED_PATH_MAX 512 -typedef struct scfiocgetdiskled { - unsigned char path[SCF_DISK_LED_PATH_MAX]; - unsigned char led; -} scfiocgetdiskled_t; -/* for led field */ -#define SCF_DISK_LED_ON 0x01 -#define SCF_DISK_LED_BLINK 0x02 -#define SCF_DISK_LED_OFF 0x04 - -/* SCFIOCGETSDOWNREASON */ -#define REASON_NOTHING 0x00000000 /* reason nothing */ -#define REASON_SHUTDOWN_FAN 0x00000001 /* Fan unit failure */ -#define REASON_SHUTDOWN_PSU 0x00000002 /* Power unit failure */ -#define REASON_SHUTDOWN_THERMAL 0x00000006 /* Thermal failure */ -#define REASON_SHUTDOWN_UPS 0x00000007 /* UPS failure */ -#define REASON_RCIPOFF 0x00000100 /* RCI POFF */ -#define REASON_XSCFPOFF 0x00000103 /* XSCF POFF */ -#define REASON_SHUTDOWN_HALT 0xffffffff /* SCF HALT */ - -/* SCFIOCGETPCICONFIG */ -typedef struct scfiocgetpciconfig { - unsigned char sbuf[16]; - unsigned char rbuf[65536]; -} scfiocgetpciconfig_t; - -/* SCFIOCSETMADMEVENT */ -typedef struct scfiocsetmadmevent { - unsigned char buf[65536]; - unsigned int size; -} scfiocsetmadmevent_t; - -/* SCFIOCREMCSCMD */ -typedef struct scfiocremcscmd { - unsigned char buf[16]; - unsigned int size; - unsigned char sub_command; -} scfiocremcscmd_t; -/* for sub_command field */ -#define SUB_CMD_EX_REMCS 0x01 - -/* SCFIOCREMCSFILE */ -typedef struct scfiocremcsfile { - unsigned char buf[65536]; - unsigned int size; - unsigned char sub_command; -} scfiocremcsfile_t; -/* for sub_command field */ -#define SUB_FILEUP_READY 0x10 -#define SUB_FILEUP_SET 0x20 -#define SUB_TRANSFER_STOP 0x40 - -/* SCFIOCSPARECMD */ -typedef struct scfiocsparecmd { - unsigned char buf[65536]; - unsigned int size; - unsigned char command; - unsigned char sub_command; - unsigned char spare_sub_command; -} scfiocsparecmd_t; -/* for sub_command field */ -#define SUB_SPARE_SS 0x00 /* Type SS */ -#define SUB_SPARE_SL 0x11 /* Type SL */ -#define SUB_SPARE_LS 0x12 /* Type LS */ - -/* SCFIOCSETPHPINFO */ -typedef struct scfsetphpinfo { - unsigned char buf[65536]; - unsigned int size; -} scfsetphpinfo_t; - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_OPCIO_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/sun4u/opl/sys/scfd/opcioif.h Mon Nov 27 11:55:12 2006 -0800 @@ -0,0 +1,70 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 + */ + +#ifndef _SYS_OPCIOIF_H +#define _SYS_OPCIOIF_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/ioccom.h> + +/* + * ioctl + * + * Note: The ioctl definitions are split between opcio.h (closed) and + * opcioif.h (open). All definitions required for the exported scfd + * interface should be in opcioif.h (open). + */ +#define SCFIOC 'p'<<8 + +#define SCFIOCGETDISKLED (SCFIOC|101|0x80040000) +#define SCFIOCSETDISKLED (SCFIOC|102|0x80040000) +#define SCFIOCSETPHPINFO (SCFIOC|1|0xe0000000) + +#define SCF_DISK_LED_PATH_MAX 512 + +/* for led field */ +#define SCF_DISK_LED_ON 0x01 +#define SCF_DISK_LED_BLINK 0x02 +#define SCF_DISK_LED_OFF 0x04 + +typedef struct scfiocgetdiskled { + unsigned char path[SCF_DISK_LED_PATH_MAX]; + unsigned char led; +} scfiocgetdiskled_t; + +typedef struct scfsetphpinfo { + unsigned char buf[65536]; + unsigned int size; +} scfsetphpinfo_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_OPCIOIF_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfdebug.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,309 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFDEBUG_H -#define _SCFDEBUG_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/scfd/scfdscp.h> - -/* - * ioctl - */ -#define SCFIOCDEBUG 'd'<<8 - -/* - * ioctl - */ -#define SCFIOCCMDTHROUGH (SCFIOC|1|0xf0000000) -#define SCFIOCTEST (SCFIOCDEBUG|2|0x80040000) - -/* SCFIOCCMDTHROUGH */ -typedef struct scfcmdthrough { - unsigned short mode; - unsigned short cmdtype; - unsigned short code; - unsigned int sbufleng; - unsigned int rbufleng; - unsigned short status; - unsigned char sbuf[65536 + 16]; - unsigned char rbuf[1024 * 512]; -} scfcmdthrough_t; -/* for mode field */ -#define SCF_CMDTHROUGH_START 0 /* command through start */ -#define SCF_CMDTHROUGH_STOP 1 /* command through stop */ -#define SCF_CMDTHROUGH_CMD 2 /* command through */ -/* for cmdtype field */ -#define SCF_CMDTHROUGH_TYPE_NN 0 /* WRITE:Nothing READ:Nothing */ -#define SCF_CMDTHROUGH_TYPE_NS 1 /* WRITE:Nothing READ:Small */ -#define SCF_CMDTHROUGH_TYPE_NL 2 /* WRITE:Nothing READ:Larg */ -#define SCF_CMDTHROUGH_TYPE_SN 3 /* WRITE:Small READ:Nothing */ -#define SCF_CMDTHROUGH_TYPE_SS 4 /* WRITE:Small READ:Small */ -#define SCF_CMDTHROUGH_TYPE_SL 5 /* WRITE:Small READ:Larg */ -#define SCF_CMDTHROUGH_TYPE_LN 6 /* WRITE:Larg READ:Nothing */ -#define SCF_CMDTHROUGH_TYPE_LS 7 /* WRITE:Larg READ:Small */ - -#define TEST_INFO_MAX 32 - -/* SCFIOCTEST */ -typedef struct scf_scfioctest_tbl { - uint_t mode; - uint_t rci_addr; - uint_t data[2]; - uint_t rsv1; - uint_t rsc2; - uint_t scf_debugxscf; - uint_t rtncode; - uint_t info[TEST_INFO_MAX]; - uint8_t rdata[SRAM_MAX_SYSTEM]; -} scf_scfioctest_t; -/* for mode field (Low 2byte) */ -#define TEST_MODE_MASK_HIGHT 0xffff0000 -#define TEST_MODE_MASK_LOW 0x0000ffff -#define TEST_NONE 0x00000000 - -/* Config mode : for mode field (Low 2byte) */ -#define TEST_CONF 0x00000100 -#define TEST_CONF_RESET 0x00000100 -#define TEST_CONF_DEBUG_MSG 0x00000101 -#define TEST_CONF_CMD_BUSY 0x00000181 -#define TEST_CONF_DSCP_LOOPBACK 0x00000182 -#define TEST_CONF_SCF_PATH 0x00000183 - -/* Interrupt mode : for mode field (Low 2byte) */ -#define TEST_INT 0x00000200 -#define TEST_INT_RESET 0x00000200 -#define TEST_INT_SYS 0x00000201 -#define TEST_INT_SYS_POFF 0x00000202 -#define TEST_INT_SYS_EVENT 0x00000203 -#define TEST_INT_DSCP 0x00000204 - -/* SYS func call mode : for mode field (Low 2byte) */ -#define TEST_SYS_CALL 0x00001000 -#define TEST_SYS_CALL_RESET 0x00001000 -#define TEST_SYS_CALL_INT 0x00001001 - -/* DSCP func call mode : for mode field (Low 2byte) */ -#define TEST_DSCP_CALL 0x00001100 -#define TEST_DSCP_CALL_RESET 0x00001100 -#define TEST_DSCP_CALL_INIT 0x00001101 -#define TEST_DSCP_CALL_FINI 0x00001102 -#define TEST_DSCP_CALL_PUTMSG 0x00001103 -#define TEST_DSCP_CALL_CANGET 0x00001104 -#define TEST_DSCP_CALL_GETMSG 0x00001105 -#define TEST_DSCP_CALL_FLUSH 0x00001106 -#define TEST_DSCP_CALL_CTRL 0x00001107 -#define TEST_DSCP_CALL_OTHER 0x00001108 - -/* OSESCF func callmode : for mode field (Low 2byte) */ -#define TEST_OSESCF_CALL 0x00001200 -#define TEST_OSESCF_CALL_RESET 0x00001200 -#define TEST_OSESCF_CALL_PUTINFO 0x00001201 -#define TEST_OSESCF_CALL_GETINFO 0x00001202 - -/* FMEM OSESCF func callmode : for mode field (Low 2byte) */ -#define TEST_FMEM_START 0x00001211 -#define TEST_FMEM_END 0x00001212 -#define TEST_FMEM_CANCEL 0x00001213 -#define TEST_GET_DIMMINFO 0x00001214 - -/* - * External vwlue - */ -extern uint_t scf_debug_test_sys_int_flag; -extern uint_t scf_debug_test_rxbuff_nosum_check_flag; -extern uint_t scf_debug_test_sys_event_flag; -extern uint_t scf_debug_test_sys_poff_flag; -extern uint_t scf_debug_test_dscp_int_flag; -extern uint_t scf_debug_test_cmdr_busy; -extern uint_t scf_debug_test_cmdexr_busy; -extern uint_t scf_debug_test_copyin; -extern uint_t scf_debug_test_copyout; -extern uint_t scf_debug_test_kmem; -extern uint_t scf_debug_test_path_check; -extern uint_t scf_debug_test_path_check_rtn; -extern uint_t scf_debug_test_offline_check; -extern uint_t scf_debug_test_offline_check_rtn; -extern uint_t scf_debug_test_dscp_call_flag; -extern uint_t scf_debug_test_osescf_call_flag; - -extern uint_t scf_no_make_sum_s; -extern uint_t scf_no_make_sum_l; - -extern uint_t scf_debug_nofirm_sys; -extern uint_t scf_debug_scfint_time; -extern uint_t scf_debug_nofirm_dscp; -extern uint_t scf_debug_idbcint_time; -extern uint_t scf_debug_test_dscp_loopback; -extern uint_t scf_debug_nooffline_check; -extern uint_t scf_debug_no_dscp_path; -extern uint_t scf_debug_no_alive; -extern uint_t scf_debug_norxsum_check; -extern uint_t scf_debug_no_int_reason; -extern uint_t scf_debug_no_device; - -/* - * External function - */ -extern int scf_debug_cmdthrough(intptr_t arg, int mode); -extern int scf_debug_test(intptr_t arg, int mode); -extern void scf_debug_test_intr_tout(void *arg); -extern void scf_debug_test_intr(scf_state_t *statep); -extern void scf_debug_test_intr_scfint(scf_state_t *statep); -extern void scf_debug_test_intr_cmdend(scf_state_t *statep); -extern void scf_debug_test_intr_poff(void); -extern void scf_debug_test_dsens(struct scf_cmd *scfcmdp, - scf_int_reason_t *int_rp, int len); -extern void scf_debug_test_intr_dscp_dsr(scf_state_t *statep); -extern void scf_debug_test_intr_dscp_rxtx(scf_state_t *statep, uint8_t dsr); -extern void scf_debug_test_alive_start(scf_state_t *statep); -extern void scf_debug_test_alive_stop(scf_state_t *statep); -extern void scf_debug_test_alive_intr_tout(void *arg); -extern void scf_debug_test_send_cmd(struct scf_state *statep, - struct scf_cmd *scfcmdp); -extern void scf_debug_test_txreq_send(scf_state_t *statep, - scf_dscp_dsc_t *dsc_p); -extern void scf_debug_test_event_handler(scf_event_t mevent, void *arg); -extern void scf_debug_test_timer_stop(void); -extern void scf_debug_test_map_regs(scf_state_t *statep); -extern void scf_debug_test_unmap_regs(scf_state_t *statep); - -/* - * Debug flag and value define - */ -/* scf_debug_test_sys_int_flag */ -#define SCF_DBF_SYS_INTR_OFF 0 -#define SCF_DBF_SYS_INTR_ON 1 - -/* scf_debug_test_rxbuff_nosum_check_flag */ -#define SCF_DBF_RXBUFF_NOSUM_CHECK_OFF 0 -#define SCF_DBF_RXBUFF_NOSUM_CHECK_ON 1 - -/* scf_debug_test_sys_event_flag */ -#define SCF_DBF_SYS_EVENT_OFF 0 -#define SCF_DBF_SYS_EVENT_ON 1 - -/* scf_debug_test_sys_poff_flag */ -#define SCF_DBF_SYS_POFF_OFF 0 -#define SCF_DBF_SYS_POFF_ON 1 - -/* scf_debug_test_dscp_int_flag */ -#define SCF_DBF_DSCP_INT_OFF 0 -#define SCF_DBF_DSCP_INT_ON 1 - -/* scf_debug_test_cmdr_busy */ -#define SCF_DBC_CMDR_BUSY_CLEAR 0x00000000 - -/* scf_debug_test_cmdexr_busy */ -#define SCF_DBC_CMDEXR_BUSY_CLEAR 0x00000000 - -/* scf_debug_test_copyin */ -#define SCF_DBC_COPYIN_CLEAR 0x00000000 - -/* scf_debug_test_copyout */ -#define SCF_DBC_COPYOUT_CLEAR 0x00000000 - -/* scf_debug_test_kmem */ -#define SCF_DBC_KMEM_CLEAR 0x00000000 - -/* scf_debug_test_path_check */ -#define SCF_DBC_PATH_CHECK_CLEAR 0x00000000 - -/* scf_debug_test_path_check_rtn */ -#define SCF_DBC_PATH_CHECK_RTN_CLEAR 0x00000000 - -/* scf_debug_test_offline_check */ -#define SCF_DBC_OFFLINE_CHECK_CLEAR 0x00000000 - -/* scf_debug_test_offline_check_rtn */ -#define SCF_DBC_OFFLINE_CHECK_RTN_CLEAR 0x00000000 - -/* scf_debug_test_dscp_call_flag */ -#define SCF_DBF_DSCP_CALL_OFF 0 -#define SCF_DBF_DSCP_CALL_ON 1 - -/* scf_debug_test_osescf_call_flag */ -#define SCF_DBF_OSESCF_CALL_OFF 0 -#define SCF_DBF_OSESCF_CALL_ON 1 - -/* scf_no_make_sum_s */ -#define SCF_DBF_NO_MAKE_SUM_S_OFF 0 -#define SCF_DBF_NO_MAKE_SUM_S_ON 1 - -/* scf_no_make_sum_l */ -#define SCF_DBF_NO_MAKE_SUM_L_OFF 0 -#define SCF_DBF_NO_MAKE_SUM_L_ON 1 - -/* scf_debug_nofirm_sys */ -#define SCF_DBF_NOFIRM_SYS_OFF 0 -#define SCF_DBF_NOFIRM_SYS_ON 1 - -/* scf_debug_scfint_time */ -#define SCF_DBT_SCFINT_TIME_100MS 100 - -/* scf_debug_nofirm_dscp */ -#define SCF_DBF_NOFIRM_DSCP_OFF 0 -#define SCF_DBF_NOFIRM_DSCP_ON 1 - -/* scf_debug_idbcint_time */ -#define SCF_DBT_IDBCINT_TIME_100MS 100 - -/* scf_debug_test_dscp_loopback */ -#define SCF_DBF_DSCP_LOOPBACK_OFF 0 -#define SCF_DBF_DSCP_LOOPBACK_ON 1 - -/* scf_debug_nooffline_check */ -#define SCF_DBF_NOOFFLINE_CHECK_OFF 0 -#define SCF_DBF_NOOFFLINE_CHECK_ON 1 - -/* scf_debug_no_dscp_path */ -#define SCF_DBF_NO_DSCP_PATH_OFF 0 -#define SCF_DBF_NO_DSCP_PATH_ON 1 - -/* scf_debug_no_alive */ -#define SCF_DBF_NO_ALIVE_OFF 0 -#define SCF_DBF_NO_ALIVE_ON 1 - -/* scf_debug_norxsum_check */ -#define SCF_DBF_NORXSUM_CHECK_OFF 0 -#define SCF_DBF_NORXSUM_CHECK_ON 1 - -/* scf_debug_no_int_reason */ -#define SCF_DBF_NO_INT_REASON_OFF 0 -#define SCF_DBF_NO_INT_REASON_ON 1 - -/* scf_debug_no_device */ -#define SCF_DBF_NO_DEVICE_OFF 0 -#define SCF_DBF_NO_DEVICE_ON 1 - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFDEBUG_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfdscp.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,470 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFDSCP_H -#define _SCFDSCP_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/scfd/scfdscpif.h> -/* - * Discriptor define - */ -#define SCF_TOTAL_BUFFSIZE 0x00010000 /* Total buff size (64KB) */ -#define SCF_MB_MAXDATALEN 0x00000600 /* Message data max length */ -#define SCF_TXBUFFSIZE SCF_MB_MAXDATALEN /* Tx buff size (1.5KB) */ -#define SCF_RXBUFFSIZE SCF_MB_MAXDATALEN /* Rx buff size (1.5KB) */ -#define SCF_TX_SRAM_MAXCOUNT 16 /* Tx SRAM max count (0x6000) */ -#define SCF_RX_SRAM_MAXCOUNT 26 /* Rx SRAM max count (0x6000) */ - -#define SCF_TXDSC_CNTROLCOUNT (2 * MBIF_MAX) /* TxDSC control count */ -#define SCF_TXDSC_LOCALCOUNT 1 /* TxDSC local count (DSCP_PATH/CONN_CHK) */ - -#define SCF_TXDSC_MAXCOUNT (SCF_TX_SRAM_MAXCOUNT + SCF_TXDSC_CNTROLCOUNT) - /* TxDSC max count (0x6000) */ -#define SCF_RXDSC_MAXCOUNT SCF_RX_SRAM_MAXCOUNT - /* RxDSC max count (0x9c00) */ - -#define SCF_TXDSC_BUSYCOUNT SCF_TX_SRAM_MAXCOUNT /* TxDSC busy count */ -#define SCF_RXDSC_BUSYCOUNT SCF_RX_SRAM_MAXCOUNT /* RxDSC busy count */ - -/* - * Re-try max count define - */ -#define SCF_TX_ACKTO_MAXRETRAYCOUNT 1 /* TxACK timeout */ -#define SCF_TX_ENDTO_MAXRETRAYCOUNT 1 /* TxEND timeout */ - -#define SCF_TX_BUSY_MAXRETRAYCOUNT 10 /* TxEND Busy */ -#define SCF_TX_IF_MAXRETRAYCOUNT 1 /* TxEND Interface error */ -#define SCF_TX_NAK_MAXRETRAYCOUNT 1 /* TxEND Connection refusal */ -#define SCF_TX_NOTSUP_MAXRETRAYCOUNT 1 /* TxEND Not support */ -#define SCF_TX_PRMERR_MAXRETRAYCOUNT 1 /* TxEND Parameter error */ -#define SCF_TX_SEQERR_MAXRETRAYCOUNT 1 /* TxEND Sequence error */ -#define SCF_TX_OTHER_MAXRETRAYCOUNT 1 /* TxEND other error */ -#define SCF_TX_SEND_MAXRETRAYCOUNT 3 /* TxEND send */ - -/* - * Que max count define - */ -#define SCF_RDQUE_MAXCOUNT SCF_RXDSC_MAXCOUNT /* Recv data */ -#define SCF_RDQUE_BUSYCOUNT SCF_RDQUE_MAXCOUNT /* Recv data */ - -#define SCF_MB_EVQUE_MAXCOUNT (SCF_RDQUE_MAXCOUNT + 4) /* Event */ - -/* - * Mailbox interface code - */ -typedef enum { - MBIF_DSCP, /* DSCP mailbox interface code */ - MBIF_DKMD, /* DKMD mailbox interface code */ - /* Add mailbox interface code */ - MBIF_MAX /* Max interface code */ -} scf_mbif_t; - -/* - * Callback event queue - */ -typedef struct scf_event_que { - scf_event_t mevent; /* Event types */ -} scf_event_que_t; - -/* - * Recv data queue - */ -typedef struct scf_rdata_que { - caddr_t rdatap; /* Recv data address */ - uint32_t length; /* Recv data length */ -} scf_rdata_que_t; - -/* - * DSCP main control table - */ -typedef struct scf_dscp_main { - /* main status */ - uint16_t status; /* Main status */ - uint16_t old_status; /* Old main status */ - uint8_t id; /* Table No. */ - uint8_t rsv[3]; /* reserved */ - - /* flag/code */ - uint_t conn_chk_flag; /* DSCP connect check flag */ - - /* init() parameter */ - target_id_t target_id; /* Target ID specifying the peer */ - mkey_t mkey; /* Data type for mailbox key */ - void (*event_handler)(scf_event_t, void *); - /* event handler function */ - scf_event_t mevent; /* Event types */ - void *arg; /* Callback argument */ - - /* cv_init() condition */ - uint_t cv_init_flag; /* cv_init call flag */ - kcondvar_t fini_cv; /* fint() condition variables */ - uint_t fini_wait_flag; /* fini wait flag */ - - /* flag */ - uint_t putmsg_busy_flag; /* putmsg busy flag */ - - /* memo counter */ - uint_t memo_tx_data_req_cnt; /* Tx DATA_REQ counter */ - uint_t memo_tx_data_req_ok_cnt; /* Tx DATA_REQ ok counter */ - uint_t memo_rx_data_req_cnt; /* Rx DATA_REQ counter */ - uint_t memo_rx_data_req_ok_cnt; /* Rx DATA_REQ ok counter */ - uint_t memo_putmsg_busy_cnt; /* putmsg busy counter */ - uint_t memo_putmsg_enospc_cnt; /* putmsg ENOSPC counter */ - - /* Event/Recv data regulation counter */ - uint_t ev_maxcount; /* Event max count */ - uint_t rd_maxcount; /* Recv data max count */ - uint_t rd_busycount; /* Recv data busy count */ - - /* Event/Recv data working counter */ - uint_t ev_count; /* Use event count */ - uint_t rd_count; /* Use recv data count */ - - /* Event/Recv data table address and size */ - scf_event_que_t *ev_quep; /* Event table pointer */ - uint_t ev_quesize; /* Event table size */ - scf_rdata_que_t *rd_datap; /* Recv data table pointer */ - uint_t rd_datasize; /* Recv data table size */ - - /* Event/Recv data offset */ - uint16_t ev_first; /* Event first */ - uint16_t ev_last; /* Event last */ - uint16_t ev_put; /* Event put */ - uint16_t ev_get; /* Event get */ - uint16_t rd_first; /* Recv data first */ - uint16_t rd_last; /* Recv data last */ - uint16_t rd_put; /* Recv data put */ - uint16_t rd_get; /* Recv data get */ - - uint_t timer_code; /* DSCP INIT_REQ timer code */ -} scf_dscp_main_t; - -/* - * DCR/DSR register table - */ -typedef union scf_dscreg { - /* Basic code format */ - struct { - uint16_t c_flag; /* Control flag (DCR/DSR) */ - uint16_t offset; /* SRAM offset (DCR/DSR) */ - uint32_t length; /* Data length (DCR) */ - caddr_t dscp_datap; /* KMEM data address */ - } base; - /* TxDCR/RxDCR bit format */ - struct { /* DCR bit format */ - unsigned id : 4; /* control id */ - unsigned code : 4; /* control code */ - - unsigned emergency : 1; /* emergency flag */ - unsigned interrupt : 1; /* interrupt flag */ - unsigned : 2; - unsigned first : 1; /* first data flag */ - unsigned last : 1; /* last data flag */ - unsigned : 2; - } bdcr; - /* TxDSR/RxDSR bit format */ - struct { /* DSR bit format */ - unsigned id : 4; /* control id */ - unsigned code : 4; /* control code */ - - unsigned status : 8; /* complete status */ - } bdsr; -} scf_dscreg_t; - -/* - * DSCP Tx/Rx discriptor table - */ -typedef struct scf_dscp_dsc { - /* TxDSC/RxDSC status */ - uint16_t status; /* Tx/Rx status */ - uint16_t old_status; /* Old Tx/Rx status */ - - /* DCR/DSR interface area */ - scf_dscreg_t dinfo; /* DCR/DSR register table */ -} scf_dscp_dsc_t; - -/* - * DSCP Tx SRAM table - */ -typedef struct scf_tx_sram { - uint16_t use_flag; /* Tx SRAM use flag */ - uint16_t offset; /* Tx SRAM offset */ -} scf_tx_sram_t; - -/* - * DSCP common table - */ -typedef struct scf_dscp_comtbl { - /* DSCP main control table */ - scf_dscp_main_t scf_dscp_main[MBIF_MAX]; /* DSCP main table */ - - /* flag/code */ - uint_t dscp_init_flag; /* DSCP interface init flag */ - uint_t tx_exec_flag; /* TxREQ exec flag */ - uint_t rx_exec_flag; /* RxREQ exec flag */ - uint_t callback_exec_flag; /* Callback exec flag */ - uint_t dscp_path_flag; /* DSCP path change flag */ - uint_t tx_local_use_flag; /* Use local control TxDSC flag */ - - /* size */ - uint_t maxdatalen; /* Message data max length */ - uint_t total_buffsize; /* Total buff size */ - uint_t txbuffsize; /* Tx buff size */ - uint_t rxbuffsize; /* Rx buff size */ - - /* TxDSC/RxDSC/Event regulation counter */ - uint_t txsram_maxcount; /* TxDSC SRAM max count */ - uint_t rxsram_maxcount; /* RxDSC SRAM max count */ - uint_t txdsc_maxcount; /* TxDSC max count */ - uint_t rxdsc_maxcount; /* RxDSC max count */ - uint_t txdsc_busycount; /* TxDSC busy count */ - uint_t rxdsc_busycount; /* RxDSC busy count */ - - /* TxDSC re-try max count */ - uint_t tx_ackto_maxretry_cnt; /* TxACK timeout */ - uint_t tx_endto_maxretry_cnt; /* TxEND timeout */ - - uint_t tx_busy_maxretry_cnt; /* TxEND busy */ - uint_t tx_interface_maxretry_cnt; /* TxEND Interface error */ - uint_t tx_nak_maxretry_cnt; /* TxEND Connection refusal */ - uint_t tx_notsup_maxretry_cnt; /* TxEND Not support */ - uint_t tx_prmerr_maxretry_cnt; /* TxEND Parameter error */ - uint_t tx_seqerr_maxretry_cnt; /* TxEND Sequence erro */ - uint_t tx_other_maxretry_cnt; /* TxEND other error */ - uint_t tx_send_maxretry_cnt; /* TxEND send */ - - /* TxDSC/RxDSC working counter */ - uint_t tx_dsc_count; /* Use TxDSC count */ - uint_t rx_dsc_count; /* Use RxDSC count */ - uint_t tx_sram_count; /* Use Tx SRAM count */ - - /* TxDSC/RxDSC working re-try counter */ - uint_t tx_ackto_retry_cnt; /* TxACK timeout */ - uint_t tx_endto_retry_cnt; /* TxEND timeout */ - - uint_t tx_busy_retry_cnt; /* TxEND busy */ - uint_t tx_interface_retry_cnt; /* TxEND Interface error */ - uint_t tx_nak_retry_cnt; /* TxEND Connection refusal */ - uint_t tx_notsuop_retry_cnt; /* TxEND Not support */ - uint_t tx_prmerr_retry_cnt; /* TxEND Parameter error */ - uint_t tx_seqerr_retry_cnt; /* TxEND Sequence error */ - uint_t tx_other_retry_cnt; /* TxEND other error */ - uint_t tx_send_retry_cnt; /* TxEND send */ - - /* TxDSC/RxDSC memo counter */ - uint_t tx_ackto_memo_cnt; /* TxACK timeout */ - uint_t tx_endto_memo_cnt; /* TxEND timeout */ - uint_t tx_busy_memo_cnt; /* TxEND busy */ - uint_t tx_interface_memo_cnt; /* TxEND Interface error */ - uint_t tx_nak_memo_cnt; /* TxEND Connection refusal */ - uint_t tx_notsuop_memo_cnt; /* TxEND Not support */ - uint_t tx_prmerr_memo_cnt; /* TxEND Parameter error */ - uint_t tx_seqerr_memo_cnt; /* TxEND Sequence error */ - uint_t tx_other_memo_cnt; /* TxEND other error */ - uint_t scf_stop_memo_cnt; /* SCF path stop */ - - /* TxDSC table address and size */ - scf_dscp_dsc_t *tx_dscp; /* TxDSC table pointer */ - uint_t tx_dscsize; /* TxDSC table size */ - /* RxDSC table address and size */ - scf_dscp_dsc_t *rx_dscp; /* RxDSC table pointer */ - uint_t rx_dscsize; /* RxDSC table size */ - /* Tx SRAM table address and size */ - scf_tx_sram_t *tx_sramp; /* Tx SRAM table pointer */ - uint_t tx_sramsize; /* Tx SRAM table size */ - - /* TxDSC offset */ - uint16_t tx_first; /* TxDSC first offset */ - uint16_t tx_last; /* TxDSC last offset */ - uint16_t tx_put; /* TxDSC put offset */ - uint16_t tx_get; /* TxDSC get offset */ - uint16_t tx_local; /* Local control TxDSC offset */ - - /* TxDSC/RxDSC offset */ - uint16_t rx_first; /* RxDSC first offset */ - uint16_t rx_last; /* RxDSC last offset */ - uint16_t rx_put; /* RxDSC put offset */ - uint16_t rx_get; /* RxDSC get offset */ - - /* Tx SRAM offset */ - uint16_t tx_sram_first; /* Tx SRAM first offset */ - uint16_t tx_sram_last; /* Tx SRAM last offset */ - uint16_t tx_sram_put; /* Tx SRAM put offset */ - -} scf_dscp_comtbl_t; - -/* - * DSCP main status (scf_dscp_main_t : status) - */ - /* (A0) Cconnection idle state */ -#define SCF_ST_IDLE 0x0000 - -#ifdef _SCF_SP_SIDE - /* (A1) init() after, INIT_REQ recv state */ -#define SCF_ST_EST_INIT_REQ_RECV_WAIT 0x0001 -#else /* _SCF_SP_SIDE */ - /* (B0) Send INIT_REQ, TxEND recv wait state */ -#define SCF_ST_EST_TXEND_RECV_WAIT 0x0010 -#endif /* _SCF_SP_SIDE */ - - /* (C0) Connection establishment state */ -#define SCF_ST_ESTABLISHED 0x0020 - /* (C1) Recv FINI_REQ, fini() wait state */ -#define SCF_ST_EST_FINI_WAIT 0x0021 - /* (D0) Send FINI_REQ, TxEND recv wait state */ -#define SCF_ST_CLOSE_TXEND_RECV_WAIT 0x0030 - -/* - * DSCP Tx discriptor status (scf_dscp_dsc_t : status) - */ - /* (SA0) Idle state */ -#define SCF_TX_ST_IDLE 0x0000 - /* (SB0) TxREQ send wait & SRAM trans wait state */ -#define SCF_TX_ST_SRAM_TRANS_WAIT 0x0010 - -#ifdef _SCF_SP_SIDE - /* (SB1) TxREQ send wait & SRAM trans comp wait state */ -#define SCF_TX_ST_SRAM_COMP_WAIT 0x0011 -#endif /* _SCF_SP_SIDE */ - - /* (SB2) TxREQ send wait & TxREQ send wait state */ -#define SCF_TX_ST_TXREQ_SEND_WAIT 0x0012 - /* (SC0) Send TxREQ, TxACK recv wait state */ -#define SCF_TX_ST_TXACK_RECV_WAIT 0x0020 - /* (SC1) Send TxREQ, TxEND recv wait state */ -#define SCF_TX_ST_TXEND_RECV_WAIT 0x0021 - -/* - * DSCP Rx discriptor status (scf_dscp_dsc_t : status) - */ - /* (RA0) Idle state */ -#define SCF_RX_ST_IDLE 0x0000 - /* (RB0) Recv RxREQ, RxACK send wait state */ -#define SCF_RX_ST_RXACK_SEND_WAIT 0x0010 - /* (RB1) Recv RxREQ, SRAM trans wait state */ -#define SCF_RX_ST_SRAM_TRANS_WAIT 0x0011 - -#ifdef _SCF_SP_SIDE - /* (RB2) Recv RxREQ, SRAM comp wait state */ -#define SCF_RX_ST_SRAM_COMP_WAIT 0x0012 -#endif /* _SCF_SP_SIDE */ - - /* (RB3) Recv RxREQ, RxEND send wait state */ -#define SCF_RX_ST_RXEND_SEND_WAIT 0x0013 - -/* - * DSC controlflag (scf_dscreg_t : c_flag) - */ -#define DSC_FLAG_DEFAULT 0x004c /* Default flag */ - /* emergency=0, interrupt=1, first=1, last=0 */ -/* - * DSC controlflag (scf_dscreg_t : id) - */ -#define DSC_CNTL_MASK_ID 0x0f /* Mask id */ - -#define DSC_CNTL_DSCP 0x0 /* DSCP mailbox interface */ -#define DSC_CNTL_DKMD 0x1 /* DKMD mailbox interface */ -#define DSC_CNTL_LOCAL 0xe /* Local interface */ -#define DSC_CNTL_POST 0xf /* Post diag interface (not use) */ - -/* - * DSC controlflag (scf_dscreg_t : code) - */ -#define DSC_CNTL_MASK_CODE 0x0f /* Mask code */ - -#define DSC_CNTL_DATA_REQ 0x0 /* DATA REQ */ -#define DSC_CNTL_INIT_REQ 0x1 /* INIT_REQ */ -#define DSC_CNTL_FINI_REQ 0x2 /* FINI_REQ */ -#define DSC_CNTL_FLUSH_REQ 0x3 /* FLUSH_REQ */ -#define DSC_CNTL_CONN_CHK 0xf /* CONN_CHK */ - -/* - * DSC controlflag (scf_dscreg_t : code) id = DSC_CNTL_LOCAL - */ -#define DSC_CNTL_DSCP_PATH 0x0 /* DSCP_PATH */ - -/* - * DSC controlflag (scf_dscreg_t : status) - */ -#define DSC_STATUS_NORMAL 0x00 /* Normal end */ -#define DSC_STATUS_BUF_BUSY 0x01 /* Buffer busy */ -#define DSC_STATUS_INTERFACE 0x03 /* Interface error */ -#define DSC_STATUS_CONN_NAK 0x04 /* Connection refusal */ -#define DSC_STATUS_E_NOT_SUPPORT 0x08 /* Not support */ -#define DSC_STATUS_E_PARAM 0x09 /* Parameter error */ -#define DSC_STATUS_E_SEQUENCE 0x0d /* Sequence error */ - -/* - * DSC controlflag (scf_dscreg_t : offset) - */ -#define DSC_OFFSET_NOTHING 0xffff /* DSC offset nothing value */ -#define DSC_OFFSET_CONVERT 16 /* DSC offset convert size */ - -/* - * scf_dscp_sram_get() return value - */ -#define TX_SRAM_GET_ERROR 0xffff /* Tx SRAM get error value */ - -/* - * Main status change macro - */ -#define SCF_SET_STATUS(p, st) \ - p->old_status = p->status; \ - p->status = st; \ - SCFDBGMSG2(SCF_DBGFLAG_DSCP, \ - "main status change = 0x%04x 0x%04x", \ - p->status, p->old_status) -/* - * TxDSC/RxDSC status change macro - */ -#define SCF_SET_DSC_STATUS(p, st) \ - p->old_status = p->status; \ - p->status = st; \ - SCFDBGMSG2(SCF_DBGFLAG_DSCP, \ - "DSC status change = 0x%04x 0x%04x", \ - p->status, p->old_status) - -/* - * Use scf_dscp_tx_mat_notice() code - */ -#define TxEND (uint8_t)0x80 /* TxEND */ -#define TxREL_BUSY (uint8_t)0xf0 /* Relese busy */ - -/* - * Use scf_dscp_rx_mat_notice() code - */ -#define RxREQ (uint8_t)0x80 /* RxREQ */ -#define RxDATA (uint8_t)0xf0 /* RxDATA */ - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFDSCP_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfio32.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFIO32_H -#define _SCFIO32_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/types32.h> - -/* SCFIOCWRLCD 32bit */ -typedef struct scfwrlcd32 { - int lcd_type; - int length; - caddr32_t string; -} scfwrlcd32_t; - - -/* SCFIOCGETREPORT 32bit */ -typedef struct scfreport32 { - int flag; - unsigned int rci_addr; - unsigned char report_sense[4]; - time32_t timestamp; -} scfreport32_t; - - -/* SCFIOCGETEVENT 32bit */ -typedef struct scfevent32 { - int flag; - unsigned int rci_addr; - unsigned char code; - unsigned char size; - unsigned char rsv[2]; - unsigned char event_sense[24]; - time32_t timestamp; -} scfevent32_t; - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFIO32_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfkstat.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFKSTAT_H -#define _SCFKSTAT_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * kstat_create(9F) ID parameter - * module = "scfd" - * class = "misc" - */ -/* name = "??" */ -#define SCF_SYSTEM_KSTAT_NAME "scf" - -/* - * kstat_named_init(9F) ID parameter - */ -/* name == "scf" */ -#define SCF_STATUS_KSTAT_NAMED "status" -#define SCF_BOOT_MODE_KSTAT_NAMED "boot_mode" -#define SCF_SECURE_MODE_KSTAT_NAMED "secure_mode" -#define SCF_EVENT_KSTAT_NAMED "event" -#define SCF_ALIVE_KSTAT_NAMED "alive" - -/* - * "scf" KSTAT_TYPE_NAMED item - */ -/* named == "status" */ -#define SCF_STAT_STATUS_OFFLINE 0 -#define SCF_STAT_STATUS_ONLINE 1 - -/* named == "boot_mode" */ -#define SCF_STAT_MODE_OBP_STOP 0 -#define SCF_STAT_MODE_AUTO_BOOT 1 - -/* named == "secure_mode" */ -#define SCF_STAT_MODE_UNLOCK 0 -#define SCF_STAT_MODE_LOCK 1 - -/* named == "watch" */ -#define SCF_STAT_ALIVE_OFF 0 -#define SCF_STAT_ALIVE_ON 1 - - -/* - * SCF driver kstat entry point - */ -/* from scf_attach() */ -void scf_kstat_init(); /* DDI_ATTACH */ - -/* from scf_detach() */ -void scf_kstat_fini(); /* DDI_DETACH */ - -/* - * private variables for kstat routine - */ -typedef struct scf_kstat_private { - /* kstat_t */ - kstat_t *ksp_scf; -} scf_kstat_private_t; - -/* "scf" */ -#define SCF_KSTAT_SYS_NAMED_STATUS 0 -#define SCF_KSTAT_SYS_NAMED_BOOT_MODE 1 -#define SCF_KSTAT_SYS_NAMED_SECURE_MODE 2 -#define SCF_KSTAT_SYS_NAMED_EVENT 3 -#define SCF_KSTAT_SYS_NAMED_ALIVE 4 - -#define SCF_KSTAT_SYS_NAMED_NDATA 5 - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFKSTAT_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfparam.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFPARAM_H -#define _SCFPARAM_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/scfd/scfsys.h> -#include <sys/scfd/scfostoescf.h> - -/* - * Common table - */ -extern scf_comtbl_t scf_comtbl; /* SCF driver common table */ -extern void *scfstate; /* root of soft state */ -extern char *scf_driver_name; /* SCF driver name */ - -/* - * SCF driver control mode - */ -extern uint_t scf_halt_proc_mode; /* SCFHALT after processing mode */ -extern uint_t scf_last_detach_mode; /* Last detach mode */ - -/* - * SRAM trace data size - */ -extern uint_t scf_sram_trace_data_size; /* Get SRAM trace data size */ -extern uint_t scf_trace_rxdata_size; /* Rx data trace size */ - -/* - * Wait timer value (Micro-second) - */ -extern uint_t scf_rdctrl_sense_wait; - /* SCFIOCRDCTRL wait timer value (60s) */ - -/* - * Wait timer value - */ -extern uint_t scf_buf_ful_rtime; - /* Buff full wait retry timer value (500ms) */ -extern uint_t scf_rci_busy_rtime; - /* RCI busy wait retry timer value (3s) */ - -/* - * Re-try counter - */ -extern uint_t scf_buf_ful_rcnt; /* Buff full retry counter */ -extern uint_t scf_rci_busy_rcnt; /* RCI busy retry counter */ -extern uint_t scf_tesum_rcnt; /* Tx sum retry counter */ -extern uint_t scf_resum_rcnt; /* Rx sum retry counter */ -extern uint_t scf_cmd_to_rcnt; /* Command to retry counter */ -extern uint_t scf_devbusy_wait_rcnt; /* Command device busy retry counter */ -extern uint_t scf_online_wait_rcnt; /* SCF online retry counter */ -extern uint_t scf_path_change_max; /* SCF path change retry counter */ - -/* - * Max value - */ -extern uint_t scf_report_sense_pool_max; /* Report sense max */ -extern uint_t scf_getevent_pool_max; /* SCFIOCGETEVENT max */ -extern uint_t scf_rci_max; /* RCI device max */ -extern uint_t scf_rxbuff_max_size; /* SCF command data division max size */ - -/* - * Poff factor (reported on shutdown start) - */ -unsigned char scf_poff_factor[2][3]; -#define SCF_POFF_FACTOR_NORMAL 0 -#define SCF_POFF_FACTOR_PFAIL 1 - -/* - * Alive check parameter - */ -extern uchar_t scf_alive_watch_code; /* Watch code for SCF driver */ -extern uchar_t scf_alive_phase_code; /* Watch phase code */ -extern uchar_t scf_alive_interval_time; /* interval time */ -extern uchar_t scf_alive_monitor_time; /* monitor timeout */ -extern ushort_t scf_alive_panic_time; /* panic timeout */ - -extern uchar_t scf_acr_phase_code; /* Alive check register phase code */ - -/* - * FMEMA interface - */ -extern caddr_t scf_avail_cmd_reg_vaddr; /* SCF Command register address */ - -/* - * Send break interface - */ -extern int scf_dm_secure_mode; /* secure mode */ - -/* - * SCF driver version interface - */ -extern ushort_t scf_scfd_comif_version; /* SCF driver version */ - -/* - * XSCF version interface - */ -extern ushort_t scf_xscf_comif_version; /* XSCF version */ - -/* - * ioctl control value and flag - */ -extern int scf_save_hac_flag; /* Host address disp flag */ -extern scfhac_t scf_save_hac; /* Host address disp save */ - -/* - * Register read sync value - */ -extern uint8_t scf_rs8; -extern uint16_t scf_rs16; -extern uint32_t scf_rs32; - -/* - * Panic value - */ -extern uint_t scf_panic_reported; /* Panic report after */ -extern uint_t scf_panic_report_maxretry; /* Same as busy_maxretry */ -extern uint_t scf_cmdend_wait_time_panic; - /* SCF command end wait timer value (1s) */ -extern uint_t scf_cmdend_wait_rcnt_panic; /* SCF command end retry counter */ - -extern uint_t scf_panic_exec_wait_time; /* Panic wait timer value (100ms) */ -extern uint_t scf_panic_exec_flag; /* Panic exec flag */ -extern uint_t scf_panic_exec_flag2; /* Panic exec flag (report send) */ - -/* - * Panic trace - */ -extern ushort_t scf_panic_trc_w_off; /* Panic trcae next write offset */ -extern uint16_t scf_panic_trc_command; /* Panic SCF command register memo */ -extern uint16_t scf_panic_trc_status; /* Panic SCF status register memo */ -extern ushort_t scf_panic_trc[16]; /* Panic trace area */ -#define SCF_PANIC_TRACE(x) \ - (scf_panic_trc[scf_panic_trc_w_off++ & 0x000f] = (ushort_t)x) - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFPARAM_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfreg.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,580 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFREG_H -#define _SCFREG_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * register map count - */ -#define SCF_REGMAP_COUNT 5 /* register map cnt */ - -/* - * register and SRAM max size - */ -#define SRAM_MAX_DSCP 0x00010000 /* SCF system SRAM max size */ -#define SRAM_MAX_SYSTEM 0x00010000 /* SCF DSCP SRAM max size */ -#define SRAM_MAX_INTERFACE 0x00060000 /* SCF interface max size */ -#define SRAM_MAX_DRVDRVE 0x00001000 /* SCF SRAM driver trac */ - -/* - * SCF registers - */ -typedef struct scf_regs { - uint16_t COMMAND; /* SCF command register */ - uint8_t rsv002[2]; /* reserved */ - uint16_t STATUS; /* SCF status register */ - uint8_t rsv006[2]; /* reserved */ - uint8_t VERSION; /* SCF version register */ - uint8_t rsv009[3]; /* reserved */ - uint8_t rsv00c[4]; /* reserved */ - - uint32_t TDATA0; /* SCF Tx DATA0 register */ - uint32_t TDATA1; /* SCF Tx DATA1 register */ - uint32_t TDATA2; /* SCF Tx DATA2 register */ - uint32_t TDATA3; /* SCF Tx DATA3 register */ - - uint32_t RDATA0; /* SCF Rx DATA0 register */ - uint32_t RDATA1; /* SCF Rx DATA1 register */ - uint32_t RDATA2; /* SCF Rx DATA2 register */ - uint32_t RDATA3; /* SCF Rx DATA3 register */ - - uint8_t rsv030[16]; /* reserved */ - uint8_t rsv040[2]; /* reserved */ - uint8_t COMMAND_ExR; /* SCF command extended register */ - uint8_t rsv043; /* reserved */ - uint8_t FIRMREQ1; /* Firmware request register1 */ - uint8_t FIRMREQ0; /* Firmware request register0 */ - uint8_t rsv046[2]; /* reserved */ - uint8_t ACR; /* Alive check register */ - uint8_t ATR; /* Alive timer register */ - uint8_t rsv04a[6]; /* reserved */ - - uint8_t rsv050[4]; /* reserved */ - uint32_t STATUS_ExR; /* SCFI status extended register */ - uint8_t rsv058[8]; /* reserved */ - uint8_t rsv060[160]; /* reserved */ - - uint8_t DCR; /* DSCP buffer control register */ - uint8_t DSR; /* DSCP buffer status register */ - uint8_t rsv102[14]; /* reserved */ - - uint16_t TxDCR_C_FLAG; /* DSCP Tx DSC control register */ - uint16_t TxDCR_OFFSET; /* DSCP Tx DSC control register */ - uint32_t TxDCR_LENGTH; /* DSCP Tx DSC control register */ - uint16_t TxDSR_C_FLAG; /* DSCP Tx DSC status register */ - uint16_t TxDSR_OFFSET; /* DSCP Tx DSC status register */ - uint8_t rsv11c[4]; /* reserved */ - - uint16_t RxDCR_C_FLAG; /* DSCP Rx DSC control register */ - uint16_t RxDCR_OFFSET; /* DSCP Rx DSC control register */ - uint32_t RxDCR_LENGTH; /* DSCP Rx DSC control register */ - uint16_t RxDSR_C_FLAG; /* DSCP Rx DSC status register */ - uint16_t RxDSR_OFFSET; /* DSCP Rx DSC status register */ - uint8_t rsv12c[4]; /* reserved */ -} scf_regs_t; - -/* - * SCF control registers - */ -typedef struct scf_regs_c { - uint16_t CONTROL; /* SCF Control register */ - uint8_t rsv02[2]; /* reserved */ - uint16_t INT_ST; /* SCF Interrupt Status register */ - uint8_t rsv06[2]; /* reserved */ -} scf_regs_c_t; - -/* - * System buffer (SRAM) - */ -typedef struct scf_sys_sram { - uint8_t DATA[SRAM_MAX_SYSTEM]; /* System Tx/Rx buffer */ -} scf_sys_sram_t; - -/* - * DSCP buffer (SRAM) - */ -typedef struct scf_dscp_sram { - uint8_t DATA[SRAM_MAX_DSCP]; /* DSCP Tx/Rx buffer */ -} scf_dscp_sram_t; - -/* - * Interface buffer hedder (SRAM) - */ -typedef struct scf_interface { - uint32_t other1[0x40 / 4]; /* other area */ - uint32_t DRVTRC_OFFSET; /* SCF driver trace offset */ - uint32_t DRVTRC_SIZE; /* SCF driver trace size */ - uint32_t other2[0xa8 / 4]; /* other area */ -} scf_interface_t; - -/* - * SCF driver trace table - */ -#define DRV_ID_SIZE 16 - -typedef struct scf_if_drvtrc { - uint8_t DRV_ID[DRV_ID_SIZE]; /* driver ID */ - uint32_t DATA_TOP; /* trace data top offset */ - uint32_t DATA_LAST; /* trace data last offset */ - uint32_t DATA_WRITE; /* trace data write offset */ - uint8_t rsv01c[4]; /* reserved */ -} scf_if_drvtrc_t; - -/* - * SRAM driver trace entry - */ -typedef struct scf_drvtrc_ent { - uint8_t LOG_ID; /* log ID */ - uint8_t LOG_TIME[3]; /* log time */ - uint8_t INFO[12]; /* log info */ -} scf_drvtrc_ent_t; - -/* - * SRAM trace log ID - */ -#define DTC_CMD 0x01 /* SCF command start */ -#define DTC_INT 0x02 /* SCF interrupt */ -#define DTC_SENDDATA 0x03 /* SCF send command data */ -#define DTC_RECVDATA 0x04 /* SCF recv command data */ -#define DTC_SENDDATA_SRAM 0x05 /* SCF send command data for SRAM */ -#define DTC_RECVDATA_SRAM 0x06 /* SCF recv command data for SRAM */ -#define DTC_CMDTO 0x11 /* SCF command timeout */ -#define DTC_CMDBUSYTO 0x12 /* SCF command busy timeout */ -#define DTC_ONLINETO 0x13 /* SCF online timeout */ -#define DTC_ERRRTN 0x20 /* SCF command retuen error */ -#define DTC_RCI_BUF_FUL 0x21 /* SCF command return for buff full */ -#define DTC_RCI_BUSY 0x22 /* SCF command return for rci busy */ -#define DTC_INTERFACE 0x23 /* SCF command return for */ - /* interface error */ -#define DTC_E_NOT_SUPPORT 0x28 /* SCF command return for */ - /* not support */ -#define DTC_E_PARAM 0x29 /* SCF command return for */ - /* parameter error */ -#define DTC_E_SCFC_PATH 0x2a /* SCF command return for */ - /* SCFI path error */ -#define DTC_E_RCI_ACCESS 0x2b /* SCF command return for */ - /* RCI access error */ -#define DTC_E_SEQUENCE 0x2d /* SCF command return for */ - /* sequence error */ -#define DTC_RSUMERR 0x31 /* SCF command receive sum error */ -#define DTC_ONLINE 0x32 /* SCF offline start */ -#define DTC_OFFLINE 0x33 /* SCF offline start */ -#define DTC_DSCP_TXREQ 0x41 /* DSCP TxREQ request */ -#define DTC_DSCP_RXACK 0x42 /* DSCP RxACK request */ -#define DTC_DSCP_RXEND 0x43 /* DSCP RxEND request */ -#define DTC_DSCP_RXREQ 0x44 /* DSCP RxREQ interrupt */ -#define DTC_DSCP_TXACK 0x45 /* DSCP TxACK interrupt */ -#define DTC_DSCP_TXEND 0x46 /* DSCP TxEND interrupt */ -#define DTC_DSCP_SENDDATA 0x47 /* DSCP send data */ -#define DTC_DSCP_RECVDATA 0x48 /* DSCP recv data */ -#define DTC_DSCP_ACKTO 0x51 /* DSCP ACK timeout */ -#define DTC_DSCP_ENDTO 0x52 /* DSCP END timeout */ - -#define DTC_MASK_HIGH 0xf0 /* mask high */ - -/* SRAM trace define */ -#define SCF_SRAM_TRACE(a, b) scf_sram_trace(a, b) - -#define SCF_SET_SRAM_DATA1_2(a, b, c) \ - statep->memo_scf_drvtrc.INFO[a] = (uint8_t)(b); \ - statep->memo_scf_drvtrc.INFO[a + 1] = (uint8_t)(c) - -#define SCF_SET_SRAM_DATA2_1(a, b) \ - statep->memo_scf_drvtrc.INFO[a] = (uint8_t)(b >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 1] = (uint8_t)(b) - -#define SCF_SET_SRAM_DATA2_2(a, b, c) \ - statep->memo_scf_drvtrc.INFO[a] = (uint8_t)(b >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 1] = (uint8_t)(b); \ - statep->memo_scf_drvtrc.INFO[a + 2] = (uint8_t)(c >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 3] = (uint8_t)(c) - -#define SCF_SET_SRAM_DATA4_1(a, b) \ - statep->memo_scf_drvtrc.INFO[a] = (uint8_t)(b >> 24); \ - statep->memo_scf_drvtrc.INFO[a + 1] = (uint8_t)(b >> 16); \ - statep->memo_scf_drvtrc.INFO[a + 2] = (uint8_t)(b >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 3] = (uint8_t)(b) - -#define SCF_SET_SRAM_DATA4_3(a, b, c, d) \ - statep->memo_scf_drvtrc.INFO[a] = (uint8_t)(b >> 24); \ - statep->memo_scf_drvtrc.INFO[a + 1] = (uint8_t)(b >> 16); \ - statep->memo_scf_drvtrc.INFO[a + 2] = (uint8_t)(b >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 3] = (uint8_t)(b); \ - statep->memo_scf_drvtrc.INFO[a + 4] = (uint8_t)(c >> 24); \ - statep->memo_scf_drvtrc.INFO[a + 5] = (uint8_t)(c >> 16); \ - statep->memo_scf_drvtrc.INFO[a + 6] = (uint8_t)(c >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 7] = (uint8_t)(c); \ - statep->memo_scf_drvtrc.INFO[a + 8] = (uint8_t)(d >> 24); \ - statep->memo_scf_drvtrc.INFO[a + 9] = (uint8_t)(d >> 16); \ - statep->memo_scf_drvtrc.INFO[a + 10] = (uint8_t)(d >> 8); \ - statep->memo_scf_drvtrc.INFO[a + 11] = (uint8_t)(d) - -/* - * SCF registers define - */ - -/* COMMAND : SCF command register define */ -#define COMMAND_BUSY 0x8000 /* Command interface busy */ -#define COMMAND_SUBCODE 0x7f00 /* Command subcode */ -#define COMMAND_CODE 0x00ff /* Command code */ - -#define CMD_SCFI_PATH 0x10 /* SCF path change */ -#define SUB_CMD_PATH 0x00 /* Command path change */ - -#define CMD_PATH_TYPE_SCFD 0x01 /* Command path type(scfd) */ - -#define CMD_ALIVE_CHECK 0x20 /* Alive check */ -#define SUB_ALIVE_START 0x30 /* Start */ -#define SUB_ALIVE_STOP 0x50 /* Stop */ - -#define CMD_REPORT 0x21 /* Report */ -#define SUB_SYSTEM_STATUS_RPT 0x40 /* System status */ -#define SUB_SYSTEM_STATUS_RPT_NOPATH 0x51 - /* System status (no path check) */ - -#define CMD_PHASE 0x22 /* Domain phase print */ -#define SUB_PHASE_PRINT 0x10 /* Phase print */ - -#define CMD_PART_POW_CTR 0x30 /* power control */ -#define SUB_PON 0x01 /* Power on */ -#define SUB_POFF 0x02 /* Power off */ -#define SUB_FPOFF 0x13 /* Forced power off */ -#define SUB_RESET 0x04 /* Power reset */ -#define SUB_POFFID 0x19 /* Power off factor */ - -#define CMD_SYS_AUTOPOW 0x35 /* System automatic power control */ -#define SUB_SYS_AUTO_ONOFF_SET 0x01 /* on/off time set */ -#define SUB_SYS_AUTO_ONOFF_DISP 0x02 /* on/off time disp */ -#define SUB_SYS_AUTO_ONOFF_CLRAR 0x04 /* on/off time clear */ -#define SUB_FORCED_POFF_SET 0x08 /* Forced power off time set */ -#define SUB_PRESET_MODE_DISP 0x10 /* Power resume mode disp */ -#define SUB_PRESET_MODE_SET 0x20 /* Power resume mode set */ - -#define CMD_RCI_CTL 0x40 /* RCI control */ -#define SUB_HOSTADDR_DISP2 0xff /* Host address disp 2 */ -#define SUB_DEVICE_LIST 0x0a /* Device list disp */ -#define SUB_PANIC 0x03 /* Panic request */ - -#define CMD_INT_REASON 0x50 /* Event information */ -#define SUB_INT_REASON_DISP 0x10 /* Factor detail disp */ -#define SUB_INT_REASON_RETRY 0x01 /* Factor detail re-disp */ - -#define CMD_FILE_DOWNLOAD 0x74 /* File dounload or upload */ - -#define CMD_DOMAIN_INFO 0x81 /* Domain information */ -#define SUB_OPTION_DISP 0x04 /* Option disp */ -#define SUB_PCI_HP_CONFIG 0x52 /* PCI configuration set */ -#define SUB_PCI_DISP 0x54 /* PCI configuration disp */ -#define SUB_DISK_LED_DISP 0x70 /* DISK LED disp */ -#define SUB_DISK_LED_ON 0x73 /* DISK LED on */ -#define SUB_DISK_LED_BLINK 0x75 /* DISK LED blink */ -#define SUB_DISK_LED_OFF 0x76 /* DISK LED off */ - -#define CMD_DR 0xa2 /* DR function */ - -#define CMD_ERRLOG 0xb0 /* Error log control */ -#define SUB_ERRLOG_SET_MADMIN 0x26 /* Log set madmin */ - -#define CMD_REMCS_SPT 0xc3 /* REMCS command */ - -#define CMD_SPARE 0xc4 /* SPARE command */ - -#define CMD_OS_XSCF_CTL 0xc5 /* OS to ESCF */ - -/* STATUS : SCF status register define */ -#define STATUS_SCF_READY 0x8000 /* bit15: SCF READY */ -#define STATUS_SHUTDOWN 0x4000 /* bit14: SHUTDOWN */ -#define STATUS_POFF 0x2000 /* bit13: POFF */ -#define STATUS_EVENT 0x1000 /* bit12: EVENT */ -#define STATUS_TIMER_ADJUST 0x0800 /* bit11: TIMER ADJUST */ -#define STATUS_ALIVE 0x0400 /* bit10: ALIVE (Not use) */ -#define STATUS_MODE_CHANGED 0x0200 /* bit 9: MODE CHANGED */ -#define STATUS_U_PARITY 0x0100 /* bit 8: U Parity (Not use */ -#define STATUS_CMD_RTN_CODE 0x00f0 /* bit 7-4: CMD return code */ -#define STATUS_SECURE_MODE 0x0008 /* bit 3: secure mode status */ -#define STATUS_BOOT_MODE 0x0004 /* bit 2: boot mode status */ -#define STATUS_CMD_COMPLETE 0x0002 /* bit 1: Command complete */ -#define STATUS_L_PARITY 0x0001 /* bit 0: L Parity (Not use) */ - -/* secure mode status */ -#define STATUS_MODE_UNLOCK 0x0000 /* UNLOCK */ -#define STATUS_MODE_LOCK 0x0008 /* LOCK */ - -/* boot mode status */ -#define STATUS_MODE_OBP_STOP 0x0000 /* OBP stop */ -#define STATUS_MODE_AUTO_BOOT 0x0004 /* Auto boot */ - -/* STATUS_CMD_RTN_CODE : Command return value */ -#define NORMAL_END 0x00 /* Normal end */ -#define BUF_FUL 0x01 /* Buff full */ -#define RCI_BUSY 0x02 /* RCI busy */ -#define INTERFACE 0x03 /* Parity/Sum error */ - -#define E_NOT_SUPPORT 0x08 /* Not support */ -#define E_PARAM 0x09 /* Parameter error */ -#define E_SCFC_NOPATH 0x0a /* No SCFC path */ -#define E_RCI_ACCESS 0x0b /* RCI access error */ -#define E_HARD 0x0c /* Hard error */ -#define RCI_NS 0x0f /* Not support RCI */ - -/* COMMAND_ExR : SCF command extended register define */ -#define COMMAND_ExR_BUSY 0x80 /* Command busy */ -#define COMMAND_ExR_RETRY 0x40 /* Command retry */ - -/* STATUS_ExR : SCF status extended register define */ -#define STATUS_POWER_FAILURE 0x80000000 /* Power failure */ -#define STATUS_SCF_STATUS_CHANGE 0x40000000 /* SCF status change */ -#define STATUS_SCF_STATUS 0x20000000 /* SCF status */ -#define STATUS_SCF_NO 0x10000000 /* Offline SCF No. */ -#define STATUS_STATUS_DETAIL 0x0000ffff /* Return code detail code */ - -#define STATUS_SCF_ONLINE 0x20000000 /* SCF status online */ -#define STATUS_SCF_OFFLINE 0x00000000 /* SCF status offline */ - -/* ACR : Alive check register define */ -#define ACR_ALIVE_INT 0x80 /* Alive Interrupt for SCF */ -#define ACR_PHASE_CODE 0x7f /* Phase code */ - -/* ATR : Alive timer register define */ -#define ATR_INTERVAL 0x07 /* Interrupt interval */ -#define ATR_INTERVAL_STOP 0x00 /* Interrupt interval stop */ -#define ATR_INTERVAL_30S 0x01 /* Interrupt interval 30 s */ -#define ATR_INTERVAL_60S 0x02 /* Interrupt interval 1 min */ -#define ATR_INTERVAL_120S 0x04 /* Interrupt interval 2 min */ - -/* DCR : DSCP Buffer Control Register */ - /* Domain to SCF data transfer request isuued */ -#define DCR_TxREQ (uint8_t)0x80 - /* SCF to domain data transfer request accepted */ -#define DCR_RxACK 0x40 - /* SCF to domain data transfer request end */ -#define DCR_RxEND 0x20 - -/* DSR : DSCP Buffer Status Register */ - /* SCF to domain data transfer request issued */ -#define DSR_RxREQ (uint8_t)0x80 - /* domain to SCF data transfer request accepted */ -#define DSR_TxACK 0x40 - /* domain to SCF data transfer request end */ -#define DSR_TxEND 0x20 - -/* Tx/Rx SUM magicnumber */ -#define SCF_MAGICNUMBER_S 0xaa /* Small Buffer SUM */ -#define SCF_MAGICNUMBER_L (uint32_t)0xaaaaaaaa /* Large Buffer SUM */ - -/* Length border conversion */ -#define SCF_LENGTH_16BYTE_CNV 0xfffffff0 /* 16byte border conversion */ - - -/* - * SCF registers define - */ - -/* CONTROL/INT_ST : SCF Control/SCF Interrupt Status register define */ - - /* SCF Path Change Interrupt enable */ -#define CONTROL_PATHCHGIE 0x8000 - /* SCF Interrupt enable */ -#define CONTROL_SCFIE 0x4000 - /* DSCP Communication Buffer Interrupt enable */ -#define CONTROL_IDBCIE 0x2000 - /* Alive Interrupt enable */ -#define CONTROL_ALIVEINE 0x1000 - /* interrupt enable */ -#define CONTROL_ENABLE \ - (CONTROL_PATHCHGIE | CONTROL_SCFIE | CONTROL_IDBCIE) - /* interrupt disable */ -#define CONTROL_DISABLE 0x0000 - - /* SCF Path Change Interrupt */ -#define INT_ST_PATHCHGIE 0x8000 - /* SCF interrupt */ -#define INT_ST_SCFINT 0x4000 - /* DSCP Communication Buffer Interrupt */ -#define INT_ST_IDBCINT 0x2000 - /* Alive Interrupt */ -#define INT_ST_ALIVEINT 0x1000 - - /* All Interrupt */ -#define INT_ST_ALL \ - (INT_ST_PATHCHGIE | INT_ST_SCFINT | INT_ST_IDBCINT | INT_ST_ALIVEINT) - -/* Machine address */ -#define SCF_CMD_SYSTEM_ADDR 0x00000000 /* Owner address */ - -/* status */ -#define REPORT_STAT_PANIC 0x01 /* panic */ -#define REPORT_STAT_SHUTDOWN_START 0x02 /* shutdown start */ -#define REPORT_STAT_SYSTEM_RUNNING 0x0a /* system running */ -#define REPORT_STAT_RCIDWN (uint8_t)0xf0 /* rci down */ - -/* POFF ID */ -#define POFF_ID_PANEL 0x00 /* panel */ -#define POFF_ID_RCI 0x20 /* RCI */ -#define POFF_ID_XSCF 0x03 /* XSCF */ -#define POFF_ID_MASK 0xf0 - -/* category type */ -#define DEV_SENSE_ATTR_OWN 0x00 /* Owner host */ -#define DEV_SENSE_ATTR_OTHER 0x01 /* Other host */ -#define DEV_SENSE_ATTR_IO 0x80 /* I/O unit */ - -/* Remote Device Control */ -#define RCI_DEVCLASS_MASK 0xfff /* mask for device class */ -#define RCI_DEVCLASS_CPU_START 0x001 /* CPU start */ -#define RCI_DEVCLASS_CPU_END 0x0ff /* CPU end */ -#define RCI_DEVCLASS_DISK_START 0x400 /* disk start */ -#define RCI_DEVCLASS_DISK_END 0x4ff /* disk end */ - -#define RMT_DEV_CLASS_START_SHIFT 16 - -/* sense */ -#define DEV_SENSE_SHUTDOWN 0x80 /* need shutdown bit */ - -#define DEV_SENSE_FANUNIT 0x01 /* fan unit error */ - -#define DEV_SENSE_PWRUNIT 0x02 /* power unit error */ - -#define DEV_SENSE_UPS 0x05 /* UPS error */ -#define DEV_SENSE_UPS_MASK 0x0f -#define DEV_SENSE_UPS_LOWBAT 0x8 /* Low Battery */ - -#define DEV_SENSE_THERMAL 0x06 /* thermal error */ - -#define DEV_SENSE_PWRSR 0x07 /* power stop/resume */ -#define DEV_SENSE_PWRSR_MASK 0x0f -#define DEV_SENSE_PWRSR_STOP 0x8 /* power stop */ - -#define DEV_SENSE_NODE 0x08 /* node error */ -#define DEV_SENSE_NODE_STCKTO 0x90 /* status check timeout */ - -#define DEV_SENSE_RCI_PATH40 0x40 /* Devive status print */ -#define DEV_SENSE_SYS_REPORT 0x60 /* system status report */ -#define DEV_SENSE_PANIC_REQ 0x61 /* panic request */ -#define DEV_SENSE_IONODESTAT 0x62 /* I/O node status */ -#define DEV_SENSE_STATUS_RPT 0x71 /* Deveice status print */ - - -/* - * SCF command send control - */ -typedef struct scf_cmd { - uint_t flag; /* buff type flag */ - uchar_t cmd; /* SCF command code */ - uchar_t subcmd; /* SCF sub command code */ - ushort_t stat0; /* Interrupt status */ - uint_t scount; /* Tx data count */ - uint_t rcount; /* Rx data count */ - uchar_t *sbuf; /* Tx buff address */ - uchar_t *rbuf; /* Rx buff address */ - uint_t rbufleng; /* recv data leng */ - ushort_t status; /* SCF status reg */ - uchar_t cexr[4]; /* Command extension info */ -} scf_cmd_t; - -/* SCF interrupt error status make */ -#define SCF_STAT0_RDATA_SUM 0xf0 /* Rx data sum error */ -#define SCF_STAT0_NOT_PATH 0xff /* Non change path */ - -/* SCF comannd buff type */ -#define SCF_USE_S_BUF 0 /* Tx : -/S Rx : - */ -#define SCF_USE_SSBUF 1 /* Tx : -/S Rx : S */ -#define SCF_USE_SLBUF 2 /* Tx : -/S Rx : L */ -#define SCF_USE_L_BUF 3 /* Tx : L Rx : - */ -#define SCF_USE_LSBUF 4 /* Tx : L Tx : S */ - -#define SCF_USE_STOP 0x7e -#define SCF_USE_START 0x7f -#define SCF_USE_SP (uint8_t)0x80 - -/* SCF command size */ -#define SCF_S_CNT_32 32 /* TxRx Small buff size */ -#define SCF_S_CNT_16 16 /* TxRx Small buff size */ -#define SCF_S_CNT_15 15 /* Small buff cnt 15byte */ -#define SCF_S_CNT_12 12 /* Small buff cnt 12byte */ -#define SCF_S_CNT_8 8 /* Small buff cnt 8byte */ - -#define SCF_L_CNT_MAX SRAM_MAX_SYSTEM - /* Command buffer max size (64Kyte) */ - -#define SCF_SBUFR_SIZE 64 /* RDCTL data size */ -#define SCF_SHORT_BUFFER_SIZE (16 * 5) /* Short bauuer size (16byte * 5) */ -#define SCF_SHORT_BUFFER_SIZE_4BYTE (SCF_SHORT_BUFFER_SIZE / 4) -#define SCF_INT_REASON_SIZE 32 /* INT_REASON size */ -#define SCF_INT_CNT_MAX (SCF_INT_REASON_SIZE * 4) - /* INT_REASON max size (128yte) */ -#define SCF_DEVLIST_MAXCNT 2 /* Device list max count */ -#define SCF_DEVLIST_ENTSIZE 8 /* Device list entry size */ - - -/* CMD_RCI_CTL SUB_RCI_PATH_4* value */ -#define SCF_RCI_PATH_PARITY 0x10 /* SUB_RCI_PATH_4* parity */ - -/* Alive check function value */ -#define SCF_ALIVE_FUNC_ON "on" /* parameter alive start */ -#define SCF_ALIVE_FUNC_OFF "off" /* parameter alive stop */ - -#define SCF_ALIVE_START 1 /* Alive check start */ -#define SCF_ALIVE_STOP 0 /* Alive check stop */ - -/* Alive check timer value (10s) */ -#define INTERVAL_TIME_MIN 0x06 /* interval time min (1min) */ -#define INTERVAL_TIME_MAX 0x3c /* cycle_time max (10min) */ -#define INTERVAL_TIME_DEF 0x0c /* cycle_time default (2min) */ -#define MONITOR_TIME_MIN 0x12 /* watch_time min (3min) */ -#define MONITOR_TIME_MAX 0xb4 /* monitor time max (30min) */ -#define MONITOR_TIME_DEF 0x24 /* monitor default (6min) */ -#define PANIC_TIME_MIN 0x00b4 /* panic time min (30min) */ -#define PANIC_TIME_MAX 0x0870 /* panic time max (360min) */ -#define PANIC_TIME_DEF 0x00b4 /* panic time default (30min) */ -#define PANIC_TIME_NONE 0x0000 /* no panic time monitor */ - -#define MONITOR_TIME_CORRECT 0x03 /* monitor time correct (30sec) */ - -#define SCF_MIN_TO_10SEC(a) a = a * 6; /* minutes to 10 seconds */ - -/* Short buffer structure */ -typedef union scf_short_buffer { - uchar_t b[SCF_SHORT_BUFFER_SIZE]; - uint_t four_bytes_access[SCF_SHORT_BUFFER_SIZE_4BYTE]; -} scf_short_buffer_t; - -/* Event information structure */ -typedef union scf_int_reason { - uchar_t b[SCF_INT_CNT_MAX]; - uint_t four_bytes_access[SCF_INT_CNT_MAX / 4]; -} scf_int_reason_t; - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFREG_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfsnap.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFSNAP_H -#define _SCFSNAP_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * ioctl - */ -#define SCFIOCSNAP 's'<<8 - -/* - * ioctl - */ -#define SCFIOCSNAPSHOTSIZE (SCFIOCSNAP|1|0x80040000) -#define SCFIOCSNAPSHOT (SCFIOCSNAP|2|0x80040000) - -/* SCFIOCSNAPSHOTSIZE */ -typedef struct scfsnapsize { - int type; - int info; - int size; -} scfsnapsize_t; - -/* SCFIOCSNAPSHOT */ -typedef struct scfsnap_value { - char ss_name[32]; - int ss_flag; - int ss_rsv1; - int ss_size; - int ss_nextoff; -} scfsnap_value_t; -/* for ss_name field */ -#define SNAP_SCF_DRIVER_VL "scf_driver_vl" -#define SNAP_SCF_COMTBL "scf_comtbl" -#define SNAP_SCF_STATE "scf_state" -#define SNAP_SCF_TIMER_TBL "scf_timer" -#define SNAP_SCF_DSCP_COMTBL "scf_dscp_comtbl" -#define SNAP_SCF_DSCP_TXDSC "scf_dscp_txdsc" -#define SNAP_SCF_DSCP_RXDSC "scf_dscp_rxdsc" -#define SNAP_SCF_DSCP_TXSRAM "scf_dscp_txsram" -#define SNAP_SCF_DSCP_EVENT "scf_dscp_event" -#define SNAP_SCF_DSCP_RDATA "scf_dscp_rdata" -#define SNAP_REGISTER "REGISTER" -#define SNAP_SRAM "SRAM" - -/* for ss_flag field */ -#define SCF_DRIVER_64BIT 64 -#define SCF_DRIVER_32BIT 32 - -typedef struct scfsnap { - int type; - int info; - scfsnap_value_t *ss_entries; -} scfsnap_t; -/* for 32bit */ -typedef struct scfsnap32 { - int type; - int info; - caddr32_t ss_entries; -} scfsnap32_t; -/* for type field */ -#define SCFSNAPTYPE_ALL 1 -#define SCFSNAPTYPE_DRIVER 2 -#define SCFSNAPTYPE_REGISTER 3 -#define SCFSNAPTYPE_SRAM 4 - -/* for info field */ -#define SCFSNAPINFO_AUTO (-1) - -/* - * External function - */ -extern int scf_snapshotsize(intptr_t arg, int mode); -extern int scf_get_snapize(int type, int info); -extern int scf_snapshot(intptr_t arg, int mode); -extern int scf_get_snap(int type, int info, scfsnap_value_t *snap_p, - int snap_size); - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFSNAP_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfstate.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFSTATE_H -#define _SCFSTATE_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/scfd/scfreg.h> - -/* - * SCF driver's software state structure - */ -typedef struct scf_state { - /* SCF device infomation pointer */ - dev_info_t *dip; /* device infomation */ - - /* SCF state table address */ - struct scf_state *next; /* next state addr */ - - /* flag */ - uint_t resource_flag; /* resource allocate flag */ - uint_t scf_herr; /* Hard error flag */ - - /* Register hardware register */ - scf_regs_t *scf_regs; /* SCF register */ - scf_regs_c_t *scf_regs_c; /* SCF contorol register */ - scf_dscp_sram_t *scf_dscp_sram; /* SCF DSCP SRAM */ - scf_sys_sram_t *scf_sys_sram; /* SCF system SRAM */ - scf_interface_t *scf_interface; /* SCF interface block */ - scf_if_drvtrc_t *scf_reg_drvtrc; /* SRAM driver trace */ - - /* Register data access handle */ - ddi_acc_handle_t scf_regs_handle; /* SCF register */ - ddi_acc_handle_t scf_regs_c_handle; /* SCF contorol register */ - ddi_acc_handle_t scf_dscp_sram_handle; /* SCF DSCP SRAM */ - ddi_acc_handle_t scf_sys_sram_handle; /* SCF system SRAM */ - ddi_acc_handle_t scf_interface_handle; /* SCF interface block */ - ddi_acc_handle_t scf_reg_drvtrc_handle; /* SRAM driver trace block */ - - /* Register size */ - off_t scf_dscp_sram_len; /* SCF system SRAM */ - off_t scf_sys_sram_len; /* SCF DSCP SRAM */ - off_t scf_interface_len; /* SCF interface block */ - off_t scf_reg_drvtrc_len; /* SRAM driver trace */ - - /* error retry count */ - uint_t tesum_rcnt; /* Send sum check error */ - uint_t resum_rcnt; /* Recv sum check error */ - uint_t cmd_to_rcnt; /* Command timeout error */ - uint_t devbusy_to_rcnt; /* Command busy timeout error */ - uint_t online_to_rcnt; /* SCF online timeout error */ - - /* error counter memo */ - uint_t memo_cmd_to_cnt; /* CMD timeout counter */ - uint_t no_int_dsr_cnt; /* DSR no interrupt counter */ - uint_t fail_count; /* SCF path fail counter */ - - /* IOMP control area */ - int instance; /* instance */ - int path_status; /* IOMP path status */ - int old_path_status; /* IOMP old path status */ - - /* Register memo */ - uint16_t reg_control; /* SCF INT control */ - uint16_t reg_int_st; /* SCF INT status */ - uint16_t reg_command; /* SCF command */ - uint16_t reg_status; /* SCF status */ - uint32_t reg_tdata[4]; /* SCF Tx data */ - uint32_t reg_rdata[4]; /* SCF Rx data0 */ - uint8_t reg_command_exr; /* SCF command extended */ - uint32_t reg_status_exr; /* SCF status extended */ - uint8_t reg_acr; /* Alive check */ - uint8_t reg_atr; /* Alive timer */ - uint8_t reg_dcr; /* DSCP buffer control */ - uint8_t reg_dsr; /* DSCP buffer status */ - uint16_t reg_txdcr_c_flag; /* DSCP Tx descriptor control */ - uint16_t reg_txdcr_c_offset; /* DSCP Tx descriptor control */ - uint32_t reg_txdcr_c_length; /* DSCP Tx descriptor control */ - uint16_t reg_txdsr_c_flag; /* DSCP Tx descriptor status */ - uint16_t reg_txdsr_c_offset; /* DSCP Tx descriptor status */ - uint16_t reg_rxdcr_c_flag; /* DSCP Rx descriptor control */ - uint16_t reg_rxdcr_c_offset; /* DSCP Rx descriptor control */ - uint32_t reg_rxdcr_c_length; /* DSCP Rx descriptor control */ - uint16_t reg_rxdsr_c_flag; /* DSCP Rx descriptor status */ - uint16_t reg_rxdsr_c_offset; /* DSCP Rx descriptor status */ - - /* SRAM driver trace memo */ - uint32_t memo_DATA_TOP; /* trace data top offset */ - uint32_t memo_DATA_LAST; /* trace data last offset */ - uint32_t memo_DATA_WRITE; /* trace data write offset */ - scf_drvtrc_ent_t memo_scf_drvtrc; /* SRAM driver trace */ - - /* SCF device value */ - char pathname[256]; /* SCFC pathname */ -} scf_state_t; - -/* - * (resource_flag) macro for resource allocate flag - */ -#define S_DID_REG1 (1 << 0) -#define S_DID_REG2 (1 << 1) -#define S_DID_REG3 (1 << 2) -#define S_DID_REG4 (1 << 3) -#define S_DID_REG5 (1 << 4) -#define S_DID_REG6 (1 << 5) - -#define S_DID_INTR (1 << 8) -#define S_DID_MNODE (1 << 9) - -#define S_DID_REGENB ((uint_t)1 << 31) - -/* - * (scf_herr) hard error code - */ -#define HERR_TESUM (1 << 0) -#define HERR_RESUM (1 << 1) -#define HERR_CMD_RTO (1 << 2) -#define HERR_BUSY_RTO (1 << 3) - -#define HERR_DSCP_INTERFACE (1 << 8) -#define HERR_DSCP_ACKTO (1 << 9) -#define HERR_DSCP_ENDTO (1 << 10) - -#define HERR_EXEC ((uint_t)1 << 31) - -/* ddi_dev_regsize(), ddi_regs_map_setup register index number define */ -#define REG_INDEX_SCF 0 /* SCF register */ -#define REG_INDEX_SCFCNTL 1 /* SCF contorol register */ -#define REG_INDEX_DSCPSRAM 2 /* SCF DSCP SRAM */ -#define REG_INDEX_SYSTEMSRAM 3 /* SCF system SRAM */ -#define REG_INDEX_INTERFACE 4 /* SCF interface block(driver trace) */ - -/* - * scf_path_check()/scf_offline_check() return code - */ -#define SCF_PATH_ONLINE 0 /* SCF path exec state */ -#define SCF_PATH_OFFLINE 1 /* SCF path offline state */ -#define SCF_PATH_OFFLINE_DRV 2 /* SCF path offline-drv state */ -#define SCF_PATH_CHANGE 3 /* SCF path change state */ -#define SCF_PATH_HALT (-1) /* SCF path halt state */ - -/* - * scf_cmdbusy_check() return code - */ -#define SCF_COMMAND_READY 0 /* SCF command ready state */ -#define SCF_COMMAND_BUSY 1 /* SCF command busy state */ -#define SCF_COMMAND_BUSY_DRV 2 /* SCF command busy-drv state */ - -/* - * scf_dscp_start()/scf_dscp_stop() arg "factor" value - */ -#define FACTOR_ONLINE 0 /* Factor SCF online */ -#define FACTOR_OFFLINE 1 /* Factor SCF offline */ -#define FACTOR_PATH_CHG 2 /* Factor SCF path change */ -#define FACTOR_PATH_STOP 3 /* Factor IOMP all path stop */ -#define FACTOR_PATH_HALT 4 /* Factor SCF path halt */ - -/* path status (path_status) */ -#define PATH_STAT_ACTIVE 1 -#define PATH_STAT_STANDBY 2 -#define PATH_STAT_STOP 3 -#define PATH_STAT_FAIL 4 -#define PATH_STAT_DISCON 5 -#define PATH_STAT_ENCAP 6 -#define PATH_STAT_EMPTY 0 - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFSTATE_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scfsys.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,865 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFSYS_H -#define _SCFSYS_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/scfd/opcio.h> -#include <sys/scfd/scfstate.h> -#include <sys/scfd/scftimer.h> -#include <sys/scfd/scfkstat.h> -#include <sys/scfd/scfostoescf.h> - -#ifndef TRUE -#define TRUE (1) -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -#define FLAG_ON (1) -#define FLAG_OFF (0) - -#define SCF_DRIVER_VERSION "SCF driver 1.9" -#define SCF_DRIVER_NAME "scfd" -#define SCF_DEVICE_NAME "scfc" - -/* instance number */ -#define SCF_USER_INSTANCE 200 /* instance */ - -#define SCF_MAX_INSTANCE 80 /* Max instance */ - -/* SCFHALT after processing mode define */ -#define HALTPROC_STOP 0 /* processing stop mode (default) */ -#define HALTPROC_SHUTDOWN 1 /* processing shutdown mode */ -#define HALTPROC_PANIC 2 /* processing panic mode */ - -/* - * External function - */ -extern int scf_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); -extern int scf_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); -extern void scf_resource_free_dev(scf_state_t *statep); -extern int scf_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, - void *arg, void **resultp); -extern void scf_reload_conf(scf_state_t *statep); - -extern int scf_open(dev_t *devp, int flag, int otyp, cred_t *cred_p); -extern int scf_close(dev_t dev, int flag, int otyp, cred_t *cred_p); -extern int scf_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, - cred_t *cred_p, int *rval_p); -extern int scf_ioc_reportstat(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_clearlcd(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_wrlcd(intptr_t arg, int mode, int *rval_p, int u_mode); -extern int scf_ioc_getdiskled(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_setdiskled(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_getsdownreason(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_optiondisp(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_getpciconfig(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_hac(intptr_t arg, int mode, int *rval_p, int u_mode); -extern int scf_ioc_hstadrsinfo(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_rdclistmax(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_rdclistx(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_rdctrl(intptr_t arg, int mode, int *rval_p, int u_mode); -extern int scf_ioc_opecall(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_getreport(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_rcipwr(intptr_t arg, int mode, int *rval_p, int u_mode); -extern int scf_ioc_panicreq(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_panicchk(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_parmset(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_parmget(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_autopwrset(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_autopwrget(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_autopwrclr(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_autopwrfpoff(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_autopwrexset(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_autopwrexget(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_dr(intptr_t arg, int mode, int *rval_p, int u_mode); -extern int scf_ioc_eventlist(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_getevent(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_setmadmevent(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_remcscmd(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_remcsfile(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_sparecmd(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_ioc_setphpinfo(intptr_t arg, int mode, int *rval_p, - int u_mode); -extern int scf_push_reportsense(unsigned int rci_addr, - unsigned char *sense, time_t timestamp); -extern int scf_pop_reportsense(scfreport_t *rsense); -extern int scf_push_getevent(unsigned char *event_p); -extern int scf_pop_getevent(scfevent_t *event_p); -extern int scf_valid_date(int year, int month, int date); -extern int scf_check_pon_time(scfautopwrtime_t *ptime); -extern int scf_check_poff_time(scfautopwrtime_t *ptime); - -extern uint_t scf_intr(caddr_t arg); -extern int scf_intr_cmdcmp(scf_state_t *statep); -extern void scf_intr_cmdcmp_driver(scf_state_t *statep, - struct scf_cmd *scfcmdp); -extern int scf_intr_dsens(struct scf_cmd *scfcmdp, - scf_int_reason_t *int_rp, int len); -extern void scf_status_change(scf_state_t *statep); -extern void scf_next_cmd_check(scf_state_t *statep); -extern void scf_next_rxdata_get(void); -extern void scf_online_wait_tout(void); -extern void scf_cmdbusy_tout(void); -extern void scf_cmdend_tout(void); -extern void scf_report_send_wait_tout(void); -extern void scf_alivecheck_intr(scf_state_t *statep); -extern void scf_path_change(scf_state_t *statep); -extern void scf_halt(uint_t mode); -extern void scf_panic_callb(int code); -extern void scf_shutdown_callb(int code); -extern uint_t scf_softintr(caddr_t arg); -extern void scf_cmdwait_status_set(void); - -extern int scf_map_regs(dev_info_t *dip, scf_state_t *statep); -extern void scf_unmap_regs(scf_state_t *statep); -extern int scf_send_cmd_check_bufful(struct scf_cmd *scfcmdp); -extern int scf_send_cmd(struct scf_cmd *scfcmdp); -extern void scf_i_send_cmd(struct scf_cmd *scfcmdp, - struct scf_state *statep); -extern void scf_p_send_cmd(struct scf_cmd *scfcmdp, - struct scf_state *statep); -extern int scf_path_check(scf_state_t **statep); -extern int scf_offline_check(scf_state_t *statep, uint_t timer_exec_flag); -extern int scf_cmdbusy_check(scf_state_t *statep); -extern void scf_alivecheck_start(scf_state_t *statep); -extern void scf_alivecheck_stop(scf_state_t *statep); -extern void scf_forbid_intr(struct scf_state *statep); -extern void scf_permit_intr(struct scf_state *statep, int flag); -extern int scf_check_state(scf_state_t *statep); -extern void scf_chg_scf(scf_state_t *statep, int status); -extern void scf_del_queue(scf_state_t *statep); -extern int scf_make_send_cmd(struct scf_cmd *scfcmdp, uint_t flag); -extern void scf_sram_trace_init(struct scf_state *statep); -extern void scf_sram_trace(struct scf_state *statep, uint8_t log_id); - -#ifdef DEBUG -#include <sys/scfd/scftrace.h> -#include <sys/scfd/iomp_drv.h> -#include <sys/scfd/scfdebug.h> -#include <sys/scfd/scfsnap.h> - -#define SCF_META_INSTANCE (SCF_USER_INSTANCE + 1) - /* meta management instance */ -#define SCF_INST_INSTANCE (SCF_USER_INSTANCE + 2) - /* instance management instance */ - -extern void scf_add_scf(scf_state_t *statep); -extern void scf_del_scf(scf_state_t *statep); -extern int scf_meta_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, - cred_t *cred_p, int *rval_p, int u_mode); -extern int scf_inst_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, - cred_t *cred_p, int *rval_p, int u_mode); -extern void scf_inst_getstat32(scf_state_t *statep, - struct fiompstatus_32 *status32_p, char *message_p, - int flag); -extern void scf_inst_getstat(scf_state_t *statep, - struct fiompstatus *status_p, char *message_p, - int flag); - -#define SCF_DDI_PUT8(a, b, c, d) \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - uint8_t *cp = (uint8_t *)c; \ - *cp = d; \ - } else { \ - ddi_put8(b, c, d); \ - } - -#define SCF_DDI_PUT16(a, b, c, d) \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - uint16_t *cp = (uint16_t *)c; \ - *cp = d; \ - } else { \ - ddi_put16(b, c, d); \ - } - -#define SCF_DDI_PUT32(a, b, c, d) \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - uint32_t *cp = (uint32_t *)c; \ - *cp = d; \ - } else { \ - ddi_put32(b, c, d); \ - } - -#define SCF_DDI_GET8(a, b, c) \ - (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) ? \ - *((uint8_t *)c) : ddi_get8(b, c) - -#define SCF_DDI_GET16(a, b, c) \ - (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) ? \ - *((uint16_t *)c) : ddi_get16(b, c) - -#define SCF_DDI_GET32(a, b, c) \ - (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) ? \ - *((uint32_t *)c) : ddi_get32(b, c) - -#define SCF_P_DDI_PUT8(a, b, c) \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - uint8_t *bp = (uint8_t *)b; \ - *bp = c; \ - } else { \ - ddi_put8(a, b, c); \ - } - -#define SCF_P_DDI_PUT16(a, b, c) \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - uint16_t *bp = (uint16_t *)b; \ - *bp = c; \ - } else { \ - ddi_put16(a, b, c); \ - } - -#define SCF_P_DDI_PUT32(a, b, c) \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - uint32_t *bp = (uint32_t *)b; \ - *bp = c; \ - } else { \ - ddi_put32(a, b, c); \ - } - -#define SCF_P_DDI_GET8(a, b) \ - (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) ? \ - *((uint8_t *)b) : ddi_get8(a, b) - -#define SCF_P_DDI_GET16(a, b) \ - (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) ? \ - *((uint16_t *)b) : ddi_get16(a, b) - -#define SCF_P_DDI_GET32(a, b) \ - (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) ? \ - *((uint32_t *)b) : ddi_get32(a, b) - -#define SCF_CHECK_INSTANCE(a) \ - (a == SCF_USER_INSTANCE) || \ - (a == SCF_META_INSTANCE) || \ - (a == SCF_INST_INSTANCE) - -#define SCF_DBG_DRV_TRACE_TBL \ - scf_trctbl_t *trace_f; \ - scf_trctbl_t *trace_l; \ - scf_trctbl_t *trace_w; \ - scf_trctbl_t *err_trace_f; \ - scf_trctbl_t *err_trace_l; \ - scf_trctbl_t *err_trace_w; \ - scf_trctbl_t trace_table[TC_NRM_CNT]; \ - scf_trctbl_t err_trace_table[TC_ERR_CNT]; \ - int path_num; \ - int alloc_size; \ - scf_state_t **iomp_scf; - -#define SC_DBG_DRV_TRACE(a, b, c, d) \ - scf_trace((ushort_t)(a), (ushort_t)(b), (uchar_t *)(c), (ushort_t)(d)) - -#define SCF_DBG_DRV_TRACE_INIT \ - scf_comtbl.trace_f = (scf_trctbl_t *)&scf_comtbl.trace_table[0]; \ - scf_comtbl.trace_l \ - = (scf_trctbl_t *)&scf_comtbl.trace_table[TC_NRM_CNT]; \ - scf_comtbl.trace_w = (scf_trctbl_t *)&scf_comtbl.trace_table[0]; \ - scf_comtbl.err_trace_f \ - = (scf_trctbl_t *)&scf_comtbl.err_trace_table[0]; \ - scf_comtbl.err_trace_l \ - = (scf_trctbl_t *)&scf_comtbl.err_trace_table[TC_ERR_CNT]; \ - scf_comtbl.err_trace_w \ - = (scf_trctbl_t *)&scf_comtbl.err_trace_table[0]; - -#define SCFDBGMSG(f, s) if (f & scf_trace_msg_flag) \ - cmn_err(CE_CONT, "scfd:debug:%04d: " s, __LINE__) -#define SCFDBGMSG1(f, s, a) if (f & scf_trace_msg_flag) \ - cmn_err(CE_CONT, "scfd:debug:%04d: " s, __LINE__, a) -#define SCFDBGMSG2(f, s, a, b) if (f & scf_trace_msg_flag) \ - cmn_err(CE_CONT, "scfd:debug:%04d: " s, __LINE__, a, b) -#define SCFDBGMSG3(f, s, a, b, c) if (f & scf_trace_msg_flag) \ - cmn_err(CE_CONT, "scfd:debug:%04d: " s, __LINE__, a, b, c) -#define SCFDBGMSG4(f, s, a, b, c, d) if (f & scf_trace_msg_flag) \ - cmn_err(CE_CONT, "scfd:debug:%04d: " s, __LINE__, a, b, c, d) - -#define SCF_DBG_IOMP_INSTANCE \ - { "mscf0", S_IFCHR, SCF_INST_INSTANCE }, \ - { "mscf", S_IFCHR, SCF_META_INSTANCE }, - -#define SCF_DBG_IOMP_PROC \ - if (instance == SCF_META_INSTANCE) { \ - if (drv_priv(cred_p) != 0) { \ - ret = EPERM; \ - goto END_ioctl; \ - } \ - ret = scf_meta_ioctl(dev, cmd, arg, mode, cred_p, rval_p, \ - u_mode); \ - goto END_ioctl; \ - } else if (instance == SCF_INST_INSTANCE) { \ - if (drv_priv(cred_p) != 0) { \ - ret = EPERM; \ - goto END_ioctl; \ - } \ - ret = scf_inst_ioctl(dev, cmd, arg, mode, cred_p, rval_p, \ - u_mode); \ - goto END_ioctl; \ - } - -#define SCF_DBG_IOMP_ADD(a) \ - { \ - scf_add_scf(a); \ - } - -#define SCF_DBG_IOMP_DEL(a) \ - { \ - scf_del_scf(a); \ - } - -#define SCF_DBG_IOMP_FREE \ - { \ - if (scf_comtbl.iomp_scf != NULL) { \ - kmem_free((void *)scf_comtbl.iomp_scf, \ - (size_t)scf_comtbl.alloc_size); \ - scf_comtbl.iomp_scf = NULL; \ - scf_comtbl.alloc_size = 0; \ - scf_comtbl.path_num = 0; \ - } \ - } - -#define SCF_DBG_IOCTL_PROC \ - if ((uint_t)cmd == SCFIOCCMDTHROUGH) { \ - ret = scf_debug_cmdthrough(arg, mode); \ - goto END_ioctl; \ - } else if ((uint_t)cmd == SCFIOCTEST) { \ - ret = scf_debug_test(arg, mode); \ - goto END_ioctl; \ - } else if ((uint_t)cmd == SCFIOCSNAPSHOTSIZE) { \ - ret = scf_snapshotsize(arg, mode); \ - goto END_ioctl; \ - } else if ((uint_t)cmd == SCFIOCSNAPSHOT) { \ - ret = scf_snapshot(arg, mode); \ - goto END_ioctl; \ - } - -#define SCF_DBG_TEST_TIMER_STOP \ - { \ - scf_debug_test_timer_stop(); \ - } - -#define SCF_DBG_TEST_INTR(a) \ - { \ - if ((scf_debug_test_sys_int_flag == SCF_DBF_SYS_INTR_ON) || \ - (scf_debug_test_dscp_int_flag == SCF_DBF_DSCP_INT_ON)) \ - scf_debug_test_intr(a); \ - } - -#define SCF_DBG_TEST_INTR_SCFINT(a) \ - { \ - if (scf_debug_test_sys_int_flag == SCF_DBF_SYS_INTR_ON) \ - scf_debug_test_intr_scfint(a); \ - } - -#define SCF_DBG_TEST_INTR_CMDEND(a) \ - { \ - if (scf_debug_test_sys_int_flag == SCF_DBF_SYS_INTR_ON) \ - scf_debug_test_intr_cmdend(a); \ - } - -#define SCF_DBG_MAKE_RXSUM(a, b) \ - { \ - if (scf_debug_norxsum_check != SCF_DBF_NORXSUM_CHECK_OFF) \ - a = b; \ - } - -#define SCF_DBG_MAKE_RXSUM_L(a, b) \ - { \ - if (scf_debug_test_rxbuff_nosum_check_flag == \ - SCF_DBF_RXBUFF_NOSUM_CHECK_ON) { \ - a = b; \ - scf_debug_test_rxbuff_nosum_check_flag \ - = SCF_DBF_RXBUFF_NOSUM_CHECK_OFF; \ - } \ - } - -#define SCF_DBG_NO_INT_REASON \ - { \ - if (scf_debug_no_int_reason) \ - scf_comtbl.scf_event_flag &= (~STATUS_EVENT); \ - } - -#define SCF_DBG_TEST_INTR_POFF \ - { \ - if (scf_debug_test_sys_poff_flag == SCF_DBF_NO_INT_REASON_ON) \ - scf_debug_test_intr_poff(); \ - } - -#define SCF_DBG_TEST_DSENS(a, b, c) \ - { \ - if (scf_debug_test_sys_event_flag == SCF_DBF_SYS_EVENT_ON) \ - scf_debug_test_dsens(a, b, c); \ - } - -#define SCF_DBG_TEST_SEND_CMD(a, b) \ - { \ - if (scf_debug_nofirm_sys == SCF_DBF_NOFIRM_SYS_ON) \ - scf_debug_test_send_cmd(a, b); \ - } - -#define SCF_DBG_MAKE_PATH_CHECK(a) \ - { \ - if (scf_debug_test_path_check != SCF_DBC_PATH_CHECK_CLEAR) { \ - scf_debug_test_path_check--; \ - if (scf_debug_test_path_check == SCF_DBC_PATH_CHECK_CLEAR) \ - a = scf_debug_test_path_check_rtn; \ - } \ - } - -#define SCF_DBG_MAKE_ONLINE(a) \ - { \ - if (scf_debug_nooffline_check != SCF_DBF_NOOFFLINE_CHECK_OFF) \ - a = STATUS_SCF_ONLINE; \ - } - -#define SCF_DBG_MAKE_OFFLINE_CHECK(a) \ - { \ - if (scf_debug_test_offline_check != SCF_DBC_OFFLINE_CHECK_CLEAR) { \ - scf_debug_test_offline_check--; \ - if (scf_debug_test_offline_check \ - == SCF_DBC_OFFLINE_CHECK_CLEAR) \ - a = scf_debug_test_offline_check_rtn; \ - } \ - } - -#define SCF_DBG_RTN_MAKE_CMD_READY \ - { \ - if (scf_debug_nofirm_sys == SCF_DBF_NOFIRM_SYS_ON) \ - return (SCF_COMMAND_READY); \ - } - -#define SCF_DBG_MAKE_CMD_BUSY(a, b) \ - { \ - if (scf_debug_test_cmdr_busy != SCF_DBC_CMDR_BUSY_CLEAR) { \ - scf_debug_test_cmdr_busy--; \ - if (scf_debug_test_cmdr_busy == SCF_DBC_CMDR_BUSY_CLEAR) \ - a |= COMMAND_BUSY; \ - } \ - if (scf_debug_test_cmdexr_busy != SCF_DBC_CMDEXR_BUSY_CLEAR) { \ - scf_debug_test_cmdexr_busy--; \ - if (scf_debug_test_cmdexr_busy == SCF_DBC_CMDEXR_BUSY_CLEAR) \ - b |= COMMAND_ExR_BUSY; \ - } \ - } - -#define SCF_DBG_TEST_ALIVE_START(a) \ - { \ - if (scf_debug_no_alive == SCF_DBF_NO_ALIVE_ON) \ - scf_debug_test_alive_start(a); \ - } - -#define SCF_DBG_TEST_ALIVE_STOP(a) \ - { \ - if (scf_debug_no_alive == SCF_DBF_NO_ALIVE_ON) \ - scf_debug_test_alive_stop(a); \ - } - -#define SCF_DBG_TEST_INTR_DSCP_DSR(a) \ - { \ - if (scf_debug_test_dscp_int_flag == SCF_DBF_DSCP_INT_ON) \ - scf_debug_test_intr_dscp_dsr(a); \ - } - -#define SCF_DBG_TEST_INTR_DSCP_RXTX(a, b) \ - { \ - if (scf_debug_test_dscp_int_flag == SCF_DBF_DSCP_INT_ON) \ - scf_debug_test_intr_dscp_rxtx(a, b); \ - } - -#define SCF_DBG_MAKE_LOOPBACK(a) \ - { \ - if (scf_debug_test_dscp_loopback == SCF_DBF_DSCP_LOOPBACK_ON) \ - a = 0; \ - } - -#define SCF_DBG_MAKE_NO_DSCP_PATH(a) \ - { \ - if (scf_debug_no_dscp_path == SCF_DBF_NO_DSCP_PATH_ON) \ - a = FLAG_OFF; \ - } - -#define SCF_DBG_TEST_TXREQ_SEND(a, b) \ - { \ - if (scf_debug_nofirm_dscp == SCF_DBF_NOFIRM_DSCP_ON) \ - scf_debug_test_txreq_send(a, b); \ - } - -#define SCF_DBG_TEST_MAP_REGS(a) \ - { \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - scf_debug_test_map_regs(a); \ - scf_sram_trace_init(a); \ - ret = 0; \ - goto END_map_regs; \ - } \ - } - -#define SCF_DBG_TEST_UNMAP_REGS(a) \ - { \ - if (scf_debug_no_device == SCF_DBF_NO_DEVICE_ON) { \ - scf_debug_test_unmap_regs(a); \ - SCFDBGMSG(SCF_DBGFLAG_SYS, "scf_unmap_regs(): end"); \ - return; \ - } \ - } - -#define SCF_DBG_XSCF_SET_STATUS \ - if (scf_comtbl.debugxscf_flag) { \ - if (scfcmdp->stat0 != NORMAL_END) { \ - scfcmdp->rbufleng = 0; \ - scfcmdp->stat0 = NORMAL_END; \ - } \ - } - -#define SCF_DBG_XSCF_SET_LENGTH \ - if (scf_comtbl.debugxscf_flag) { \ - if (((scfcmdp->status & STATUS_CMD_RTN_CODE) >> 4) != \ - NORMAL_END) { \ - scfcmdp->rbufleng = 0; \ - break; \ - } \ - } - -#define SCF_DBG_CHECK_NODEVICE \ - scf_debug_no_device == SCF_DBF_NO_DEVICE_ON - -#else /* DEBUG */ - -#define SCF_DDI_PUT8(a, b, c, d) ddi_put8(b, c, d) -#define SCF_DDI_PUT16(a, b, c, d) ddi_put16(b, c, d) -#define SCF_DDI_PUT32(a, b, c, d) ddi_put32(b, c, d) -#define SCF_DDI_GET8(a, b, c) ddi_get8(b, c) -#define SCF_DDI_GET16(a, b, c) ddi_get16(b, c) -#define SCF_DDI_GET32(a, b, c) ddi_get32(b, c) - -#define SCF_P_DDI_PUT8(a, b, c) ddi_put8(a, b, c) -#define SCF_P_DDI_PUT16(a, b, c) ddi_put16(a, b, c) -#define SCF_P_DDI_PUT32(a, b, c) ddi_put32(a, b, c) -#define SCF_P_DDI_GET8(a, b) ddi_get8(a, b) -#define SCF_P_DDI_GET16(a, b) ddi_get16(a, b) -#define SCF_P_DDI_GET32(a, b) ddi_get32(a, b) - -#define SCF_CHECK_INSTANCE(a) (a == SCF_USER_INSTANCE) - -#define SCF_DBG_DRV_TRACE_TBL -#define SC_DBG_DRV_TRACE(a, b, c, d) -#define SCF_DBG_DRV_TRACE_INIT - -#define SCFDBGMSG(f, s) -#define SCFDBGMSG1(f, s, a) -#define SCFDBGMSG2(f, s, a, b) -#define SCFDBGMSG3(f, s, a, b, c) -#define SCFDBGMSG4(f, s, a, b, c, d) - -#define SCF_DBG_INIT -#define SCF_DBG_IOMP_INSTANCE -#define SCF_DBG_IOMP_PROC -#define SCF_DBG_IOCTL_PROC -#define SCF_DBG_IOMP_ADD(a) -#define SCF_DBG_IOMP_DEL(a) -#define SCF_DBG_IOMP_FREE -#define SCF_DBG_TEST_TIMER_STOP -#define SCF_DBG_TEST_INTR(a) -#define SCF_DBG_TEST_INTR_SCFINT(a) -#define SCF_DBG_TEST_INTR_CMDEND(a) -#define SCF_DBG_MAKE_RXSUM(a, b) -#define SCF_DBG_MAKE_RXSUM_L(a, b) -#define SCF_DBG_NO_INT_REASON -#define SCF_DBG_TEST_INTR_POFF -#define SCF_DBG_TEST_DSENS(a, b, c) -#define SCF_DBG_TEST_SEND_CMD(a, b) -#define SCF_DBG_MAKE_PATH_CHECK(a) -#define SCF_DBG_MAKE_ONLINE(a) -#define SCF_DBG_MAKE_OFFLINE_CHECK(a) -#define SCF_DBG_RTN_MAKE_CMD_READY -#define SCF_DBG_MAKE_CMD_BUSY(a, b) -#define SCF_DBG_TEST_ALIVE_START(a) -#define SCF_DBG_TEST_ALIVE_STOP(a) -#define SCF_DBG_TEST_INTR_DSCP_DSR(a) -#define SCF_DBG_TEST_INTR_DSCP_RXTX(a, b) -#define SCF_DBG_MAKE_LOOPBACK(a) -#define SCF_DBG_MAKE_NO_DSCP_PATH(a) -#define SCF_DBG_TEST_TXREQ_SEND(a, b) -#define SCF_DBG_TEST_MAP_REGS(a) -#define SCF_DBG_TEST_UNMAP_REGS(a) -#define SCF_DBG_DDI_PUT(a, b) -#define SCF_DBG_DDI_GET(a) -#define SCF_DBG_XSCF_SET_STATUS -#define SCF_DBG_XSCF_SET_LENGTH - -#endif /* DEBUG */ - -/* - * SCF driver common table - */ -typedef struct scf_comtbl { - /* mutex resource */ - kmutex_t all_mutex; /* scf driver mutex */ - kmutex_t trc_mutex; /* scf driver trace mutex */ - kmutex_t attach_mutex; /* attach mutex */ - kmutex_t si_mutex; /* softintr mutex */ - - /* cookie */ - ddi_iblock_cookie_t iblock_cookie; /* SCFI-Interrupt */ - ddi_iblock_cookie_t soft_iblock_cookie; /* softintr cookie */ - - /* condition variables */ - kcondvar_t cmd_cv; /* command send */ - kcondvar_t cmdwait_cv; /* command send wait */ - kcondvar_t cmdend_cv; /* command send end */ - kcondvar_t cmdbusy_cv; /* command busy send wait */ - kcondvar_t rsense_cv; /* report sense */ - kcondvar_t rdcsense_cv; /* SCFIOCRDCTRL & sense */ - kcondvar_t rdctrl_cv; /* SCFIOCRDCTRL command */ - kcondvar_t getevent_cv; /* SCFIOCGETEVENT */ - kcondvar_t suspend_wait_cv; /* suspend cv */ - - /* ID */ - ddi_softintr_t scf_softintr_id; /* softintr id */ - - /* SCF state table address */ - scf_state_t *scf_pseudo_p; /* pseudo device state */ - scf_state_t *scf_exec_p; /* SCF exec state */ - scf_state_t *scf_path_p; /* SCF path change state */ - scf_state_t *scf_wait_p; /* Standby state */ - scf_state_t *scf_stop_p; /* Stop state */ - scf_state_t *scf_err_p; /* error state */ - scf_state_t *scf_disc_p; /* Disconnect state */ - scf_state_t *scf_suspend_p; /* Suspend stste */ - - /* flag and counter */ - uint_t resource_flag; /* resource allocate flag */ - uint_t scf_event_flag; /* SCF event flag */ - uint_t poff_factor; /* Shutdown factor */ - uint_t cmd_busy; /* cmd send busy flag */ - uint_t cmd_wait; /* cmd send wait counter */ - uint_t cmd_busy_wait; /* cmd busy send wait flag */ - uint_t cmd_end_wait; /* cmd send end wait flag */ - uint_t rdctrl_busy; /* SCFIOCRDCTRL busy flag */ - uint_t rdctrl_end_wait; /* SCFIOCRDCTRL cmd end wait flag */ - uint_t alive_running; /* Alive check exec flag */ - uint_t watchdog_after_resume; /* watch cpu after resume flag */ - uint_t scf_shutdown_exec_flag; /* SCFIOCSHUTDOWN call flag */ - uint_t shutdown_start_reported; /* SCFIOCREPORTSTAT(shutdown) call */ - uint_t scf_exec_cmd_id; /* SCF command exec id */ - uint_t scf_cmd_exec_flag; /* SCF command exec flag */ - uint_t putinfo_exec_flag; /* scf_service_putinfo() exec flag */ - uint_t getinfo_exec_flag; /* scf_service_getinfo() exec flag */ - uint_t debugxscf_flag; /* SCFIOCCMDTHROUGH exec flag */ - uint_t suspend_wait; /* Suspend wait flag */ - uint_t suspend_flag; /* Suspend flag */ - uint_t scf_suspend_sendstop; /* Suspend send stop flag */ - uint_t scf_softintr_dscp_kicked; /* Softintr DSCP kick flag */ - uint_t int_reason_retry; /* INT_REASON retry flag */ - uint_t scf_alive_int_count; /* Alive check interrupt counter */ - uint_t reload_conf_flag; /* configuration file load flag */ - uint_t scf_cmd_resend_flag; /* SCF command re send flag */ - uint_t scf_cmd_resend_req; /* SCF command re send flag */ - uint_t path_stop_flag; /* command send stop flag */ - - uint_t report_buf_ful_rcnt; /* Report command BUF_FUL */ - /* retry counter */ - uint_t report_rci_busy_rcnt; /* Report command RCI_BUSY */ - /* retry counter */ - uint_t path_change_rcnt; /* SCF path change retry counter */ - - /* status information */ - ushort_t scf_mode_sw; /* Mode switch status */ - uchar_t scf_poff_id; /* POFF interrupt id */ - uint_t scf_shutdownreason; /* Shutdown reason */ - uint_t scf_status; /* XSCF status */ - - /* SCF command control code */ - uint_t scf_pchg_event_sub; /* SCF path change status */ - uint_t scf_poff_event_sub; /* POFF event status */ - uint_t scf_shut_event_sub; /* SHUTDOWN event status */ - uint_t scf_alive_event_sub; /* ALIVE event status */ - uint_t scf_report_event_sub; /* REPORT processing status */ - uint_t scf_domain_event_sub; /* Domain processing status */ - - /* SCF command control */ - scf_cmd_t *scf_cmdp; /* SCF command table address */ - uint_t scf_last_report; /* Last report */ - uint_t scf_rem_rxbuff_size; /* remainder receive data size */ - - /* SCF command interrupt area */ - scf_cmd_t scf_cmd_intr; /* SCF comand table(Interrupt use) */ - uchar_t scf_sbuf[SCF_S_CNT_16]; /* Tx Small buffer table */ - uchar_t scf_rbuf[SCF_INT_CNT_MAX]; /* Rx Large buffer table */ - uchar_t last_event[SCF_INT_REASON_SIZE]; /* Last event table */ - - /* ioctl control area */ - scfreport_t *report_sensep; /* SCFIOCGETREPORT save address */ - int report_sense_top; /* SCFIOCGETREPORT save offset(push) */ - int report_sense_oldest; /* SCFIOCGETREPORT save offset(pop) */ - uint_t rcidown_event_flag; /* SCFIOCGETREPORT rci down flag */ - scfreport_t scfreport_rcidown; /* SCFIOCGETREPORT rci down area */ - - scfevent_t *getevent_sensep; /* SCFIOCGETEVENT save address */ - int getevent_sense_top; /* SCFIOCGETEVENT save offset(push) */ - int getevent_sense_oldest; /* SCFIOCGETEVENT save offset(pop) */ - - scfeventlist_t getevent_tbl; /* SCFIOCEVENTLIST list table */ - - uchar_t lcd_seq_mes[SCF_WRLCD_MAX]; - /* SCFIOCCLEARLCD and SCFIOCWRLCD message */ - - uchar_t rdctrl_sense_category_code; /* SCFIOCRDCTL sub command */ - uchar_t rdctrl_sense[SCF_SBUFR_SIZE]; /* SCFIOCRDCTL information */ - - /* memo counter */ - uint_t attach_count; /* SCF attach count */ - - /* error memo counter */ - uint_t memo_cmd_to_cnt; /* CMD timeout memo */ - uint_t scf_rsense_overflow; /* SCFIOCGETREPORT overflow memo */ - uint_t scf_getevent_overflow; /* SCFIOCGETEVENT overflow memo */ - - /* Unclaimed interrupt register log */ - uint_t scf_unclamed_cnt; /* Unclaimed interrupt counter */ - struct { - uint16_t CONTROL; /* SCF Control register */ - uint16_t INT_ST; /* SCF Interrupt Status register */ - uint16_t COMMAND; /* SCF command register */ - uint16_t STATUS; /* SCF status register */ - uint32_t STATUS_ExR; /* SCFI status extended register */ - uint8_t DSR; /* DSCP buffer status register */ - } scf_unclamed; - - /* kstat private area */ - scf_kstat_private_t *kstat_private; /* for kstat area */ - - SCF_DBG_DRV_TRACE_TBL /* SCF driver trace */ -} scf_comtbl_t; - - -/* - * (resource_flag) macro for resource allocate flag - */ -#define DID_MUTEX_ATH (1 << 0) -#define DID_MUTEX_ALL (1 << 1) -#define DID_MUTEX_TRC (1 << 2) -#define DID_MUTEX_SI (1 << 3) - -#define DID_CV (1 << 4) -#define DID_KSTAT (1 << 5) -#define DID_ALLOCBUF (1 << 6) -#define DID_ALIVECHECK (1 << 7) - -#define DID_MNODE (1 << 8) -#define DID_SOFTINTR (1 << 9) - -#define DID_DSCPINIT (1 << 10) - -/* - * XSCF status defaine (scf_status) - */ -#define SCF_STATUS_OFFLINE 0 /* XSCF status is offline */ -#define SCF_STATUS_ONLINE 1 /* XSCF status is online */ -#define SCF_STATUS_UNKNOWN 2 /* XSCF status is unknown */ - -/* - * SCF command control status - */ -#define EVENT_SUB_NONE 0 /* None status */ -/* (scf_pchg_event_sub) SCF path change status */ -#define EVENT_SUB_PCHG_WAIT 1 /* SCF path change command wait */ -#define EVENT_SUB_PCHG_EXEC 2 /* SCF path change command exec */ -/* (scf_poff_event_sub) POFF event status */ -#define EVENT_SUB_POFF_WAIT 1 /* POFF factor command wait */ -#define EVENT_SUB_POFF_EXEC 2 /* POFF factor command exec */ -/* (scf_shut_event_sub) SHUTDOWN event status */ -#define EVENT_SUB_SHUT_WAIT 1 /* command wait (SHUTDOWN) */ -#define EVENT_SUB_SHUT_EXEC 2 /* command exec (SHUTDOWN) */ -#define EVENT_SUB_WAIT 3 /* command wait (EVENT) */ -#define EVENT_SUB_EXEC 4 /* command exec (EVENT) */ -/* (scf_alive_event_sub) ALIVE event status */ -#define EVENT_SUB_ALST_WAIT 1 /* Alive start command wait */ -#define EVENT_SUB_ALST_EXEC 2 /* Alive start command exec */ -#define EVENT_SUB_ALSP_WAIT 3 /* Alive stop command wait */ -#define EVENT_SUB_ALSP_EXEC 4 /* Alive stop command exec */ -/* (scf_report_event_sub) REPORT processing status */ -#define EVENT_SUB_REPORT_RUN_WAIT 1 /* Report (runnning) send wait */ -#define EVENT_SUB_REPORT_RUN_EXEC 2 /* Report (runnning) send exec */ -#define EVENT_SUB_REPORT_SHUT_WAIT 3 /* Report (shutdown) send wait */ -#define EVENT_SUB_REPORT_SHOT_EXEC 4 /* Report (shutdown) send exec */ -/* (scf_domain_event_sub) Domain processing status */ -#define EVENT_SUB_DOMAIN_WAIT 1 /* Domain info command wait */ -#define EVENT_SUB_DOMAIN_EXEC 2 /* Domain info command exec */ - -/* (scf_last_report) define */ -#define NOT_SEND_REPORT 0xffffffff /* Not report send */ - -/* scf_cmd_resend_req define */ -#define RESEND_IOCTL (1 << 0) /* Comand from ioctl */ -#define RESEND_PCHG (1 << 1) /* SCF Path change command */ -#define RESEND_POFF (1 << 2) /* Power supply control command */ -#define RESEND_SHUT (1 << 3) /* Event information command */ -#define RESEND_ALST (1 << 4) /* Alive check command (start) */ -#define RESEND_ALSP (1 << 5) /* Alive check command (stop) */ -#define RESEND_REPORT_RUN (1 << 6) /* Report command (system running) */ -#define RESEND_REPORT_SHUT (1 << 7) /* Report command (shutdown start) */ -#define RESEND_DOMAIN (1 << 8) /* Domain info command */ - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFSYS_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scftimer.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFTIMER_H -#define _SCFTIMER_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Timer code - */ -typedef enum { - SCF_TIMERCD_CMDBUSY, /* SCF command busy watch timer */ - SCF_TIMERCD_CMDEND, /* SCF command completion watch timer */ - SCF_TIMERCD_ONLINE, /* SCF online watch timer */ - SCF_TIMERCD_NEXTRECV, /* Next receive wait timer */ - SCF_TIMERCD_DSCP_ACK, /* DSCP interface TxACK watch timer */ - SCF_TIMERCD_DSCP_END, /* DSCP interface TxEND watch timer */ - SCF_TIMERCD_DSCP_BUSY, /* DSCP interface busy watch timer */ - SCF_TIMERCD_DSCP_CALLBACK, /* DSCP interface callback timer */ - SCF_TIMERCD_BUF_FUL, /* SCF command BUF_FUL retry timer */ - SCF_TIMERCD_RCI_BUSY, /* SCF command RCI_BUSY retry timer */ - SCF_TIMERCD_DSCP_INIT, /* DSCP INIT_REQ retry timer */ - SCF_TIMERCD_DKMD_INIT, /* DKMD INIT_REQ retry timer */ - SCF_TIMERCD_MAX /* Max timer code */ -} scf_tm_code_t; - -/* - * Timer table - */ -typedef struct scf_timer_tbl { - uint8_t code; /* Timer code */ - uint8_t rsv[3]; /* reserved */ - timeout_id_t id; /* Timer ID */ -} scf_timer_tbl_t; - -/* - * Timer control table - */ -typedef struct scf_timer { - scf_timer_tbl_t tbl[2]; - uint8_t start; /* Timer start flag */ - uint8_t restart; /* Timer restart flag */ - uint8_t stop; /* Timer stop flag */ - uint8_t side; /* Use table side */ - uint32_t value; /* Timer value */ -} scf_timer_t; - -/* - * scf_timer_check() return value - */ -#define SCF_TIMER_NOT_EXEC 0 -#define SCF_TIMER_EXEC 1 - -/* - * Timer value (ms) - */ - /* SCF command busy timer value (10s) */ -#define SCF_TIMER_VALUE_DEVBUSY 10000 - /* SCF command completion timer value (60s) */ -#define SCF_TIMER_VALUE_CMDEND 60000 - /* SCF online timer value (10s) */ -#define SCF_TIMER_VALUE_ONLINE 10000 - /* Next receive timer value (20ms) */ -#define SCF_TIMER_VALUE_NEXTRCV 20 - /* DSCP interface timer value (60s) */ -#define SCF_TIMER_VALUE_DSCP_ACK 60000 - /* DSCP interface TxEND timer value (60s) */ -#define SCF_TIMER_VALUE_DSCP_END 60000 - /* DSCP interface busy timer value (2s) */ -#define SCF_TIMER_VALUE_DSCP_BUSY 2000 - /* DSCP interface callback timer value (20ms) */ -#define SCF_TIMER_VALUE_DSCP_CALLBACK 20 - /* DSCP INIT_REQ retry timer value (5ms) */ -#define SCF_TIMER_VALUE_DSCP_INIT 5000 - -/* - * Timer value convert macro - */ -#define SCF_MIL2MICRO(x) ((x) * 1000) -#define SCF_SEC2MICRO(x) ((x) * 1000000) - -/* - * External function - */ -extern void scf_timer_init(void); -extern void scf_timer_start(int); -extern void scf_timer_stop(int); -extern void scf_timer_all_stop(void); -extern int scf_timer_check(int); -extern uint32_t scf_timer_value_get(int); -extern void scf_tout(void *); -extern int scf_timer_stop_collect(timeout_id_t *tmids, int size); -extern void scf_timer_untimeout(timeout_id_t *tmids, int size); - -extern scf_timer_t scf_timer[SCF_TIMERCD_MAX]; - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFTIMER_H */
--- a/usr/src/uts/sun4u/opl/sys/scfd/scftrace.h Mon Nov 27 11:21:25 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,215 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 - */ - -#ifndef _SCFTRACE_H -#define _SCFTRACE_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/scfd/scfstate.h> - -#define TC_INFO_SIZE 8 - -/* SCF driver trace table */ -typedef struct scf_trctbl { - ushort_t line; /* sorce kine No. */ - ushort_t tmvl; /* trace time (100ms) */ - ushort_t code; /* trace code */ - ushort_t size; /* info size */ - uchar_t info[TC_INFO_SIZE]; /* detail info */ -} scf_trctbl_t; - -#define TC_NRM_CNT 1920 /* normal trace entry count */ -#define TC_ERR_CNT 128 /* error trace entry count */ - -#define SCF_DBGFLAG_REG 0x00000001 - -#define SCF_DBGFLAG_IOCTL 0x00000010 -#define SCF_DBGFLAG_SYS 0x00000020 -#define SCF_DBGFLAG_DSCP 0x00000040 -#define SCF_DBGFLAG_SRV 0x00000080 - -#define SCF_DBGFLAG_IOMP 0x00000100 -#define SCF_DBGFLAG_KSTAT 0x00000200 -#define SCF_DBGFLAG_FOCK 0x00000400 - -#define SCF_DBGFLAG_DDI 0x00001000 -#define SCF_DBGFLAG_OPCLS 0x00002000 -#define SCF_DBGFLAG_TIMER 0x00004000 - -#define SCF_DBGFLAG_SNAP 0x00010000 -#define SCF_DBGFLAG_TRACE 0x00020000 -#define SCF_DBGFLAG_DBG 0x00080000 - -#define SCF_DBGFLAG_ALL 0xffffffff - -/* - * trace code define - */ -#define TC_ERR 0x8000 -#define TC_ERRCD 0x4000 -#define TC_MSG 0x2000 -#define TC_R_REG 0x1000 -#define TC_W_REG 0x0800 -#define TC_R_CONTROL (TC_R_REG | 0x0001) -#define TC_R_INT_ST (TC_R_REG | 0x0002) -#define TC_R_COMMAND (TC_R_REG | 0x0011) -#define TC_R_COMMAND_ExR (TC_R_REG | 0x0012) -#define TC_R_STATUS (TC_R_REG | 0x0013) -#define TC_R_STATUS_ExR (TC_R_REG | 0x0014) -#define TC_R_TDATA0 (TC_R_REG | 0x0020) -#define TC_R_TDATA1 (TC_R_REG | 0x0021) -#define TC_R_TDATA2 (TC_R_REG | 0x0022) -#define TC_R_TDATA3 (TC_R_REG | 0x0023) -#define TC_R_RDATA0 (TC_R_REG | 0x0030) -#define TC_R_RDATA1 (TC_R_REG | 0x0031) -#define TC_R_RDATA2 (TC_R_REG | 0x0032) -#define TC_R_RDATA3 (TC_R_REG | 0x0033) -#define TC_R_ACR (TC_R_REG | 0x0040) -#define TC_R_ATR (TC_R_REG | 0x0041) -#define TC_R_DCR (TC_R_REG | 0x0050) -#define TC_R_DSR (TC_R_REG | 0x0051) -#define TC_R_TxDCR_C_FLAG (TC_R_REG | 0x0052) -#define TC_R_TxDCR_OFFSET (TC_R_REG | 0x0053) -#define TC_R_TxDCR_LENGTH (TC_R_REG | 0x0054) -#define TC_R_TxDSR_C_FLAG (TC_R_REG | 0x0055) -#define TC_R_TxDSR_OFFSET (TC_R_REG | 0x0056) -#define TC_R_RxDCR_C_FLAG (TC_R_REG | 0x0057) -#define TC_R_RxDCR_OFFSET (TC_R_REG | 0x0058) -#define TC_R_RxDCR_LENGTH (TC_R_REG | 0x0059) -#define TC_R_RxDSR_C_FLAG (TC_R_REG | 0x005a) -#define TC_R_RxDSR_OFFSET (TC_R_REG | 0x005b) - -#define TC_W_CONTROL (TC_W_REG | 0x0001) -#define TC_W_INT_ST (TC_W_REG | 0x0002) -#define TC_W_COMMAND (TC_W_REG | 0x0011) -#define TC_W_COMMAND_ExR (TC_W_REG | 0x0012) -#define TC_W_STATUS (TC_W_REG | 0x0013) -#define TC_W_STATUS_ExR (TC_W_REG | 0x0014) -#define TC_W_TDATA0 (TC_W_REG | 0x0020) -#define TC_W_TDATA1 (TC_W_REG | 0x0021) -#define TC_W_TDATA2 (TC_W_REG | 0x0022) -#define TC_W_TDATA3 (TC_W_REG | 0x0023) -#define TC_W_RDATA0 (TC_W_REG | 0x0030) -#define TC_W_RDATA1 (TC_W_REG | 0x0031) -#define TC_W_RDATA2 (TC_W_REG | 0x0032) -#define TC_W_RDATA3 (TC_W_REG | 0x0033) -#define TC_W_ACR (TC_W_REG | 0x0040) -#define TC_W_ATR (TC_W_REG | 0x0041) -#define TC_W_DCR (TC_W_REG | 0x0050) -#define TC_W_DSR (TC_W_REG | 0x0051) -#define TC_W_TxDCR_C_FLAG (TC_W_REG | 0x0052) -#define TC_W_TxDCR_OFFSET (TC_W_REG | 0x0053) -#define TC_W_TxDCR_LENGTH (TC_W_REG | 0x0054) -#define TC_W_TxDSR_C_FLAG (TC_W_REG | 0x0055) -#define TC_W_TxDSR_OFFSET (TC_W_REG | 0x0056) -#define TC_W_RxDCR_C_FLAG (TC_W_REG | 0x0057) -#define TC_W_RxDCR_OFFSET (TC_W_REG | 0x0058) -#define TC_W_RxDCR_LENGTH (TC_W_REG | 0x0059) -#define TC_W_RxDSR_C_FLAG (TC_W_REG | 0x005a) -#define TC_W_RxDSR_OFFSET (TC_W_REG | 0x005b) - -#define TC_TIMER 0x0400 -#define TC_T_TOUT (TC_TIMER | 0x0001) -#define TC_T_START (TC_TIMER | 0x0002) -#define TC_T_STOP (TC_TIMER | 0x0003) - -#define TC_OUT 0x0200 -#define TC_IN 0x0100 - -/* scfconf.c */ -#define TC_PROBE 0x0001 -#define TC_ATTACH 0x0002 -#define TC_DETACH 0x0003 -#define TC_GETINFO 0x0004 - -/* scfopt.c */ -#define TC_OPEN 0x0011 -#define TC_CLOSE 0x0012 -#define TC_IOCTL 0x0013 -#define TC_CHPOLL 0x0014 - -/* scfhandler.c */ -#define TC_INTR 0x0021 -#define TC_DSENS 0x0022 -#define TC_SHUTDOWN 0x0023 - -/* scfreg.c scfhandler.c */ -#define TC_SEND 0x0031 -#define TC_RSTS 0x0032 - -/* kernel function code */ -#define TC_SIGNAL 0x0041 -#define TC_W_SIG 0x0042 -#define TC_T_WAIT 0x0043 -#define TC_KILL 0x004f - -/* DSCP function code */ -#define TC_MB_INIT 0x0081 -#define TC_MB_FINI 0x0082 -#define TC_MB_PUTMSG 0x0083 -#define TC_MB_CANGET 0x0084 -#define TC_MB_GETMSG 0x0085 -#define TC_MB_FLUSH 0x0086 -#define TC_MB_CTRL 0x0087 -#define TC_MB_INTR 0x0088 -#define TC_MB_CALLBACK 0x0089 - -#define TC_TxREQ 0x00a1 -#define TC_RxACK 0x00a5 -#define TC_RxEND 0x00a6 -#define TC_RxREQ 0x00a4 -#define TC_TxACK 0x00a2 -#define TC_TxEND 0x00a3 - -/* OS to SCF function code */ -#define TC_S_PUTINFO 0x0091 -#define TC_S_GETINFO 0x0092 - -/* - * SCF driver trace flag - */ -extern ushort_t scf_trace_exec; /* 1:trace exec, 0:Trace no exec */ -extern ushort_t scf_trace_flag; - -/* - * SCF driver trace debug flag - */ -extern uint_t scf_trace_msg_flag; /* trace massege flag */ - -/* - * External function - */ -extern void scf_trace(ushort_t code, ushort_t line, - uchar_t *info, ushort_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* _SCFTRACE_H */