diff options
author | Garrett D'Amore <garrett@damore.org> | 2022-07-30 20:34:01 -0400 |
---|---|---|
committer | Garrett D'Amore <garrett@damore.org> | 2022-08-09 20:18:48 -0400 |
commit | cb1bb6c32d034ea24e8549ef763c9c2b79413eb8 (patch) | |
tree | 08cc5b3efdd6ac57c5621506246a9bb72a7f24c5 /usr/src | |
parent | e8754e84740733dd9f21c60b5a5ac47d32dacb6b (diff) | |
download | illumos-joyent-cb1bb6c32d034ea24e8549ef763c9c2b79413eb8.tar.gz |
14874 Remove the SSA socal/sf and ssd drivers
Reviewed by: Peter Tribble <peter.tribble@gmail.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Dan McDonald <danmcd@mnx.io>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/man/man4d/Makefile | 3 | ||||
-rw-r--r-- | usr/src/man/man4d/sf.4d | 265 | ||||
-rw-r--r-- | usr/src/man/man4d/socal.4d | 227 | ||||
-rw-r--r-- | usr/src/man/man4d/ssd.4d | 600 | ||||
-rw-r--r-- | usr/src/uts/common/io/scsi/targets/sd.c | 634 | ||||
-rw-r--r-- | usr/src/uts/common/sys/scsi/targets/sddef.h | 61 | ||||
-rw-r--r-- | usr/src/uts/sparc/Makefile.sparc | 2 | ||||
-rw-r--r-- | usr/src/uts/sparc/socal/Makefile | 92 | ||||
-rw-r--r-- | usr/src/uts/sparc/ssd/Makefile | 98 | ||||
-rw-r--r-- | usr/src/uts/sun/Makefile.files | 6 | ||||
-rw-r--r-- | usr/src/uts/sun/io/scsi/adapters/sf.c | 7237 | ||||
-rw-r--r-- | usr/src/uts/sun/io/scsi/adapters/sf.conf | 41 | ||||
-rw-r--r-- | usr/src/uts/sun/io/scsi/inc.flg | 1 | ||||
-rw-r--r-- | usr/src/uts/sun/io/scsi/targets/ssd.conf | 37 | ||||
-rw-r--r-- | usr/src/uts/sun/io/socal.c | 5056 | ||||
-rw-r--r-- | usr/src/uts/sun/io/socal_ucode.c | 16420 | ||||
-rw-r--r-- | usr/src/uts/sun4u/Makefile.sun4u | 1 | ||||
-rw-r--r-- | usr/src/uts/sun4u/sf/Makefile | 96 |
18 files changed, 2 insertions, 30875 deletions
diff --git a/usr/src/man/man4d/Makefile b/usr/src/man/man4d/Makefile index 9e86f330a7..f60dc389b7 100644 --- a/usr/src/man/man4d/Makefile +++ b/usr/src/man/man4d/Makefile @@ -170,10 +170,7 @@ sparc_MANFILES= audiocs.4d \ pcicmu.4d \ pcipsy.4d \ pcisch.4d \ - sf.4d \ smbus.4d \ - socal.4d \ - ssd.4d \ su.4d \ todopl.4d \ tsalarm.4d \ diff --git a/usr/src/man/man4d/sf.4d b/usr/src/man/man4d/sf.4d deleted file mode 100644 index ea76cec123..0000000000 --- a/usr/src/man/man4d/sf.4d +++ /dev/null @@ -1,265 +0,0 @@ -'\" te -.\" Copyright (c) 1997, Sun Microsystems, Inc. All Rights Reserved -.\" 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] -.TH SF 4D "Mar 27, 1997" -.SH NAME -sf \- SOC+ FC-AL FCP Driver -.SH SYNOPSIS -.LP -.nf -sf@\fIport\fR,0 -.fi - -.SH DESCRIPTION -.sp -.LP -The \fBsf\fR driver is a SCSA compliant nexus driver which supports the Fibre -Channel Protocol for SCSI on Private Fibre Channel Arbitrated loops. An SBus -card called the \fBSOC+\fR card (see \fBsocal\fR(4D)) connects the Fibre -Channel loop to the host system. -.sp -.LP -The \fBsf\fR driver interfaces with the \fBSOC+\fR device driver, -\fBsocal\fR(4D), the SCSI disk target driver, \fBssd\fR(4D), and the SCSI-3 -Enclosure Services driver, \fBses\fR(4D). It only supports SCSI devices of -type disk and ses. -.sp -.LP -The \fBsf\fR driver supports the standard functions provided by the SCSA -interface. The driver supports auto request sense and tagged queueing by -default. -.sp -.LP -The driver requires that all devices have unique hard addresses defined by -switch settings in hardware. Devices with conflicting hard addresses will not -be accessible. -.SH FILES -.sp -.ne 2 -.na -\fB/platform/\fIarchitecture\fR/kernel/drv/sf\fR -.ad -.sp .6 -.RS 4n -ELF kernel module -.RE - -.sp -.ne 2 -.na -\fB/platform/\fIarchitecture\fR/kernel/drv/sf.conf\fR -.ad -.sp .6 -.RS 4n -\fBsf\fR driver configuration file -.RE - -.SH ATTRIBUTES -.sp -.LP -See \fBattributes\fR(7) for descriptions of the following attributes: -.sp - -.sp -.TS -box; -c | c -l | l . -ATTRIBUTE TYPE ATTRIBUTE VALUE -_ -Architecture SPARC -.TE - -.SH SEE ALSO -.sp -.LP -.BR socal (4D), -.BR ssd (4D), -.BR driver.conf (5), -.BR luxadm (8), -.BR prtconf (8) -.sp -.LP -\fIWriting Device Drivers\fR -.sp -.LP -\fIANSI X3.272-1996, Fibre Channel Arbitrated Loop (FC-AL)\fR -.sp -.LP -\fIANSI X3.269-1996, Fibre Channel Protocol for SCSI (FCP)\fR -.sp -.LP -\fIANSI X3.270-1996, SCSI-3 Architecture Model (SAM)\fR -.sp -.LP -\fIFibre Channel Private Loop SCSI Direct Attach (FC-PLDA)\fR -.SH DIAGNOSTICS -.sp -.LP -In addition to being logged, the messages below may display on the system -console. -.sp -.LP -The first set of messages indicate that the attachment was unsuccessful, and -will only display while the \fBsf\fR driver is initially attempting to attach. -Each message is preceded by \fBsf\fR\fI%d\fR , where \fI%d\fR is the instance -number of the \fBsf\fR device. -.sp -.ne 2 -.na -\fBFailed to alloc soft state\fR -.ad -.sp .6 -.RS 4n -Driver was unable to allocate space for the internal state structure. Driver -did not attach to device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBBad soft state\fR -.ad -.sp .6 -.RS 4n -Driver requested an invalid internal state structure. Driver did not attach to -device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBFailed to obtain transport handle\fR -.ad -.sp .6 -.RS 4n -Driver was unable to obtain a transport handle to communicate with the socal -driver. Driver did not attach to device, SCSI devices will be inaccessible -.RE - -.sp -.ne 2 -.na -\fBFailed to allocate command/response pool\fR -.ad -.sp .6 -.RS 4n -Driver was unable to allocate space for commands and responses. Driver did not -attach to device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBFailed to allocate kmem cache\fR -.ad -.sp .6 -.RS 4n -Driver was unable to allocate space for the packet cache. Driver did not attach -to device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBFailed to allocate dma handle for\fR -.ad -.sp .6 -.RS 4n -Driver was unable to allocate a dma handle for the loop map. Driver did not -attach to device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBFailed to allocate lilp map\fR -.ad -.sp .6 -.RS 4n -Driver was unable to allocate space for the loop map. Driver did not attach to -device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBFailed to bind dma handle for\fR -.ad -.sp .6 -.RS 4n -Driver was unable to bind a dma handle for the loop map. Driver did not attach -to device, SCSI devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBFailed to attach\fR -.ad -.sp .6 -.RS 4n -Driver was unable to attach for some reason that may be printed. Driver did -not attach to device, SCSI devices will be inaccessible. -.RE - -.sp -.LP -The next set of messages may display at any time. The full device pathname, -followed by the shorter form described above, will precede the message. -.sp -.ne 2 -.na -\fBInvalid lilp map\fR -.ad -.sp .6 -.RS 4n -The driver did not obtain a valid lilp map from the socal driver. SCSI device -will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBTarget t, AL-PA x and hard\fR -.ad -.sp .6 -.RS 4n -The device with a switch setting t has an AL-PA x which does not match its hard -address y. The device will not be accessible. -.RE - -.sp -.ne 2 -.na -\fBDuplicate switch settings\fR -.ad -.sp .6 -.RS 4n -The driver detected devices with the same switch setting. All such devices will -be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBWWN changed on target t\fR -.ad -.sp .6 -.RS 4n -The World Wide Name (WWN) has changed on the device with switch setting t. -.RE - -.sp -.ne 2 -.na -\fBTarget t, unknown device type\fR -.ad -.sp .6 -.RS 4n -The driver does not know the device type reported by the device with switch -setting t. -.RE - diff --git a/usr/src/man/man4d/socal.4d b/usr/src/man/man4d/socal.4d deleted file mode 100644 index 8cb669d228..0000000000 --- a/usr/src/man/man4d/socal.4d +++ /dev/null @@ -1,227 +0,0 @@ -'\" te -.\" Copyright (c) 1997, Sun Microsystems, Inc. All Rights Reserved -.\" 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] -.TH SOCAL 4D "May 9, 1997" -.SH NAME -socal \- Serial Optical Controller for Fibre Channel Arbitrated Loop (SOC+) -device driver -.SH SYNOPSIS -.LP -.nf -\fBsocal@\fIsbus-slot\fR,0\fR -.fi - -.SH DESCRIPTION -.sp -.LP -The Fibre Channel Host Bus Adapter is an SBus card which implements two full -duplex Fibre Channel interfaces. Each Fibre Channel interface can connect to a -Fibre Channel Arbitrated Loop (FC-AL). -.sp -.LP -The \fBsocal\fR device driver is a nexus driver and implements portions of the -FC-2 and FC-4 layers of FC-AL. -.SH FILES -.sp -.ne 2 -.na -\fB\fB/kernel/drv/socal\fR\fR -.ad -.RS 21n -ELF Kernel Module -.RE - -.SH ATTRIBUTES -.sp -.LP -See \fBattributes\fR(7) for descriptions of the following attributes: -.sp - -.sp -.TS -box; -c | c -l | l . -ATTRIBUTE TYPE ATTRIBUTE VALUE -_ -Architecture SPARC -.TE - -.SH SEE ALSO -.sp -.LP -.BR sf (4D), -.BR ssd (4D), -.BR sbus (5) -.sp -.LP -\fIWriting Device Drivers\fR -.sp -.LP -\fIANSI X3.230-1994, Fibre Channel Physical and Signalling Interface (FC-PH)\fR -.sp -.LP -\fIANSI X3.272-1996, Fibre Channel Arbitrated Loop (FC-AL)\fR -.sp -.LP -\fIFibre Channel Private Loop SCSI Direct Attach (FC-PLDA)\fR -.SH DIAGNOSTICS -.sp -.LP -The messages described below may appear on system console in addition to being -logged. -.sp -.LP -On the console, these messages are preceded by: -.sp -.in +2 -.nf -\fBsocal\fR\fI%d\fR\fB: port \fR\fI%a\fR -.fi -.in -2 -.sp - -.sp -.LP -where \fI%d\fR is the instance number of the \fBsocal\fR controller and -\fI%a\fR is the port on the host adapter. -.sp -.ne 2 -.na -\fBFibre Channel Loop is ONLINE\fR -.ad -.sp .6 -.RS 4n -The Fibre Channel loop is now online. -.RE - -.sp -.ne 2 -.na -\fBFibre Channel Loop is OFFLINE\fR -.ad -.sp .6 -.RS 4n -The Fibre Channel loop is now offline. -.RE - -.sp -.ne 2 -.na -\fBattach failed: device in slave-only slot.\fR -.ad -.sp .6 -.RS 4n -Move soc+ card to another slot. -.RE - -.sp -.ne 2 -.na -\fBattach failed: bad soft state.\fR -.ad -.sp .6 -.RS 4n -Driver did not attach, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to alloc xport struct.\fR -.ad -.sp .6 -.RS 4n -Driver did not attach, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to map eeprom\fR -.ad -.sp .6 -.RS 4n -Driver was unable to map device memory; check for bad hardware. Driver did not -attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to map XRAM\fR -.ad -.sp .6 -.RS 4n -Driver was unable to map device memory; check for bad hardware. Driver did -not attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to map registers\fR -.ad -.sp .6 -.RS 4n -Driver was unable to map device registers; check for bad hardware. Driver did -not attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to access status register\fR -.ad -.sp .6 -.RS 4n -Driver was unable to map device registers; check for bad hardware. Driver did -not attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to install interrupt handler\fR -.ad -.sp .6 -.RS 4n -Driver was not able to add the interrupt routine to the kernel. Driver did -not attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to access host adapter XRAM\fR -.ad -.sp .6 -.RS 4n -Driver was unable to access device RAM; check for bad hardware. Driver did -not attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: unable to write host adapter XRAM\fR -.ad -.sp .6 -.RS 4n -Driver was unable to write device RAM; check for bad hardware. Driver did not -attach to device, devices will be inaccessible. -.RE - -.sp -.ne 2 -.na -\fBattach failed: read/write mismatch in XRAM\fR -.ad -.sp .6 -.RS 4n -Driver was unable to verify device RAM; check for bad hardware. Driver did -not attach to device, devices will be inaccessible. -.RE - diff --git a/usr/src/man/man4d/ssd.4d b/usr/src/man/man4d/ssd.4d deleted file mode 100644 index 4090a5ae4f..0000000000 --- a/usr/src/man/man4d/ssd.4d +++ /dev/null @@ -1,600 +0,0 @@ -'\" te -.\" Copyright (c) 2008, Sun Microsystems, Inc. All Rights Reserved -.\" 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] -.TH SSD 4D "September 12, 2020" -.SH NAME -ssd \- Fibre Channel Arbitrated Loop disk device driver -.SH SYNOPSIS -.nf -\fBssd@\fR\fIport\fR\fB,\fR\fItarget\fR\fB:\fR\fIpartition\fR -.fi - -.SH DESCRIPTION - The \fBssd\fR driver supports Fibre Channel disk devices. -.sp -.LP -The specific type of each disk is determined by the \fBSCSI\fR inquiry command -and reading the volume label stored on block 0 of the drive. The volume label -describes the disk geometry and partitioning; it must be present or the disk -cannot be mounted by the system. -.sp -.LP -The block-files access the disk using the system's normal buffering mechanism -and are read and written without regard to physical disk records. A "raw" -interface provides for direct transmission between the disk and the read or -write buffer. A single read or write call usually results in one I/O operation; -raw I/O is therefore more efficient when many bytes are transmitted. Block file -names are found in \fB/dev/dsk\fR; the names of the raw files are found in -\fB/dev/rdsk\fR. -.sp -.LP -I/O requests (such as \fBlseek\fR(2)) to the \fBSCSI\fR disk must have an -offset that is a multiple of 512 bytes (\fBDEV_BSIZE\fR), or the driver returns -an \fBEINVAL\fR error. If the transfer length is not a multiple of 512 bytes, -the transfer count is rounded up by the driver. -.sp -.LP -Partition 0 is normally used for the root file system on a disk, with partition -1 as a paging area (for example, \fBswap\fR). Partition 2 is used to back up -the entire disk. Partition 2 normally maps the entire disk and may also be used -as the mount point for secondary disks in the system. The rest of the disk is -normally partition 6. For the primary disk, the user file system is located -here. -.sp -.LP -The device has associated error statistics. These must include counters for -hard errors, soft errors and transport errors. Other data may be implemented as -required. -.SH DEVICE STATISTICS SUPPORT -The device maintains I/O statistics for the device and for partitions allocated -for that device. For each device/partition, the driver accumulates reads, -writes, bytes read, and bytes written. The driver also initiates hi-resolution -time stamps at queue entry and exit points to enable monitoring of residence -time and cumulative residence-length product for each queue. -.sp -.LP -Not all device drivers make per-partition IO statistics available for -reporting. \fBssd\fR and \fBsd\fR(4D) per-partition statistics are enabled by -default but may be disabled in their configuration files. -.SH IOCTLS -Refer to \fBdkio\fR(4I). -.SH ERRORS -.ne 2 -.na -\fB\fBEACCES\fR\fR -.ad -.RS 10n -Permission denied. -.RE - -.sp -.ne 2 -.na -\fB\fBEBUSY\fR\fR -.ad -.RS 10n -The partition was opened exclusively by another thread. -.RE - -.sp -.ne 2 -.na -\fB\fBEFAULT\fR\fR -.ad -.RS 10n -The argument was a bad address. -.RE - -.sp -.ne 2 -.na -\fB\fBEINVAL\fR\fR -.ad -.RS 10n -Invalid argument. -.RE - -.sp -.ne 2 -.na -\fB\fBEIO\fR\fR -.ad -.RS 10n -An I/O error occurred. -.RE - -.sp -.ne 2 -.na -\fB\fBENOTTY\fR\fR -.ad -.RS 10n -The device does not support the requested ioctl function. -.RE - -.sp -.ne 2 -.na -\fB\fBENXIO\fR\fR -.ad -.RS 10n -When returned during \fBopen\fR(2), this error indicates the device does not -exist. -.RE - -.sp -.ne 2 -.na -\fB\fBEROFS\fR\fR -.ad -.RS 10n -The device is a read-only device. -.RE - -.SH CONFIGURATION -You configure the \fBssd\fR driver by defining properties in the -\fBssd.conf\fR file. The \fBssd\fR driver supports the following properties: -.sp -.ne 2 -.na -\fB\fBenable-partition-kstats\fR\fR -.ad -.RS 27n -The default value is 1, which causes partition IO statistics to be maintained. -Set this value to zero to prevent the driver from recording partition -statistics. This slightly reduces the CPU overhead for IO, minimizes the amount -of \fBsar\fR(1) data collected and makes these statistics unavailable for -reporting by \fBiostat\fR(8) even though the \fB-p\fR/\fB-P\fR option is -specified. Regardless of this setting, disk IO statistics are always -maintained. -.RE - -.sp -.LP -In addition to the above properties, some device-specific tunables can be -configured in \fBssd.conf\fR using the 'ssd-config-list' global property. The -value of this property is a list of duplets. The formal syntax is: -.sp -.in +2 -.nf -ssd-config-list = <duplet> [, <duplet> ]* ; - -where - -<duplet>:= "<vid+pid>" , "<tunable-list>" - -and - -<tunable-list>:= <tunable> [, <tunable> ]*; -<tunable> = <name> : <value> - -The <vid+pid> is the string that is returned by the target device -on a SCSI inquiry command. - -The <tunable-list> contains one or more tunables to apply to -all target devices with the specified <vid+pid>. - -Each <tunable> is a <name> : <value> pair. Supported -tunable names are: - - delay-busy: when busy, nsecs of delay before retry. - - retries-timeout: retries to perform on an IO timeout. -.fi -.in -2 - -.SH EXAMPLES -.in +2 -.nf -The following is an example of a global ssd-config-list property: - - ssd-config-list = - "SUN T4", "delay-busy:600, retries-timeout:6", - "SUN StorEdge_3510", "retries-timeout:3"; -.fi -.in -2 - -.SH FILES -.ne 2 -.na -\fBssd.conf\fR -.ad -.RS 22n -Driver configuration file -.RE - -.sp -.ne 2 -.na -\fB/dev/dsk/c\fIn\fR\fBt\fR\fIn\fR\fBd\fR\fIn\fR\fBs\fR\fIn\fR\fR -.ad -.RS 22n -block files -.RE - -.sp -.ne 2 -.na -\fB/dev/rdsk/c\fIn\fR\fBt\fR\fIn\fR\fBd\fR\fIn\fR\fBs\fR\fIn\fR\fR -.ad -.RS 22n -raw files -.RE - -.sp -.ne 2 -.na -\fBc\fIn\fR\fR -.ad -.RS 22n -is the controller number on the system. -.RE - -.sp -.ne 2 -.na -\fBt\fIn\fR\fR -.ad -.RS 22n -7-bit disk loop identifier, such as switch setting -.RE - -.sp -.ne 2 -.na -\fBd\fIn\fR\fR -.ad -.RS 22n -SCSI lun \fIn\fR -.RE - -.sp -.ne 2 -.na -\fB\fBs\fR\fIn\fR\fR -.ad -.RS 22n -partition \fIn\fR (0-7) -.RE - -.SH SEE ALSO -.BR sar (1), -.BR ioctl (2), -.BR lseek (2), -.BR open (2), -.BR read (2), -.BR write (2), -.BR cdio (4I), -.BR dkio (4I), -.BR driver.conf (5), -.BR scsi (5), -.BR format (8), -.BR iostat (8) -.sp -.LP -\fIANSI Small Computer System Interface-2 (SCSI-2)\fR -.sp -.LP -\fIANSI X3.272-1996, Fibre Channel Arbitrated Loop (FC-AL)\fR -.sp -.LP -\fIFibre Channel - Private Loop SCSI Direct Attach (FC-PLDA)\fR -.SH DIAGNOSTICS -.in +2 -.nf -Error for command '<command name>' Error Level: Fatal Requested Block <n>, -Error Block: <m>, Sense Key: <sense key name>, Vendor '<vendor name>': -ASC = 0x<a> (<ASC name>), ASCQ = 0x<b>, FRU = 0x<c> -.fi -.in -2 -.sp - -.sp -.LP -The command indicated by <command name> failed. The Requested Block is the -block where the transfer started and the Error Block is the block that caused -the error. Sense Key, ASC, and ASCQ information is returned by the target in -response to a request sense command. -.sp -.in +2 -.nf -Check Condition on REQUEST SENSE -.fi -.in -2 -.sp - -.sp -.LP -A REQUEST SENSE command completed with a check condition. The original command -will be retried a number of times. -.sp -.in +2 -.nf -Label says <m> blocks Drive says <\fIn\fR> blocks -.fi -.in -2 -.sp - -.sp -.LP -There is a discrepancy between the label and what the drive returned on the -READ CAPACITY command. -.sp -.in +2 -.nf -Not enough sense information -.fi -.in -2 -.sp - -.sp -.LP -The request sense data was less than expected. -.sp -.in +2 -.nf -Request Sense couldn't get sense data -.fi -.in -2 -.sp - -.sp -.LP -The REQUEST SENSE command did not transfer any data. -.sp -.in +2 -.nf -Reservation Conflict -.fi -.in -2 -.sp - -.sp -.LP -The drive was reserved by another initiator. -.sp -.in +2 -.nf -SCSI transport failed: reason 'xxxx' : {retrying|giving up} -.fi -.in -2 -.sp - -.sp -.LP -The host adapter has failed to transport a command to the target for the -reason stated. The driver will either retry the command or, ultimately, give -up. -.sp -.in +2 -.nf -Unhandled Sense Key <\fIn\fR> -.fi -.in -2 -.sp - -.sp -.LP -The REQUEST SENSE data included an invalid sense key. -.sp -.in +2 -.nf -Unit not Ready. Additional sense code 0x<\fIn\fR> -.fi -.in -2 -.sp - -.sp -.LP -The drive is not ready. -.sp -.in +2 -.nf -corrupt label - bad geometry -.fi -.in -2 -.sp - -.sp -.LP -The disk label is corrupted. -.sp -.in +2 -.nf -corrupt label - label checksum failed -.fi -.in -2 -.sp - -.sp -.LP -The disk label is corrupted. -.sp -.in +2 -.nf -corrupt label - wrong magic number -.fi -.in -2 -.sp - -.sp -.LP -The disk label is corrupted. -.sp -.in +2 -.nf -device busy too long -.fi -.in -2 -.sp - -.sp -.LP -The drive returned busy during a number of retries. -.sp -.in +2 -.nf -disk not responding to selection -.fi -.in -2 -.sp - -.sp -.LP -The drive was probably powered down or died. -.sp -.in +2 -.nf -i/o to invalid geometry -.fi -.in -2 -.sp - -.sp -.LP -The geometry of the drive could not be established. -.sp -.in +2 -.nf -incomplete read/write - retrying/giving up -.fi -.in -2 -.sp - -.sp -.LP -There was a residue after the command completed normally. -.sp -.in +2 -.nf -logical unit not ready -.fi -.in -2 -.sp - -.sp -.LP -The drive is not ready. -.sp -.in +2 -.nf -no bp for disk label -.fi -.in -2 -.sp - -.sp -.LP -A bp with consistent memory could not be allocated. -.sp -.in +2 -.nf -no mem for property -.fi -.in -2 -.sp - -.sp -.LP -Free memory pool exhausted. -.sp -.in +2 -.nf -no memory for disk label -.fi -.in -2 -.sp - -.sp -.LP -Free memory pool exhausted. -.sp -.in +2 -.nf -no resources for dumping -.fi -.in -2 -.sp - -.sp -.LP -A packet could not be allocated during dumping. -.sp -.in +2 -.nf -offline -.fi -.in -2 -.sp - -.sp -.LP -Drive went offline; probably powered down. -.sp -.in +2 -.nf -requeue of command fails<\fIn\fR> -.fi -.in -2 -.sp - -.sp -.LP -Driver attempted to retry a command and experienced a transport error. -.sp -.in +2 -.nf -ssdrestart transport failed <\fIn\fR> -.fi -.in -2 -.sp - -.sp -.LP -Driver attempted to retry a command and experienced a transport error. -.sp -.in +2 -.nf -transfer length not modulo <\fIn\fR> -.fi -.in -2 -.sp - -.sp -.LP -Illegal request size. -.sp -.in +2 -.nf -transport rejected <\fIn\fR> -.fi -.in -2 -.sp - -.sp -.LP -Host adapter driver was unable to accept a command. -.sp -.in +2 -.nf -unable to read label -.fi -.in -2 -.sp - -.sp -.LP -Failure to read disk label. -.sp -.in +2 -.nf -unit does not respond to selection -.fi -.in -2 -.sp - -.sp -.LP -Drive went offline; probably powered down. diff --git a/usr/src/uts/common/io/scsi/targets/sd.c b/usr/src/uts/common/io/scsi/targets/sd.c index 1c02feb237..a759c735a3 100644 --- a/usr/src/uts/common/io/scsi/targets/sd.c +++ b/usr/src/uts/common/io/scsi/targets/sd.c @@ -58,15 +58,6 @@ #include <sys/aio_req.h> #include <sys/dkioc_free_util.h> -#ifdef __lock_lint -#define _LP64 -#define __amd64 -#endif - -#if (defined(__fibre)) -/* Note: is there a leadville version of the following? */ -#include <sys/fc4/fcal_linkapp.h> -#endif #include <sys/taskq.h> #include <sys/uuid.h> #include <sys/byteorder.h> @@ -84,11 +75,7 @@ /* * Loadable module info. */ -#if (defined(__fibre)) -#define SD_MODULE_NAME "SCSI SSA/FCAL Disk Driver" -#else /* !__fibre */ #define SD_MODULE_NAME "SCSI Disk Driver" -#endif /* !__fibre */ /* * Define the interconnect type, to allow the driver to distinguish @@ -109,20 +96,8 @@ * will result in the driver assuming parallel SCSI behaviors.) * * (see common/sys/scsi/impl/services.h) - * - * Note: For ssd semantics, don't use INTERCONNECT_FABRIC as the default - * since some FC HBAs may already support that, and there is some code in - * the driver that already looks for it. Using INTERCONNECT_FABRIC as the - * default would confuse that code, and besides things should work fine - * anyways if the FC HBA already reports INTERCONNECT_FABRIC for the - * "interconnect_type" property. - * */ -#if (defined(__fibre)) -#define SD_DEFAULT_INTERCONNECT_TYPE SD_INTERCONNECT_FIBRE -#else #define SD_DEFAULT_INTERCONNECT_TYPE SD_INTERCONNECT_PARALLEL -#endif /* * The name of the driver, established from the module name in _init. @@ -132,103 +107,13 @@ static char *sd_label = NULL; /* * Driver name is unfortunately prefixed on some driver.conf properties. */ -#if (defined(__fibre)) -#define sd_max_xfer_size ssd_max_xfer_size -#define sd_config_list ssd_config_list -static char *sd_max_xfer_size = "ssd_max_xfer_size"; -static char *sd_config_list = "ssd-config-list"; -#else static char *sd_max_xfer_size = "sd_max_xfer_size"; static char *sd_config_list = "sd-config-list"; -#endif /* * Driver global variables */ -#if (defined(__fibre)) -/* - * These #defines are to avoid namespace collisions that occur because this - * code is currently used to compile two separate driver modules: sd and ssd. - * All global variables need to be treated this way (even if declared static) - * in order to allow the debugger to resolve the names properly. - * It is anticipated that in the near future the ssd module will be obsoleted, - * at which time this namespace issue should go away. - */ -#define sd_state ssd_state -#define sd_io_time ssd_io_time -#define sd_failfast_enable ssd_failfast_enable -#define sd_ua_retry_count ssd_ua_retry_count -#define sd_report_pfa ssd_report_pfa -#define sd_max_throttle ssd_max_throttle -#define sd_min_throttle ssd_min_throttle -#define sd_rot_delay ssd_rot_delay - -#define sd_retry_on_reservation_conflict \ - ssd_retry_on_reservation_conflict -#define sd_reinstate_resv_delay ssd_reinstate_resv_delay -#define sd_resv_conflict_name ssd_resv_conflict_name - -#define sd_component_mask ssd_component_mask -#define sd_level_mask ssd_level_mask -#define sd_debug_un ssd_debug_un -#define sd_error_level ssd_error_level - -#define sd_xbuf_active_limit ssd_xbuf_active_limit -#define sd_xbuf_reserve_limit ssd_xbuf_reserve_limit - -#define sd_tr ssd_tr -#define sd_reset_throttle_timeout ssd_reset_throttle_timeout -#define sd_qfull_throttle_timeout ssd_qfull_throttle_timeout -#define sd_qfull_throttle_enable ssd_qfull_throttle_enable -#define sd_check_media_time ssd_check_media_time -#define sd_wait_cmds_complete ssd_wait_cmds_complete -#define sd_log_buf ssd_log_buf -#define sd_log_mutex ssd_log_mutex - -#define sd_disk_table ssd_disk_table -#define sd_disk_table_size ssd_disk_table_size -#define sd_sense_mutex ssd_sense_mutex -#define sd_cdbtab ssd_cdbtab - -#define sd_cb_ops ssd_cb_ops -#define sd_ops ssd_ops -#define sd_additional_codes ssd_additional_codes -#define sd_tgops ssd_tgops - -#define sd_minor_data ssd_minor_data -#define sd_minor_data_efi ssd_minor_data_efi - -#define sd_tq ssd_tq -#define sd_wmr_tq ssd_wmr_tq -#define sd_taskq_name ssd_taskq_name -#define sd_wmr_taskq_name ssd_wmr_taskq_name -#define sd_taskq_minalloc ssd_taskq_minalloc -#define sd_taskq_maxalloc ssd_taskq_maxalloc - -#define sd_dump_format_string ssd_dump_format_string - -#define sd_iostart_chain ssd_iostart_chain -#define sd_iodone_chain ssd_iodone_chain - -#define sd_pm_idletime ssd_pm_idletime - -#define sd_force_pm_supported ssd_force_pm_supported - -#define sd_dtype_optical_bind ssd_dtype_optical_bind - -#define sd_ssc_init ssd_ssc_init -#define sd_ssc_send ssd_ssc_send -#define sd_ssc_fini ssd_ssc_fini -#define sd_ssc_assessment ssd_ssc_assessment -#define sd_ssc_post ssd_ssc_post -#define sd_ssc_print ssd_ssc_print -#define sd_ssc_ereport_post ssd_ssc_ereport_post -#define sd_ssc_set_info ssd_ssc_set_info -#define sd_ssc_extract_info ssd_ssc_extract_info - -#endif - #ifdef SDDEBUG int sd_force_pm_supported = 0; #endif /* SDDEBUG */ @@ -380,8 +265,6 @@ static int sd_pl2pc[] = { * Vendor specific data name property declarations */ -#if defined(__fibre) || defined(__x86) - static sd_tunables seagate_properties = { SEAGATE_THROTTLE_VALUE, 0, @@ -455,12 +338,6 @@ static sd_tunables pirus_properties = { PIRUS_LUN_RESET_ENABLED_FLAG }; -#endif - -#if (defined(__sparc) && !defined(__fibre)) || \ - (defined(__x86)) - - static sd_tunables elite_properties = { ELITE_THROTTLE_VALUE, 0, @@ -485,8 +362,6 @@ static sd_tunables st31200n_properties = { 0 }; -#endif /* Fibre or not */ - static sd_tunables lsi_properties_scsi = { LSI_THROTTLE_VALUE, 0, @@ -591,7 +466,6 @@ static sd_tunables tst_properties = { * made with an FC connection. The entries here are a legacy. */ static sd_disk_config_t sd_disk_table[] = { -#if defined(__fibre) || defined(__x86) { "SEAGATE ST34371FC", SD_CONF_BSET_THROTTLE, &seagate_properties }, { "SEAGATE ST19171FC", SD_CONF_BSET_THROTTLE, &seagate_properties }, { "SEAGATE ST39102FC", SD_CONF_BSET_THROTTLE, &seagate_properties }, @@ -712,9 +586,6 @@ static sd_disk_config_t sd_disk_table[] = { { "STK BladeCtlr", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties }, { "STK FLEXLINE", SD_CONF_BSET_NRR_COUNT, &lsi_oem_properties }, { "SYMBIOS", SD_CONF_BSET_NRR_COUNT, &symbios_properties }, -#endif /* fibre or NON-sparc platforms */ -#if ((defined(__sparc) && !defined(__fibre)) ||\ - (defined(__x86))) { "SEAGATE ST42400N", SD_CONF_BSET_THROTTLE, &elite_properties }, { "SEAGATE ST31200N", SD_CONF_BSET_THROTTLE, &st31200n_properties }, { "SEAGATE ST41600N", SD_CONF_BSET_TUR_CHECK, NULL }, @@ -731,7 +602,6 @@ static sd_disk_config_t sd_disk_table[] = { &symbios_properties }, { "LSI", SD_CONF_BSET_THROTTLE | SD_CONF_BSET_NRR_COUNT, &lsi_properties_scsi }, -#if defined(__x86) { " NEC CD-ROM DRIVE:260 ", (SD_CONF_BSET_PLAYMSF_BCD | SD_CONF_BSET_READSUB_BCD | SD_CONF_BSET_READ_TOC_ADDR_BCD @@ -743,8 +613,6 @@ static sd_disk_config_t sd_disk_table[] = { | SD_CONF_BSET_READ_TOC_ADDR_BCD | SD_CONF_BSET_NO_READ_HEADER | SD_CONF_BSET_READ_CD_XD4), NULL }, -#endif /* __x86 */ -#endif /* sparc NON-fibre or NON-sparc platforms */ #if (defined(SD_PROP_TST)) { "VENDOR PRODUCT ", (SD_CONF_BSET_THROTTLE @@ -827,294 +695,6 @@ static int sd_pm_idletime = 1; * Internal function prototypes */ -#if (defined(__fibre)) -/* - * These #defines are to avoid namespace collisions that occur because this - * code is currently used to compile two separate driver modules: sd and ssd. - * All function names need to be treated this way (even if declared static) - * in order to allow the debugger to resolve the names properly. - * It is anticipated that in the near future the ssd module will be obsoleted, - * at which time this ugliness should go away. - */ -#define sd_log_trace ssd_log_trace -#define sd_log_info ssd_log_info -#define sd_log_err ssd_log_err -#define sdprobe ssdprobe -#define sdinfo ssdinfo -#define sd_prop_op ssd_prop_op -#define sd_scsi_probe_cache_init ssd_scsi_probe_cache_init -#define sd_scsi_probe_cache_fini ssd_scsi_probe_cache_fini -#define sd_scsi_clear_probe_cache ssd_scsi_clear_probe_cache -#define sd_scsi_probe_with_cache ssd_scsi_probe_with_cache -#define sd_scsi_target_lun_init ssd_scsi_target_lun_init -#define sd_scsi_target_lun_fini ssd_scsi_target_lun_fini -#define sd_scsi_get_target_lun_count ssd_scsi_get_target_lun_count -#define sd_scsi_update_lun_on_target ssd_scsi_update_lun_on_target -#define sd_spin_up_unit ssd_spin_up_unit -#define sd_enable_descr_sense ssd_enable_descr_sense -#define sd_reenable_dsense_task ssd_reenable_dsense_task -#define sd_set_mmc_caps ssd_set_mmc_caps -#define sd_read_unit_properties ssd_read_unit_properties -#define sd_process_sdconf_file ssd_process_sdconf_file -#define sd_process_sdconf_table ssd_process_sdconf_table -#define sd_sdconf_id_match ssd_sdconf_id_match -#define sd_blank_cmp ssd_blank_cmp -#define sd_chk_vers1_data ssd_chk_vers1_data -#define sd_set_vers1_properties ssd_set_vers1_properties -#define sd_check_bdc_vpd ssd_check_bdc_vpd -#define sd_check_emulation_mode ssd_check_emulation_mode - -#define sd_get_physical_geometry ssd_get_physical_geometry -#define sd_get_virtual_geometry ssd_get_virtual_geometry -#define sd_update_block_info ssd_update_block_info -#define sd_register_devid ssd_register_devid -#define sd_get_devid ssd_get_devid -#define sd_create_devid ssd_create_devid -#define sd_write_deviceid ssd_write_deviceid -#define sd_check_vpd_page_support ssd_check_vpd_page_support -#define sd_setup_pm ssd_setup_pm -#define sd_create_pm_components ssd_create_pm_components -#define sd_ddi_suspend ssd_ddi_suspend -#define sd_ddi_resume ssd_ddi_resume -#define sd_pm_state_change ssd_pm_state_change -#define sdpower ssdpower -#define sdattach ssdattach -#define sddetach ssddetach -#define sd_unit_attach ssd_unit_attach -#define sd_unit_detach ssd_unit_detach -#define sd_set_unit_attributes ssd_set_unit_attributes -#define sd_create_errstats ssd_create_errstats -#define sd_set_errstats ssd_set_errstats -#define sd_set_pstats ssd_set_pstats -#define sddump ssddump -#define sd_scsi_poll ssd_scsi_poll -#define sd_send_polled_RQS ssd_send_polled_RQS -#define sd_ddi_scsi_poll ssd_ddi_scsi_poll -#define sd_init_event_callbacks ssd_init_event_callbacks -#define sd_event_callback ssd_event_callback -#define sd_cache_control ssd_cache_control -#define sd_get_write_cache_enabled ssd_get_write_cache_enabled -#define sd_get_write_cache_changeable ssd_get_write_cache_changeable -#define sd_get_nv_sup ssd_get_nv_sup -#define sd_make_device ssd_make_device -#define sdopen ssdopen -#define sdclose ssdclose -#define sd_ready_and_valid ssd_ready_and_valid -#define sdmin ssdmin -#define sdread ssdread -#define sdwrite ssdwrite -#define sdaread ssdaread -#define sdawrite ssdawrite -#define sdstrategy ssdstrategy -#define sdioctl ssdioctl -#define sd_mapblockaddr_iostart ssd_mapblockaddr_iostart -#define sd_mapblocksize_iostart ssd_mapblocksize_iostart -#define sd_checksum_iostart ssd_checksum_iostart -#define sd_checksum_uscsi_iostart ssd_checksum_uscsi_iostart -#define sd_pm_iostart ssd_pm_iostart -#define sd_core_iostart ssd_core_iostart -#define sd_mapblockaddr_iodone ssd_mapblockaddr_iodone -#define sd_mapblocksize_iodone ssd_mapblocksize_iodone -#define sd_checksum_iodone ssd_checksum_iodone -#define sd_checksum_uscsi_iodone ssd_checksum_uscsi_iodone -#define sd_pm_iodone ssd_pm_iodone -#define sd_initpkt_for_buf ssd_initpkt_for_buf -#define sd_destroypkt_for_buf ssd_destroypkt_for_buf -#define sd_setup_rw_pkt ssd_setup_rw_pkt -#define sd_setup_next_rw_pkt ssd_setup_next_rw_pkt -#define sd_buf_iodone ssd_buf_iodone -#define sd_uscsi_strategy ssd_uscsi_strategy -#define sd_initpkt_for_uscsi ssd_initpkt_for_uscsi -#define sd_destroypkt_for_uscsi ssd_destroypkt_for_uscsi -#define sd_uscsi_iodone ssd_uscsi_iodone -#define sd_xbuf_strategy ssd_xbuf_strategy -#define sd_xbuf_init ssd_xbuf_init -#define sd_pm_entry ssd_pm_entry -#define sd_pm_exit ssd_pm_exit - -#define sd_pm_idletimeout_handler ssd_pm_idletimeout_handler -#define sd_pm_timeout_handler ssd_pm_timeout_handler - -#define sd_add_buf_to_waitq ssd_add_buf_to_waitq -#define sdintr ssdintr -#define sd_start_cmds ssd_start_cmds -#define sd_send_scsi_cmd ssd_send_scsi_cmd -#define sd_bioclone_alloc ssd_bioclone_alloc -#define sd_bioclone_free ssd_bioclone_free -#define sd_shadow_buf_alloc ssd_shadow_buf_alloc -#define sd_shadow_buf_free ssd_shadow_buf_free -#define sd_print_transport_rejected_message \ - ssd_print_transport_rejected_message -#define sd_retry_command ssd_retry_command -#define sd_set_retry_bp ssd_set_retry_bp -#define sd_send_request_sense_command ssd_send_request_sense_command -#define sd_start_retry_command ssd_start_retry_command -#define sd_start_direct_priority_command \ - ssd_start_direct_priority_command -#define sd_return_failed_command ssd_return_failed_command -#define sd_return_failed_command_no_restart \ - ssd_return_failed_command_no_restart -#define sd_return_command ssd_return_command -#define sd_sync_with_callback ssd_sync_with_callback -#define sdrunout ssdrunout -#define sd_mark_rqs_busy ssd_mark_rqs_busy -#define sd_mark_rqs_idle ssd_mark_rqs_idle -#define sd_reduce_throttle ssd_reduce_throttle -#define sd_restore_throttle ssd_restore_throttle -#define sd_print_incomplete_msg ssd_print_incomplete_msg -#define sd_init_cdb_limits ssd_init_cdb_limits -#define sd_pkt_status_good ssd_pkt_status_good -#define sd_pkt_status_check_condition ssd_pkt_status_check_condition -#define sd_pkt_status_busy ssd_pkt_status_busy -#define sd_pkt_status_reservation_conflict \ - ssd_pkt_status_reservation_conflict -#define sd_pkt_status_qfull ssd_pkt_status_qfull -#define sd_handle_request_sense ssd_handle_request_sense -#define sd_handle_auto_request_sense ssd_handle_auto_request_sense -#define sd_print_sense_failed_msg ssd_print_sense_failed_msg -#define sd_validate_sense_data ssd_validate_sense_data -#define sd_decode_sense ssd_decode_sense -#define sd_print_sense_msg ssd_print_sense_msg -#define sd_sense_key_no_sense ssd_sense_key_no_sense -#define sd_sense_key_recoverable_error ssd_sense_key_recoverable_error -#define sd_sense_key_not_ready ssd_sense_key_not_ready -#define sd_sense_key_medium_or_hardware_error \ - ssd_sense_key_medium_or_hardware_error -#define sd_sense_key_illegal_request ssd_sense_key_illegal_request -#define sd_sense_key_unit_attention ssd_sense_key_unit_attention -#define sd_sense_key_fail_command ssd_sense_key_fail_command -#define sd_sense_key_blank_check ssd_sense_key_blank_check -#define sd_sense_key_aborted_command ssd_sense_key_aborted_command -#define sd_sense_key_default ssd_sense_key_default -#define sd_print_retry_msg ssd_print_retry_msg -#define sd_print_cmd_incomplete_msg ssd_print_cmd_incomplete_msg -#define sd_pkt_reason_cmd_incomplete ssd_pkt_reason_cmd_incomplete -#define sd_pkt_reason_cmd_tran_err ssd_pkt_reason_cmd_tran_err -#define sd_pkt_reason_cmd_reset ssd_pkt_reason_cmd_reset -#define sd_pkt_reason_cmd_aborted ssd_pkt_reason_cmd_aborted -#define sd_pkt_reason_cmd_timeout ssd_pkt_reason_cmd_timeout -#define sd_pkt_reason_cmd_unx_bus_free ssd_pkt_reason_cmd_unx_bus_free -#define sd_pkt_reason_cmd_tag_reject ssd_pkt_reason_cmd_tag_reject -#define sd_pkt_reason_default ssd_pkt_reason_default -#define sd_reset_target ssd_reset_target -#define sd_start_stop_unit_callback ssd_start_stop_unit_callback -#define sd_start_stop_unit_task ssd_start_stop_unit_task -#define sd_taskq_create ssd_taskq_create -#define sd_taskq_delete ssd_taskq_delete -#define sd_target_change_task ssd_target_change_task -#define sd_log_dev_status_event ssd_log_dev_status_event -#define sd_log_lun_expansion_event ssd_log_lun_expansion_event -#define sd_log_eject_request_event ssd_log_eject_request_event -#define sd_media_change_task ssd_media_change_task -#define sd_handle_mchange ssd_handle_mchange -#define sd_send_scsi_DOORLOCK ssd_send_scsi_DOORLOCK -#define sd_send_scsi_READ_CAPACITY ssd_send_scsi_READ_CAPACITY -#define sd_send_scsi_READ_CAPACITY_16 ssd_send_scsi_READ_CAPACITY_16 -#define sd_send_scsi_GET_CONFIGURATION ssd_send_scsi_GET_CONFIGURATION -#define sd_send_scsi_feature_GET_CONFIGURATION \ - sd_send_scsi_feature_GET_CONFIGURATION -#define sd_send_scsi_START_STOP_UNIT ssd_send_scsi_START_STOP_UNIT -#define sd_send_scsi_INQUIRY ssd_send_scsi_INQUIRY -#define sd_send_scsi_TEST_UNIT_READY ssd_send_scsi_TEST_UNIT_READY -#define sd_send_scsi_PERSISTENT_RESERVE_IN \ - ssd_send_scsi_PERSISTENT_RESERVE_IN -#define sd_send_scsi_PERSISTENT_RESERVE_OUT \ - ssd_send_scsi_PERSISTENT_RESERVE_OUT -#define sd_send_scsi_SYNCHRONIZE_CACHE ssd_send_scsi_SYNCHRONIZE_CACHE -#define sd_send_scsi_SYNCHRONIZE_CACHE_biodone \ - ssd_send_scsi_SYNCHRONIZE_CACHE_biodone -#define sd_send_scsi_MODE_SENSE ssd_send_scsi_MODE_SENSE -#define sd_send_scsi_MODE_SELECT ssd_send_scsi_MODE_SELECT -#define sd_send_scsi_RDWR ssd_send_scsi_RDWR -#define sd_send_scsi_LOG_SENSE ssd_send_scsi_LOG_SENSE -#define sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION \ - ssd_send_scsi_GET_EVENT_STATUS_NOTIFICATION -#define sd_gesn_media_data_valid ssd_gesn_media_data_valid -#define sd_alloc_rqs ssd_alloc_rqs -#define sd_free_rqs ssd_free_rqs -#define sd_dump_memory ssd_dump_memory -#define sd_get_media_info_com ssd_get_media_info_com -#define sd_get_media_info ssd_get_media_info -#define sd_get_media_info_ext ssd_get_media_info_ext -#define sd_dkio_ctrl_info ssd_dkio_ctrl_info -#define sd_nvpair_str_decode ssd_nvpair_str_decode -#define sd_set_properties ssd_set_properties -#define sd_get_tunables_from_conf ssd_get_tunables_from_conf -#define sd_setup_next_xfer ssd_setup_next_xfer -#define sd_dkio_get_temp ssd_dkio_get_temp -#define sd_check_mhd ssd_check_mhd -#define sd_mhd_watch_cb ssd_mhd_watch_cb -#define sd_mhd_watch_incomplete ssd_mhd_watch_incomplete -#define sd_sname ssd_sname -#define sd_mhd_resvd_recover ssd_mhd_resvd_recover -#define sd_resv_reclaim_thread ssd_resv_reclaim_thread -#define sd_take_ownership ssd_take_ownership -#define sd_reserve_release ssd_reserve_release -#define sd_rmv_resv_reclaim_req ssd_rmv_resv_reclaim_req -#define sd_mhd_reset_notify_cb ssd_mhd_reset_notify_cb -#define sd_persistent_reservation_in_read_keys \ - ssd_persistent_reservation_in_read_keys -#define sd_persistent_reservation_in_read_resv \ - ssd_persistent_reservation_in_read_resv -#define sd_mhdioc_takeown ssd_mhdioc_takeown -#define sd_mhdioc_failfast ssd_mhdioc_failfast -#define sd_mhdioc_release ssd_mhdioc_release -#define sd_mhdioc_register_devid ssd_mhdioc_register_devid -#define sd_mhdioc_inkeys ssd_mhdioc_inkeys -#define sd_mhdioc_inresv ssd_mhdioc_inresv -#define sr_change_blkmode ssr_change_blkmode -#define sr_change_speed ssr_change_speed -#define sr_atapi_change_speed ssr_atapi_change_speed -#define sr_pause_resume ssr_pause_resume -#define sr_play_msf ssr_play_msf -#define sr_play_trkind ssr_play_trkind -#define sr_read_all_subcodes ssr_read_all_subcodes -#define sr_read_subchannel ssr_read_subchannel -#define sr_read_tocentry ssr_read_tocentry -#define sr_read_tochdr ssr_read_tochdr -#define sr_read_cdda ssr_read_cdda -#define sr_read_cdxa ssr_read_cdxa -#define sr_read_mode1 ssr_read_mode1 -#define sr_read_mode2 ssr_read_mode2 -#define sr_read_cd_mode2 ssr_read_cd_mode2 -#define sr_sector_mode ssr_sector_mode -#define sr_eject ssr_eject -#define sr_ejected ssr_ejected -#define sr_check_wp ssr_check_wp -#define sd_watch_request_submit ssd_watch_request_submit -#define sd_check_media ssd_check_media -#define sd_media_watch_cb ssd_media_watch_cb -#define sd_delayed_cv_broadcast ssd_delayed_cv_broadcast -#define sr_volume_ctrl ssr_volume_ctrl -#define sr_read_sony_session_offset ssr_read_sony_session_offset -#define sd_log_page_supported ssd_log_page_supported -#define sd_check_for_writable_cd ssd_check_for_writable_cd -#define sd_wm_cache_constructor ssd_wm_cache_constructor -#define sd_wm_cache_destructor ssd_wm_cache_destructor -#define sd_range_lock ssd_range_lock -#define sd_get_range ssd_get_range -#define sd_free_inlist_wmap ssd_free_inlist_wmap -#define sd_range_unlock ssd_range_unlock -#define sd_read_modify_write_task ssd_read_modify_write_task -#define sddump_do_read_of_rmw ssddump_do_read_of_rmw - -#define sd_iostart_chain ssd_iostart_chain -#define sd_iodone_chain ssd_iodone_chain -#define sd_initpkt_map ssd_initpkt_map -#define sd_destroypkt_map ssd_destroypkt_map -#define sd_chain_type_map ssd_chain_type_map -#define sd_chain_index_map ssd_chain_index_map - -#define sd_failfast_flushctl ssd_failfast_flushctl -#define sd_failfast_flushq ssd_failfast_flushq -#define sd_failfast_flushq_callback ssd_failfast_flushq_callback - -#define sd_tg_rdwr ssd_tg_rdwr -#define sd_tg_getinfo ssd_tg_getinfo -#define sd_rmw_msg_print_handler ssd_rmw_msg_print_handler - -#endif /* #if (defined(__fibre)) */ - typedef struct unmap_param_hdr_s { uint16_t uph_data_len; uint16_t uph_descr_data_len; @@ -1206,10 +786,8 @@ static void sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, static int sd_send_scsi_cmd(dev_t dev, struct uscsi_cmd *incmd, int flag, enum uio_seg dataspace, int path_flag); -#ifdef _LP64 static void sd_enable_descr_sense(sd_ssc_t *ssc); static void sd_reenable_dsense_task(void *arg); -#endif /* _LP64 */ static void sd_set_mmc_caps(sd_ssc_t *ssc); @@ -1257,14 +835,6 @@ static int sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pkt); static int sd_send_polled_RQS(struct sd_lun *un); static int sd_ddi_scsi_poll(struct scsi_pkt *pkt); -#if (defined(__fibre)) -/* - * Event callbacks (photon) - */ -static void sd_init_event_callbacks(struct sd_lun *un); -static void sd_event_callback(dev_info_t *, ddi_eventcookie_t, void *, void *); -#endif - /* * Defines for sd_cache_control */ @@ -2672,10 +2242,6 @@ sdprobe(dev_info_t *devi) int rval; int instance = ddi_get_instance(devi); - /* - * if it wasn't for pln, sdprobe could actually be nulldev - * in the "__fibre" case. - */ if (ddi_dev_is_sid(devi) == DDI_SUCCESS) { return (DDI_PROBE_DONTCARE); } @@ -3226,7 +2792,6 @@ sd_spin_up_unit(sd_ssc_t *ssc) return (0); } -#ifdef _LP64 /* * Function: sd_enable_descr_sense * @@ -3351,7 +2916,6 @@ sd_reenable_dsense_task(void *arg) sd_enable_descr_sense(ssc); sd_ssc_fini(ssc); } -#endif /* _LP64 */ /* * Function: sd_set_mmc_caps @@ -6373,17 +5937,6 @@ sd_ddi_resume(dev_info_t *devi) scsi_watch_resume(un->un_swr_token); } -#if (defined(__fibre)) - if (un->un_f_is_fibre == TRUE) { - /* - * Add callbacks for insert and remove events - */ - if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) { - sd_init_event_callbacks(un); - } - } -#endif - /* * Transport any pending commands to the target. * @@ -7332,7 +6885,6 @@ sd_unit_attach(dev_info_t *devi) "sd_unit_attach: un:0x%p SD_INTERCONNECT_FABRIC\n", un); break; default: -#ifdef SD_DEFAULT_INTERCONNECT_TYPE /* * The HBA does not support the "interconnect-type" property * (or did not provide a recognized type). @@ -7356,17 +6908,6 @@ sd_unit_attach(dev_info_t *devi) "INTERCONNECT_PARALLEL\n", un); un->un_f_is_fibre = FALSE; } -#else - /* - * Note: This source will be implemented when a single fibre - * channel and parallel scsi driver is delivered. The default - * will be to assume that if a device does not support the - * "interconnect-type" property it is a parallel SCSI HBA and - * we will set the interconnect type for parallel scsi. - */ - un->un_interconnect_type = SD_INTERCONNECT_PARALLEL; - un->un_f_is_fibre = FALSE; -#endif break; } @@ -7402,11 +6943,7 @@ sd_unit_attach(dev_info_t *devi) * The value used is base on interconnect type. * fibre = 3, parallel = 5 */ -#if defined(__x86) un->un_retry_count = un->un_f_is_fibre ? 3 : 5; -#else - un->un_retry_count = SD_RETRY_COUNT; -#endif /* * Set the per disk retry count to the default number of retries @@ -7449,12 +6986,8 @@ sd_unit_attach(dev_info_t *devi) * get updated later in the attach, when setting up default wide * operations for disks. */ -#if defined(__x86) un->un_max_xfer_size = (uint_t)SD_DEFAULT_MAX_XFER_SIZE; un->un_partial_dma_supported = 1; -#else - un->un_max_xfer_size = (uint_t)maxphys; -#endif /* * Get "allow bus device reset" property (defaults to "enabled" if @@ -7931,7 +7464,6 @@ sd_unit_attach(dev_info_t *devi) switch (status) { case 0: { if (capacity > DK_MAX_BLOCKS) { -#ifdef _LP64 if ((capacity + 1) > SD_GROUP1_MAX_ADDRESS) { /* @@ -7942,26 +7474,6 @@ sd_unit_attach(dev_info_t *devi) */ sd_enable_descr_sense(ssc); } -#else - /* 32-bit kernels can't handle this */ - scsi_log(SD_DEVINFO(un), - sd_label, CE_WARN, - "disk has %llu blocks, which " - "is too large for a 32-bit " - "kernel", capacity); - -#if defined(__x86) - /* - * 1TB disk was treated as (1T - 512)B - * in the past, so that it might have - * valid VTOC and solaris partitions, - * we have to allow it to continue to - * work. - */ - if (capacity - 1 > DK_MAX_BLOCKS) -#endif - goto spinup_failed; -#endif } /* @@ -8189,22 +7701,6 @@ sd_unit_attach(dev_info_t *devi) } mutex_exit(SD_MUTEX(un)); -#if (defined(__fibre)) - /* - * Register callbacks for fibre only. You can't do this solely - * on the basis of the devid_type because this is hba specific. - * We need to query our hba capabilities to find out whether to - * register or not. - */ - if (un->un_f_is_fibre) { - if (strcmp(un->un_node_type, DDI_NT_BLOCK_CHAN)) { - sd_init_event_callbacks(un); - SD_TRACE(SD_LOG_ATTACH_DETACH, un, - "sd_unit_attach: un:0x%p event callbacks inserted", - un); - } - } -#endif if (un->un_f_opt_disable_cache == TRUE) { /* @@ -9179,107 +8675,6 @@ sd_set_pstats(struct sd_lun *un) } } - -#if (defined(__fibre)) -/* - * Function: sd_init_event_callbacks - * - * Description: This routine initializes the insertion and removal event - * callbacks. (fibre only) - * - * Arguments: un - driver soft state (unit) structure - * - * Context: Kernel thread context - */ - -static void -sd_init_event_callbacks(struct sd_lun *un) -{ - ASSERT(un != NULL); - - if ((un->un_insert_event == NULL) && - (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_INSERT_EVENT, - &un->un_insert_event) == DDI_SUCCESS)) { - /* - * Add the callback for an insertion event - */ - (void) ddi_add_event_handler(SD_DEVINFO(un), - un->un_insert_event, sd_event_callback, (void *)un, - &(un->un_insert_cb_id)); - } - - if ((un->un_remove_event == NULL) && - (ddi_get_eventcookie(SD_DEVINFO(un), FCAL_REMOVE_EVENT, - &un->un_remove_event) == DDI_SUCCESS)) { - /* - * Add the callback for a removal event - */ - (void) ddi_add_event_handler(SD_DEVINFO(un), - un->un_remove_event, sd_event_callback, (void *)un, - &(un->un_remove_cb_id)); - } -} - - -/* - * Function: sd_event_callback - * - * Description: This routine handles insert/remove events (photon). The - * state is changed to OFFLINE which can be used to supress - * error msgs. (fibre only) - * - * Arguments: un - driver soft state (unit) structure - * - * Context: Callout thread context - */ -/* ARGSUSED */ -static void -sd_event_callback(dev_info_t *dip, ddi_eventcookie_t event, void *arg, - void *bus_impldata) -{ - struct sd_lun *un = (struct sd_lun *)arg; - - _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_insert_event)); - if (event == un->un_insert_event) { - SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: insert event"); - mutex_enter(SD_MUTEX(un)); - if (un->un_state == SD_STATE_OFFLINE) { - if (un->un_last_state != SD_STATE_SUSPENDED) { - un->un_state = un->un_last_state; - } else { - /* - * We have gone through SUSPEND/RESUME while - * we were offline. Restore the last state - */ - un->un_state = un->un_save_state; - } - } - mutex_exit(SD_MUTEX(un)); - - _NOTE(DATA_READABLE_WITHOUT_LOCK(sd_lun::un_remove_event)); - } else if (event == un->un_remove_event) { - SD_TRACE(SD_LOG_COMMON, un, "sd_event_callback: remove event"); - mutex_enter(SD_MUTEX(un)); - /* - * We need to handle an event callback that occurs during - * the suspend operation, since we don't prevent it. - */ - if (un->un_state != SD_STATE_OFFLINE) { - if (un->un_state != SD_STATE_SUSPENDED) { - New_state(un, SD_STATE_OFFLINE); - } else { - un->un_last_state = SD_STATE_OFFLINE; - } - } - mutex_exit(SD_MUTEX(un)); - } else { - scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, - "!Unknown event\n"); - } - -} -#endif - /* * Values related to caching mode page depending on whether the unit is ATAPI. */ @@ -10352,13 +9747,9 @@ sdclose(dev_t dev, int flag, int otyp, cred_t *cred_p) * only issues a Sync Cache to DVD-RAM, a newly * supported device. */ -#if defined(__x86) if ((un->un_f_sync_cache_supported && un->un_f_sync_cache_required) || un->un_f_dvdram_writable_device == TRUE) { -#else - if (un->un_f_dvdram_writable_device == TRUE) { -#endif mutex_exit(SD_MUTEX(un)); if (sd_pm_entry(un) == DDI_SUCCESS) { rval = @@ -13433,12 +12824,10 @@ sd_init_cdb_limits(struct sd_lun *un) * performance using CDB_GROUP0 commands (where applicable). */ un->un_mincdb = SD_CDB_GROUP1; -#if !defined(__fibre) if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) && !un->un_f_has_removable_media) { un->un_mincdb = SD_CDB_GROUP0; } -#endif /* * Try to read the max-cdb-length supported by HBA. @@ -13462,16 +12851,10 @@ sd_init_cdb_limits(struct sd_lun *un) /* * Use CDB_GROUP5 commands for removable devices. Use CDB_GROUP4 - * commands for fixed disks unless we are building for a 32 bit - * kernel. + * commands for fixed disks. */ -#ifdef _LP64 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : min(hba_cdb_limit, SD_CDB_GROUP4); -#else - un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : - min(hba_cdb_limit, SD_CDB_GROUP1); -#endif un->un_status_len = (int)((un->un_f_arq_enabled == TRUE) ? sizeof (struct scsi_arq_status) : 1); @@ -17569,21 +16952,13 @@ sense_failed: * If the request sense failed (for whatever reason), attempt * to retry the original command. */ -#if defined(__x86) /* - * SD_RETRY_DELAY is conditionally compile (#if fibre) in - * sddef.h for Sparc platform, and x86 uses 1 binary - * for both SCSI/FC. * The SD_RETRY_DELAY value need to be adjusted here * when SD_RETRY_DELAY change in sddef.h */ sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_failed_msg, msgp, EIO, un->un_f_is_fibre ? drv_usectohz(100000) : (clock_t)0, NULL); -#else - sd_retry_command(un, bp, SD_RETRIES_STANDARD, - sd_print_sense_failed_msg, msgp, EIO, SD_RETRY_DELAY, NULL); -#endif return (SD_SENSE_DATA_IS_INVALID); } @@ -18366,7 +17741,6 @@ sd_sense_key_unit_attention(struct sd_lun *un, uint8_t *sense_datap, un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE); } -#ifdef _LP64 if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) { if (taskq_dispatch(sd_tq, sd_reenable_dsense_task, un, KM_NOSLEEP) == TASKQID_INVALID) { @@ -18381,7 +17755,6 @@ sd_sense_key_unit_attention(struct sd_lun *un, uint8_t *sense_datap, "sd_reenable_dsense_task\n"); } } -#endif /* _LP64 */ /* FALLTHRU */ case 0x28: /* NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED */ @@ -19076,7 +18449,6 @@ sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, } else { SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: " "ARQ,retrying request sense command\n"); -#if defined(__x86) /* * The SD_RETRY_DELAY value need to be adjusted here * when SD_RETRY_DELAY change in sddef.h @@ -19084,10 +18456,6 @@ sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO, un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0, NULL); -#else - sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, - EIO, SD_RETRY_DELAY, NULL); -#endif } SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n"); diff --git a/usr/src/uts/common/sys/scsi/targets/sddef.h b/usr/src/uts/common/sys/scsi/targets/sddef.h index afe9e61af5..d28918d9c5 100644 --- a/usr/src/uts/common/sys/scsi/targets/sddef.h +++ b/usr/src/uts/common/sys/scsi/targets/sddef.h @@ -1742,14 +1742,9 @@ struct sd_fm_internal { #define SD_RMW_MSG_PRINT_TIMEOUT (drv_usectohz((clock_t)10000000)) /* - * 100 msec. is what we'll wait for certain retries for fibre channel - * targets, 0 msec for parallel SCSI. + * 0 msec. is what we'll wait for certain retries. */ -#if defined(__fibre) -#define SD_RETRY_DELAY (drv_usectohz(100000)) -#else #define SD_RETRY_DELAY ((clock_t)0) -#endif /* * Number of times we'll retry a normal operation. @@ -1758,11 +1753,7 @@ struct sd_fm_internal { * (need to distinguish between Target and Transport failure) * */ -#if defined(__fibre) -#define SD_RETRY_COUNT 3 -#else #define SD_RETRY_COUNT 5 -#endif /* * Number of times we will retry for unit attention. @@ -1896,126 +1887,76 @@ struct sd_fm_internal { * Bit flag telling driver to set the controller type from sd.conf * sd-config-list and driver table. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_CTYPE 1 -#elif defined(__fibre) -#define SD_CONF_SET_CTYPE 5 -#else -#define SD_CONF_SET_CTYPE 1 -#endif #define SD_CONF_BSET_CTYPE (1 << SD_CONF_SET_CTYPE) /* * Bit flag telling driver to set the not ready retry count for a device from * sd.conf sd-config-list and driver table. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_NOTREADY_RETRIES 10 -#elif defined(__fibre) -#define SD_CONF_SET_NOTREADY_RETRIES 1 -#else -#define SD_CONF_SET_NOTREADY_RETRIES 2 -#endif #define SD_CONF_BSET_NRR_COUNT (1 << SD_CONF_SET_NOTREADY_RETRIES) /* * Bit flag telling driver to set SCSI status BUSY Retries from sd.conf * sd-config-list and driver table. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_BUSY_RETRIES 11 -#elif defined(__fibre) -#define SD_CONF_SET_BUSY_RETRIES 2 -#else -#define SD_CONF_SET_BUSY_RETRIES 5 -#endif #define SD_CONF_BSET_BSY_RETRY_COUNT (1 << SD_CONF_SET_BUSY_RETRIES) /* * Bit flag telling driver that device does not have a valid/unique serial * number. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_FAB_DEVID 2 -#else -#define SD_CONF_SET_FAB_DEVID 3 -#endif #define SD_CONF_BSET_FAB_DEVID (1 << SD_CONF_SET_FAB_DEVID) /* * Bit flag telling driver to disable all caching for disk device. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_NOCACHE 3 -#else -#define SD_CONF_SET_NOCACHE 4 -#endif #define SD_CONF_BSET_NOCACHE (1 << SD_CONF_SET_NOCACHE) /* * Bit flag telling driver that the PLAY AUDIO command requires parms in BCD * format rather than binary. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_PLAYMSF_BCD 4 -#else -#define SD_CONF_SET_PLAYMSF_BCD 6 -#endif #define SD_CONF_BSET_PLAYMSF_BCD (1 << SD_CONF_SET_PLAYMSF_BCD) /* * Bit flag telling driver that the response from the READ SUBCHANNEL command * has BCD fields rather than binary. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_READSUB_BCD 5 -#else -#define SD_CONF_SET_READSUB_BCD 7 -#endif #define SD_CONF_BSET_READSUB_BCD (1 << SD_CONF_SET_READSUB_BCD) /* * Bit in flags telling driver that the track number fields in the READ TOC * request and respone are in BCD rather than binary. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_READ_TOC_TRK_BCD 6 -#else -#define SD_CONF_SET_READ_TOC_TRK_BCD 8 -#endif #define SD_CONF_BSET_READ_TOC_TRK_BCD (1 << SD_CONF_SET_READ_TOC_TRK_BCD) /* * Bit flag telling driver that the address fields in the READ TOC request and * respone are in BCD rather than binary. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_READ_TOC_ADDR_BCD 7 -#else -#define SD_CONF_SET_READ_TOC_ADDR_BCD 9 -#endif #define SD_CONF_BSET_READ_TOC_ADDR_BCD (1 << SD_CONF_SET_READ_TOC_ADDR_BCD) /* * Bit flag telling the driver that the device doesn't support the READ HEADER * command. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_NO_READ_HEADER 8 -#else -#define SD_CONF_SET_NO_READ_HEADER 10 -#endif #define SD_CONF_BSET_NO_READ_HEADER (1 << SD_CONF_SET_NO_READ_HEADER) /* * Bit flag telling the driver that for the READ CD command the device uses * opcode 0xd4 rather than 0xbe. */ -#if defined(__i386) || defined(__amd64) #define SD_CONF_SET_READ_CD_XD4 9 -#else -#define SD_CONF_SET_READ_CD_XD4 11 -#endif #define SD_CONF_BSET_READ_CD_XD4 (1 << SD_CONF_SET_READ_CD_XD4) /* diff --git a/usr/src/uts/sparc/Makefile.sparc b/usr/src/uts/sparc/Makefile.sparc index 19dc78dea0..c39489216d 100644 --- a/usr/src/uts/sparc/Makefile.sparc +++ b/usr/src/uts/sparc/Makefile.sparc @@ -268,7 +268,6 @@ DRV_KMODS += yge DRV_KMODS += audiocs DRV_KMODS += bge dmfe eri fas hme qfe DRV_KMODS += openeepr options sd ses st -DRV_KMODS += ssd DRV_KMODS += ecpp # @@ -304,7 +303,6 @@ DRV_KMODS += pci_pci pcieb pcieb_bcm DRV_KMODS += i8042 kb8042 mouse8042 DRV_KMODS += fcode DRV_KMODS += mpt_sas -DRV_KMODS += socal DRV_KMODS += sgen DRV_KMODS += myri10ge DRV_KMODS += smp diff --git a/usr/src/uts/sparc/socal/Makefile b/usr/src/uts/sparc/socal/Makefile deleted file mode 100644 index 4eb95ff3a1..0000000000 --- a/usr/src/uts/sparc/socal/Makefile +++ /dev/null @@ -1,92 +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. -# - -# -# This makefile drives the production of the socal driver kernel -# module, which is used for the Photon/FC-AL product -# -# sparc architecture dependent -# - -# -# Path to the base of the uts directory tree (usually /usr/src/uts). -# -UTSBASE = ../.. - -# -# Define the module and object file sets. -# -MODULE = socal -OBJECTS = $(SOCAL_OBJS:%=$(OBJS_DIR)/%) -ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE) - -# -# Include common rules. -# -include $(UTSBASE)/sparc/Makefile.sparc - -# -# Define targets -# -ALL_TARGET = $(BINARY) -INSTALL_TARGET = $(BINARY) $(ROOTMODULE) - -# -# Overrides -# -CFLAGS += $(CCVERBOSE) -dalign - -# -# For now, disable these warnings; maintainers should endeavor -# to investigate and remove these for maximum coverage. -# Please do not carry these forward to new Makefiles. -# - -CERRWARN += $(CNOWARN_UNINIT) - -# -# Default build targets. -# -.KEEP_STATE: - -all: $(ALL_DEPS) - -def: $(DEF_DEPS) - -clean: $(CLEAN_DEPS) - -clobber: $(CLOBBER_DEPS) - -install: $(INSTALL_DEPS) - -# -# Include common targets. -# -include $(UTSBASE)/sparc/Makefile.targ - -browser: $(BINARY) - -browser := CFLAGS += -xsb diff --git a/usr/src/uts/sparc/ssd/Makefile b/usr/src/uts/sparc/ssd/Makefile deleted file mode 100644 index 6c564b6e05..0000000000 --- a/usr/src/uts/sparc/ssd/Makefile +++ /dev/null @@ -1,98 +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 -# -# -# uts/sparc/ssd/Makefile -# -# Copyright 2007 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# Copyright (c) 2011 Bayard G. Bell. All rights reserved. -# - -# -# This makefile drives the production of the ssd driver kernel module. -# -# sparc architecture dependent -# - -# -# Path to the base of the uts directory tree (usually /usr/src/uts). -# -UTSBASE = ../.. - -# -# Define the module and object file sets. -# -MODULE = ssd -OBJECTS = $(SSD_OBJS:%=$(OBJS_DIR)/%) -ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE) -CONF_SRCDIR = $(UTSBASE)/sun/io/scsi/targets - -# -# Include common rules. -# -include $(UTSBASE)/sparc/Makefile.sparc - -# -# Define targets -# -ALL_TARGET = $(BINARY) $(SRC_CONFILE) -INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE) - -CFLAGS += -D__fibre -dalign -WLCCFLAGS = -D__fibre - -# -# For now, disable these warnings; maintainers should endeavor -# to investigate and remove these for maximum coverage. -# Please do not carry these forward to new Makefiles. -# -CFLAGS += $(CCVERBOSE) -CERRWARN += -_gcc=-Wno-unused-function -CERRWARN += -_gcc=-Wno-unused-label -CERRWARN += -_gcc=-Wno-parentheses -CERRWARN += $(CNOWARN_UNINIT) -CERRWARN += -_gcc=-Wno-type-limits - -# -# Depends on scsi and cmlb -# fcp included for fibre support -# -LDFLAGS += -N misc/scsi -N misc/cmlb -N drv/fcp - -# -# Default build targets. -# -.KEEP_STATE: - -all: $(ALL_DEPS) - -def: $(DEF_DEPS) - -clean: $(CLEAN_DEPS) - -clobber: $(CLOBBER_DEPS) - -install: $(INSTALL_DEPS) - -# -# Include common targets. -# -include $(UTSBASE)/sparc/Makefile.targ diff --git a/usr/src/uts/sun/Makefile.files b/usr/src/uts/sun/Makefile.files index 0d626ddb71..f232b7354e 100644 --- a/usr/src/uts/sun/Makefile.files +++ b/usr/src/uts/sun/Makefile.files @@ -56,18 +56,12 @@ SBUSMEM_OBJS += sbusmem.o SD_OBJS += sd.o sd_xbuf.o -SF_OBJS += sf.o - -SOCAL_OBJS += socal.o socal_ucode.o - CMLB_OBJS += cmlb.o DADA_OBJS += dcd_hba.o dcd_transport.o \ dcd_control.o dcd_resource.o dcd_confsubr.o dcd_subr.o \ dcd_confdata.o -SSD_OBJS += sd.o sd_xbuf.o - WSDRV_OBJS += wsdrv.o ZS_OBJS += zs_async.o zs_common.o diff --git a/usr/src/uts/sun/io/scsi/adapters/sf.c b/usr/src/uts/sun/io/scsi/adapters/sf.c deleted file mode 100644 index df7989a634..0000000000 --- a/usr/src/uts/sun/io/scsi/adapters/sf.c +++ /dev/null @@ -1,7237 +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 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - * Copyright (c) 2011 Bayard G. Bell. All rights reserved. - * Copyright (c) 2016 by Delphix. All rights reserved. - */ - -/* - * sf - Solaris Fibre Channel driver - * - * This module implements some of the Fibre Channel FC-4 layer, converting - * from FC frames to SCSI and back. (Note: no sequence management is done - * here, though.) - */ - -#if defined(lint) && !defined(DEBUG) -#define DEBUG 1 -#endif - -/* - * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - * Need to use the ugly RAID LUN mappings in FCP Annex D - * to prevent SCSA from barfing. This *REALLY* needs to - * be addressed by the standards committee. - */ -#define RAID_LUNS 1 - -#ifdef DEBUG -static int sfdebug = 0; -#include <sys/debug.h> - -#define SF_DEBUG(level, args) \ - if (sfdebug >= (level)) sf_log args -#else -#define SF_DEBUG(level, args) -#endif - -static int sf_bus_config_debug = 0; - -#include <sys/scsi/scsi.h> -#include <sys/fc4/fcal.h> -#include <sys/fc4/fcp.h> -#include <sys/fc4/fcal_linkapp.h> -#include <sys/socal_cq_defs.h> -#include <sys/fc4/fcal_transport.h> -#include <sys/fc4/fcio.h> -#include <sys/scsi/adapters/sfvar.h> -#include <sys/scsi/impl/scsi_reset_notify.h> -#include <sys/stat.h> -#include <sys/varargs.h> -#include <sys/var.h> -#include <sys/thread.h> -#include <sys/proc.h> -#include <sys/kstat.h> -#include <sys/devctl.h> -#include <sys/scsi/targets/ses.h> -#include <sys/callb.h> -#include <sys/sysmacros.h> - -static int sf_info(dev_info_t *, ddi_info_cmd_t, void *, void **); -static int sf_attach(dev_info_t *, ddi_attach_cmd_t); -static int sf_detach(dev_info_t *, ddi_detach_cmd_t); -static void sf_softstate_unlink(struct sf *); -static int sf_scsi_bus_config(dev_info_t *parent, uint_t flag, - ddi_bus_config_op_t op, void *arg, dev_info_t **childp); -static int sf_scsi_bus_unconfig(dev_info_t *parent, uint_t flag, - ddi_bus_config_op_t op, void *arg); -static int sf_scsi_tgt_init(dev_info_t *, dev_info_t *, - scsi_hba_tran_t *, struct scsi_device *); -static void sf_scsi_tgt_free(dev_info_t *, dev_info_t *, - scsi_hba_tran_t *, struct scsi_device *); -static int sf_pkt_alloc_extern(struct sf *, struct sf_pkt *, - int, int, int); -static void sf_pkt_destroy_extern(struct sf *, struct sf_pkt *); -static struct scsi_pkt *sf_scsi_init_pkt(struct scsi_address *, - struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(), caddr_t); -static void sf_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *); -static void sf_scsi_dmafree(struct scsi_address *, struct scsi_pkt *); -static void sf_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *); -static int sf_scsi_reset_notify(struct scsi_address *, int, - void (*)(caddr_t), caddr_t); -static int sf_scsi_get_name(struct scsi_device *, char *, int); -static int sf_scsi_get_bus_addr(struct scsi_device *, char *, int); -static int sf_add_cr_pool(struct sf *); -static int sf_cr_alloc(struct sf *, struct sf_pkt *, int (*)()); -static void sf_cr_free(struct sf_cr_pool *, struct sf_pkt *); -static void sf_crpool_free(struct sf *); -static int sf_kmem_cache_constructor(void *, void *, int); -static void sf_kmem_cache_destructor(void *, void *); -static void sf_statec_callback(void *, int); -static int sf_login(struct sf *, uchar_t, uchar_t, uint_t, int); -static int sf_els_transport(struct sf *, struct sf_els_hdr *); -static void sf_els_callback(struct fcal_packet *); -static int sf_do_prli(struct sf *, struct sf_els_hdr *, struct la_els_logi *); -static int sf_do_adisc(struct sf *, struct sf_els_hdr *); -static int sf_do_reportlun(struct sf *, struct sf_els_hdr *, - struct sf_target *); -static void sf_reportlun_callback(struct fcal_packet *); -static int sf_do_inquiry(struct sf *, struct sf_els_hdr *, - struct sf_target *); -static void sf_inq_callback(struct fcal_packet *); -static struct fcal_packet *sf_els_alloc(struct sf *, uchar_t, int, int, - int, caddr_t *, caddr_t *); -static void sf_els_free(struct fcal_packet *); -static struct sf_target *sf_create_target(struct sf *, - struct sf_els_hdr *, int, int64_t); -#ifdef RAID_LUNS -static struct sf_target *sf_lookup_target(struct sf *, uchar_t *, int); -#else -static struct sf_target *sf_lookup_target(struct sf *, uchar_t *, int64_t); -#endif -static void sf_finish_init(struct sf *, int); -static void sf_offline_target(struct sf *, struct sf_target *); -static void sf_create_devinfo(struct sf *, struct sf_target *, int); -static int sf_create_props(dev_info_t *, struct sf_target *, int); -static int sf_commoncap(struct scsi_address *, char *, int, int, int); -static int sf_getcap(struct scsi_address *, char *, int); -static int sf_setcap(struct scsi_address *, char *, int, int); -static int sf_abort(struct scsi_address *, struct scsi_pkt *); -static int sf_reset(struct scsi_address *, int); -static void sf_abort_all(struct sf *, struct sf_target *, int, int, int); -static int sf_start(struct scsi_address *, struct scsi_pkt *); -static int sf_start_internal(struct sf *, struct sf_pkt *); -static void sf_fill_ids(struct sf *, struct sf_pkt *, struct sf_target *); -static int sf_prepare_pkt(struct sf *, struct sf_pkt *, struct sf_target *); -static int sf_dopoll(struct sf *, struct sf_pkt *); -static void sf_cmd_callback(struct fcal_packet *); -static void sf_throttle(struct sf *); -static void sf_watch(void *); -static void sf_throttle_start(struct sf *); -static void sf_check_targets(struct sf *); -static void sf_check_reset_delay(void *); -static int sf_target_timeout(struct sf *, struct sf_pkt *); -static void sf_force_lip(struct sf *); -static void sf_unsol_els_callback(void *, soc_response_t *, caddr_t); -static struct sf_els_hdr *sf_els_timeout(struct sf *, struct sf_els_hdr *); -/*PRINTFLIKE3*/ -static void sf_log(struct sf *, int, const char *, ...); -static int sf_kstat_update(kstat_t *, int); -static int sf_open(dev_t *, int, int, cred_t *); -static int sf_close(dev_t, int, int, cred_t *); -static int sf_ioctl(dev_t, int, intptr_t, int, cred_t *, int *); -static struct sf_target *sf_get_target_from_dip(struct sf *, dev_info_t *); -static int sf_bus_get_eventcookie(dev_info_t *, dev_info_t *, char *, - ddi_eventcookie_t *); -static int sf_bus_add_eventcall(dev_info_t *, dev_info_t *, - ddi_eventcookie_t, void (*)(), void *, ddi_callback_id_t *cb_id); -static int sf_bus_remove_eventcall(dev_info_t *devi, ddi_callback_id_t cb_id); -static int sf_bus_post_event(dev_info_t *, dev_info_t *, - ddi_eventcookie_t, void *); - -static void sf_hp_daemon(void *); - -/* - * this is required to be able to supply a control node - * where ioctls can be executed - */ -struct cb_ops sf_cb_ops = { - sf_open, /* open */ - sf_close, /* close */ - nodev, /* strategy */ - nodev, /* print */ - nodev, /* dump */ - nodev, /* read */ - nodev, /* write */ - sf_ioctl, /* ioctl */ - nodev, /* devmap */ - nodev, /* mmap */ - nodev, /* segmap */ - nochpoll, /* poll */ - ddi_prop_op, /* cb_prop_op */ - 0, /* streamtab */ - D_MP | D_NEW | D_HOTPLUG /* driver flags */ - -}; - -/* - * autoconfiguration routines. - */ -static struct dev_ops sf_ops = { - DEVO_REV, /* devo_rev, */ - 0, /* refcnt */ - sf_info, /* info */ - nulldev, /* identify */ - nulldev, /* probe */ - sf_attach, /* attach */ - sf_detach, /* detach */ - nodev, /* reset */ - &sf_cb_ops, /* driver operations */ - NULL, /* bus operations */ - NULL, /* power management */ - ddi_quiesce_not_supported, /* devo_quiesce */ -}; - -#define SF_NAME "FC-AL FCP Nexus Driver" /* Name of the module. */ -static char sf_version[] = "1.72 08/19/2008"; /* version of the module */ - -static struct modldrv modldrv = { - &mod_driverops, /* Type of module. This one is a driver */ - SF_NAME, - &sf_ops, /* driver ops */ -}; - -static struct modlinkage modlinkage = { - MODREV_1, (void *)&modldrv, NULL -}; - -/* XXXXXX The following is here to handle broken targets -- remove it later */ -static int sf_reportlun_forever = 0; -/* XXXXXX */ -static int sf_lip_on_plogo = 0; -static int sf_els_retries = SF_ELS_RETRIES; -static struct sf *sf_head = NULL; -static int sf_target_scan_cnt = 4; -static int sf_pkt_scan_cnt = 5; -static int sf_pool_scan_cnt = 1800; -static void *sf_state = NULL; -static int sf_watchdog_init = 0; -static int sf_watchdog_time = 0; -static int sf_watchdog_timeout = 1; -static int sf_watchdog_tick; -static int sf_watch_running = 0; -static timeout_id_t sf_watchdog_id; -static timeout_id_t sf_reset_timeout_id; -static int sf_max_targets = SF_MAX_TARGETS; -static kmutex_t sf_global_mutex; -static int sf_core = 0; -int *sf_token = NULL; /* Must not be static or lint complains. */ -static kcondvar_t sf_watch_cv; -extern pri_t minclsyspri; -static ddi_eventcookie_t sf_insert_eid; -static ddi_eventcookie_t sf_remove_eid; - -static ndi_event_definition_t sf_event_defs[] = { -{ SF_EVENT_TAG_INSERT, FCAL_INSERT_EVENT, EPL_KERNEL, 0 }, -{ SF_EVENT_TAG_REMOVE, FCAL_REMOVE_EVENT, EPL_INTERRUPT, 0 } -}; - -#define SF_N_NDI_EVENTS \ - (sizeof (sf_event_defs) / sizeof (ndi_event_definition_t)) - -#ifdef DEBUG -static int sf_lip_flag = 1; /* bool: to allow LIPs */ -static int sf_reset_flag = 1; /* bool: to allow reset after LIP */ -static int sf_abort_flag = 0; /* bool: to do just one abort */ -#endif - -extern int64_t ddi_get_lbolt64(void); - -/* - * for converting between target number (switch) and hard address/AL_PA - */ -static uchar_t sf_switch_to_alpa[] = { - 0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda, 0xd9, 0xd6, - 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce, 0xcd, 0xcc, 0xcb, 0xca, - 0xc9, 0xc7, 0xc6, 0xc5, 0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, - 0xb4, 0xb3, 0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, - 0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b, 0x98, 0x97, - 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81, 0x80, 0x7c, 0x7a, 0x79, - 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, - 0x6a, 0x69, 0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56, - 0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, - 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c, 0x3a, 0x39, 0x36, 0x35, - 0x34, 0x33, 0x32, 0x31, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, - 0x27, 0x26, 0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17, - 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01 -}; - -static uchar_t sf_alpa_to_switch[] = { - 0x00, 0x7d, 0x7c, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x77, 0x76, 0x00, 0x00, 0x75, 0x00, 0x74, - 0x73, 0x72, 0x00, 0x00, 0x00, 0x71, 0x00, 0x70, 0x6f, 0x6e, - 0x00, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0x00, 0x00, 0x67, - 0x66, 0x65, 0x64, 0x63, 0x62, 0x00, 0x00, 0x61, 0x60, 0x00, - 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x5d, - 0x5c, 0x5b, 0x00, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55, 0x00, - 0x00, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0x00, 0x00, 0x4e, - 0x4d, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, - 0x00, 0x4a, 0x49, 0x48, 0x00, 0x47, 0x46, 0x45, 0x44, 0x43, - 0x42, 0x00, 0x00, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x00, - 0x00, 0x3b, 0x3a, 0x00, 0x39, 0x00, 0x00, 0x00, 0x38, 0x37, - 0x36, 0x00, 0x35, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x31, 0x30, 0x00, 0x00, 0x2f, 0x00, 0x2e, 0x2d, 0x2c, - 0x00, 0x00, 0x00, 0x2b, 0x00, 0x2a, 0x29, 0x28, 0x00, 0x27, - 0x26, 0x25, 0x24, 0x23, 0x22, 0x00, 0x00, 0x21, 0x20, 0x1f, - 0x1e, 0x1d, 0x1c, 0x00, 0x00, 0x1b, 0x1a, 0x00, 0x19, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x17, 0x16, 0x15, - 0x00, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x00, 0x00, 0x0e, - 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x00, 0x00, 0x08, 0x07, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x05, 0x04, 0x03, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -/* - * these macros call the proper transport-layer function given - * a particular transport - */ -#define soc_transport(a, b, c, d) (*a->fcal_ops->fcal_transport)(b, c, d) -#define soc_transport_poll(a, b, c, d)\ - (*a->fcal_ops->fcal_transport_poll)(b, c, d) -#define soc_get_lilp_map(a, b, c, d, e)\ - (*a->fcal_ops->fcal_lilp_map)(b, c, d, e) -#define soc_force_lip(a, b, c, d, e)\ - (*a->fcal_ops->fcal_force_lip)(b, c, d, e) -#define soc_abort(a, b, c, d, e)\ - (*a->fcal_ops->fcal_abort_cmd)(b, c, d, e) -#define soc_force_reset(a, b, c, d)\ - (*a->fcal_ops->fcal_force_reset)(b, c, d) -#define soc_add_ulp(a, b, c, d, e, f, g, h)\ - (*a->fcal_ops->fcal_add_ulp)(b, c, d, e, f, g, h) -#define soc_remove_ulp(a, b, c, d, e)\ - (*a->fcal_ops->fcal_remove_ulp)(b, c, d, e) -#define soc_take_core(a, b) (*a->fcal_ops->fcal_take_core)(b) - - -/* power management property defines (should be in a common include file?) */ -#define PM_HARDWARE_STATE_PROP "pm-hardware-state" -#define PM_NEEDS_SUSPEND_RESUME "needs-suspend-resume" - - -/* node properties */ -#define NODE_WWN_PROP "node-wwn" -#define PORT_WWN_PROP "port-wwn" -#define LIP_CNT_PROP "lip-count" -#define TARGET_PROP "target" -#define LUN_PROP "lun" - - -/* - * initialize this driver and install this module - */ -int -_init(void) -{ - int i; - - i = ddi_soft_state_init(&sf_state, sizeof (struct sf), - SF_INIT_ITEMS); - if (i != 0) - return (i); - - if ((i = scsi_hba_init(&modlinkage)) != 0) { - ddi_soft_state_fini(&sf_state); - return (i); - } - - mutex_init(&sf_global_mutex, NULL, MUTEX_DRIVER, NULL); - sf_watch_running = 0; - cv_init(&sf_watch_cv, NULL, CV_DRIVER, NULL); - - if ((i = mod_install(&modlinkage)) != 0) { - mutex_destroy(&sf_global_mutex); - cv_destroy(&sf_watch_cv); - scsi_hba_fini(&modlinkage); - ddi_soft_state_fini(&sf_state); - return (i); - } - - return (i); -} - - -/* - * remove this driver module from the system - */ -int -_fini(void) -{ - int i; - - if ((i = mod_remove(&modlinkage)) == 0) { - scsi_hba_fini(&modlinkage); - mutex_destroy(&sf_global_mutex); - cv_destroy(&sf_watch_cv); - ddi_soft_state_fini(&sf_state); - } - return (i); -} - - -int -_info(struct modinfo *modinfop) -{ - return (mod_info(&modlinkage, modinfop)); -} - -/* - * Given the device number return the devinfo pointer or instance - */ -/*ARGSUSED*/ -static int -sf_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) -{ - int instance = SF_MINOR2INST(getminor((dev_t)arg)); - struct sf *sf; - - switch (infocmd) { - case DDI_INFO_DEVT2DEVINFO: - sf = ddi_get_soft_state(sf_state, instance); - if (sf != NULL) - *result = sf->sf_dip; - else { - *result = NULL; - return (DDI_FAILURE); - } - break; - - case DDI_INFO_DEVT2INSTANCE: - *result = (void *)(uintptr_t)instance; - break; - default: - return (DDI_FAILURE); - } - return (DDI_SUCCESS); -} - -/* - * either attach or resume this driver - */ -static int -sf_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) -{ - int instance; - int mutex_initted = FALSE; - uint_t ccount; - size_t i, real_size; - struct fcal_transport *handle; - char buf[64]; - struct sf *sf, *tsf; - scsi_hba_tran_t *tran = NULL; - int handle_bound = FALSE; - kthread_t *tp; - - - switch ((int)cmd) { - - case DDI_RESUME: - - /* - * we've previously been SF_STATE_OFFLINEd by a DDI_SUSPEND, - * so time to undo that and get going again by forcing a - * lip - */ - - instance = ddi_get_instance(dip); - - sf = ddi_get_soft_state(sf_state, instance); - SF_DEBUG(2, (sf, CE_CONT, - "sf_attach: DDI_RESUME for sf%d\n", instance)); - if (sf == NULL) { - cmn_err(CE_WARN, "sf%d: bad soft state", instance); - return (DDI_FAILURE); - } - - /* - * clear suspended flag so that normal operations can resume - */ - mutex_enter(&sf->sf_mutex); - sf->sf_state &= ~SF_STATE_SUSPENDED; - mutex_exit(&sf->sf_mutex); - - /* - * force a login by setting our state to offline - */ - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - sf->sf_state = SF_STATE_OFFLINE; - - /* - * call transport routine to register state change and - * ELS callback routines (to register us as a ULP) - */ - soc_add_ulp(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, TYPE_SCSI_FCP, - sf_statec_callback, sf_unsol_els_callback, NULL, sf); - - /* - * call transport routine to force loop initialization - */ - (void) soc_force_lip(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, 0, FCAL_NO_LIP); - - /* - * increment watchdog init flag, setting watchdog timeout - * if we are the first (since somebody has to do it) - */ - mutex_enter(&sf_global_mutex); - if (!sf_watchdog_init++) { - mutex_exit(&sf_global_mutex); - sf_watchdog_id = timeout(sf_watch, - (caddr_t)0, sf_watchdog_tick); - } else { - mutex_exit(&sf_global_mutex); - } - - return (DDI_SUCCESS); - - case DDI_ATTACH: - - /* - * this instance attaching for the first time - */ - - instance = ddi_get_instance(dip); - - if (ddi_soft_state_zalloc(sf_state, instance) != - DDI_SUCCESS) { - cmn_err(CE_WARN, "sf%d: failed to allocate soft state", - instance); - return (DDI_FAILURE); - } - - sf = ddi_get_soft_state(sf_state, instance); - SF_DEBUG(4, (sf, CE_CONT, - "sf_attach: DDI_ATTACH for sf%d\n", instance)); - if (sf == NULL) { - /* this shouldn't happen since we just allocated it */ - cmn_err(CE_WARN, "sf%d: bad soft state", instance); - return (DDI_FAILURE); - } - - /* - * from this point on, if there's an error, we must de-allocate - * soft state before returning DDI_FAILURE - */ - - if ((handle = ddi_get_parent_data(dip)) == NULL) { - cmn_err(CE_WARN, - "sf%d: failed to obtain transport handle", - instance); - goto fail; - } - - /* fill in our soft state structure */ - sf->sf_dip = dip; - sf->sf_state = SF_STATE_INIT; - sf->sf_throttle = handle->fcal_cmdmax; - sf->sf_sochandle = handle; - sf->sf_socp = handle->fcal_handle; - sf->sf_check_n_close = 0; - - /* create a command/response buffer pool for this instance */ - if (sf_add_cr_pool(sf) != DDI_SUCCESS) { - cmn_err(CE_WARN, - "sf%d: failed to allocate command/response pool", - instance); - goto fail; - } - - /* create a a cache for this instance */ - (void) sprintf(buf, "sf%d_cache", instance); - sf->sf_pkt_cache = kmem_cache_create(buf, - sizeof (fcal_packet_t) + sizeof (struct sf_pkt) + - scsi_pkt_size(), 8, - sf_kmem_cache_constructor, sf_kmem_cache_destructor, - NULL, NULL, NULL, 0); - if (sf->sf_pkt_cache == NULL) { - cmn_err(CE_WARN, "sf%d: failed to allocate kmem cache", - instance); - goto fail; - } - - /* set up a handle and allocate memory for DMA */ - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle-> - fcal_dmaattr, DDI_DMA_DONTWAIT, NULL, &sf-> - sf_lilp_dmahandle) != DDI_SUCCESS) { - cmn_err(CE_WARN, - "sf%d: failed to allocate dma handle for lilp map", - instance); - goto fail; - } - i = sizeof (struct fcal_lilp_map) + 1; - if (ddi_dma_mem_alloc(sf->sf_lilp_dmahandle, - i, sf->sf_sochandle-> - fcal_accattr, DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&sf->sf_lilp_map, &real_size, - &sf->sf_lilp_acchandle) != DDI_SUCCESS) { - cmn_err(CE_WARN, "sf%d: failed to allocate lilp map", - instance); - goto fail; - } - if (real_size < i) { - /* no error message ??? */ - goto fail; /* trouble allocating memory */ - } - - /* - * set up the address for the DMA transfers (getting a cookie) - */ - if (ddi_dma_addr_bind_handle(sf->sf_lilp_dmahandle, NULL, - (caddr_t)sf->sf_lilp_map, real_size, - DDI_DMA_READ | DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - &sf->sf_lilp_dmacookie, &ccount) != DDI_DMA_MAPPED) { - cmn_err(CE_WARN, - "sf%d: failed to bind dma handle for lilp map", - instance); - goto fail; - } - handle_bound = TRUE; - /* ensure only one cookie was allocated */ - if (ccount != 1) { - goto fail; - } - - /* ensure LILP map and DMA cookie addresses are even?? */ - sf->sf_lilp_map = (struct fcal_lilp_map *)(((uintptr_t)sf-> - sf_lilp_map + 1) & ~1); - sf->sf_lilp_dmacookie.dmac_address = (sf-> - sf_lilp_dmacookie.dmac_address + 1) & ~1; - - /* set up all of our mutexes and condition variables */ - mutex_init(&sf->sf_mutex, NULL, MUTEX_DRIVER, NULL); - mutex_init(&sf->sf_cmd_mutex, NULL, MUTEX_DRIVER, NULL); - mutex_init(&sf->sf_cr_mutex, NULL, MUTEX_DRIVER, NULL); - mutex_init(&sf->sf_hp_daemon_mutex, NULL, MUTEX_DRIVER, NULL); - cv_init(&sf->sf_cr_cv, NULL, CV_DRIVER, NULL); - cv_init(&sf->sf_hp_daemon_cv, NULL, CV_DRIVER, NULL); - - mutex_initted = TRUE; - - /* create our devctl minor node */ - if (ddi_create_minor_node(dip, "devctl", S_IFCHR, - SF_INST2DEVCTL_MINOR(instance), - DDI_NT_NEXUS, 0) != DDI_SUCCESS) { - cmn_err(CE_WARN, "sf%d: ddi_create_minor_node failed" - " for devctl", instance); - goto fail; - } - - /* create fc minor node */ - if (ddi_create_minor_node(dip, "fc", S_IFCHR, - SF_INST2FC_MINOR(instance), DDI_NT_FC_ATTACHMENT_POINT, - 0) != DDI_SUCCESS) { - cmn_err(CE_WARN, "sf%d: ddi_create_minor_node failed" - " for fc", instance); - goto fail; - } - /* allocate a SCSI transport structure */ - tran = scsi_hba_tran_alloc(dip, 0); - if (tran == NULL) { - /* remove all minor nodes created */ - ddi_remove_minor_node(dip, NULL); - cmn_err(CE_WARN, "sf%d: scsi_hba_tran_alloc failed", - instance); - goto fail; - } - - /* Indicate that we are 'sizeof (scsi_*(9S))' clean. */ - scsi_size_clean(dip); /* SCSI_SIZE_CLEAN_VERIFY ok */ - - /* save ptr to new transport structure and fill it in */ - sf->sf_tran = tran; - - tran->tran_hba_private = sf; - tran->tran_tgt_private = NULL; - tran->tran_tgt_init = sf_scsi_tgt_init; - tran->tran_tgt_probe = NULL; - tran->tran_tgt_free = sf_scsi_tgt_free; - - tran->tran_start = sf_start; - tran->tran_abort = sf_abort; - tran->tran_reset = sf_reset; - tran->tran_getcap = sf_getcap; - tran->tran_setcap = sf_setcap; - tran->tran_init_pkt = sf_scsi_init_pkt; - tran->tran_destroy_pkt = sf_scsi_destroy_pkt; - tran->tran_dmafree = sf_scsi_dmafree; - tran->tran_sync_pkt = sf_scsi_sync_pkt; - tran->tran_reset_notify = sf_scsi_reset_notify; - - /* - * register event notification routines with scsa - */ - tran->tran_get_eventcookie = sf_bus_get_eventcookie; - tran->tran_add_eventcall = sf_bus_add_eventcall; - tran->tran_remove_eventcall = sf_bus_remove_eventcall; - tran->tran_post_event = sf_bus_post_event; - - /* - * register bus configure/unconfigure - */ - tran->tran_bus_config = sf_scsi_bus_config; - tran->tran_bus_unconfig = sf_scsi_bus_unconfig; - - /* - * allocate an ndi event handle - */ - sf->sf_event_defs = (ndi_event_definition_t *) - kmem_zalloc(sizeof (sf_event_defs), KM_SLEEP); - - bcopy(sf_event_defs, sf->sf_event_defs, - sizeof (sf_event_defs)); - - (void) ndi_event_alloc_hdl(dip, NULL, - &sf->sf_event_hdl, NDI_SLEEP); - - sf->sf_events.ndi_events_version = NDI_EVENTS_REV1; - sf->sf_events.ndi_n_events = SF_N_NDI_EVENTS; - sf->sf_events.ndi_event_defs = sf->sf_event_defs; - - if (ndi_event_bind_set(sf->sf_event_hdl, - &sf->sf_events, NDI_SLEEP) != NDI_SUCCESS) { - goto fail; - } - - tran->tran_get_name = sf_scsi_get_name; - tran->tran_get_bus_addr = sf_scsi_get_bus_addr; - - /* setup and attach SCSI hba transport */ - if (scsi_hba_attach_setup(dip, sf->sf_sochandle-> - fcal_dmaattr, tran, SCSI_HBA_TRAN_CLONE) != DDI_SUCCESS) { - cmn_err(CE_WARN, "sf%d: scsi_hba_attach_setup failed", - instance); - goto fail; - } - - /* set up kstats */ - if ((sf->sf_ksp = kstat_create("sf", instance, "statistics", - "controller", KSTAT_TYPE_RAW, sizeof (struct sf_stats), - KSTAT_FLAG_VIRTUAL)) == NULL) { - cmn_err(CE_WARN, "sf%d: failed to create kstat", - instance); - } else { - sf->sf_stats.version = 2; - (void) sprintf(sf->sf_stats.drvr_name, - "%s: %s", SF_NAME, sf_version); - sf->sf_ksp->ks_data = (void *)&sf->sf_stats; - sf->sf_ksp->ks_private = sf; - sf->sf_ksp->ks_update = sf_kstat_update; - kstat_install(sf->sf_ksp); - } - - /* create the hotplug thread */ - mutex_enter(&sf->sf_hp_daemon_mutex); - tp = thread_create(NULL, 0, - (void (*)())sf_hp_daemon, sf, 0, &p0, TS_RUN, minclsyspri); - sf->sf_hp_tid = tp->t_did; - mutex_exit(&sf->sf_hp_daemon_mutex); - - /* add this soft state instance to the head of the list */ - mutex_enter(&sf_global_mutex); - sf->sf_next = sf_head; - tsf = sf_head; - sf_head = sf; - - /* - * find entry in list that has the same FC-AL handle (if any) - */ - while (tsf != NULL) { - if (tsf->sf_socp == sf->sf_socp) { - break; /* found matching entry */ - } - tsf = tsf->sf_next; - } - - if (tsf != NULL) { - /* if we found a matching entry keep track of it */ - sf->sf_sibling = tsf; - } - - /* - * increment watchdog init flag, setting watchdog timeout - * if we are the first (since somebody has to do it) - */ - if (!sf_watchdog_init++) { - mutex_exit(&sf_global_mutex); - sf_watchdog_tick = sf_watchdog_timeout * - drv_usectohz(1000000); - sf_watchdog_id = timeout(sf_watch, - NULL, sf_watchdog_tick); - } else { - mutex_exit(&sf_global_mutex); - } - - if (tsf != NULL) { - /* - * set up matching entry to be our sibling - */ - mutex_enter(&tsf->sf_mutex); - tsf->sf_sibling = sf; - mutex_exit(&tsf->sf_mutex); - } - - /* - * create this property so that PM code knows we want - * to be suspended at PM time - */ - (void) ddi_prop_update_string(DDI_DEV_T_NONE, dip, - PM_HARDWARE_STATE_PROP, PM_NEEDS_SUSPEND_RESUME); - - /* log the fact that we have a new device */ - ddi_report_dev(dip); - - /* - * force a login by setting our state to offline - */ - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - sf->sf_state = SF_STATE_OFFLINE; - - /* - * call transport routine to register state change and - * ELS callback routines (to register us as a ULP) - */ - soc_add_ulp(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, TYPE_SCSI_FCP, - sf_statec_callback, sf_unsol_els_callback, NULL, sf); - - /* - * call transport routine to force loop initialization - */ - (void) soc_force_lip(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, 0, FCAL_NO_LIP); - sf->sf_reset_time = ddi_get_lbolt64(); - return (DDI_SUCCESS); - - default: - return (DDI_FAILURE); - } - -fail: - cmn_err(CE_WARN, "sf%d: failed to attach", instance); - - /* - * Unbind and free event set - */ - if (sf->sf_event_hdl) { - (void) ndi_event_unbind_set(sf->sf_event_hdl, - &sf->sf_events, NDI_SLEEP); - (void) ndi_event_free_hdl(sf->sf_event_hdl); - } - - if (sf->sf_event_defs) { - kmem_free(sf->sf_event_defs, sizeof (sf_event_defs)); - } - - if (sf->sf_tran != NULL) { - scsi_hba_tran_free(sf->sf_tran); - } - while (sf->sf_cr_pool != NULL) { - sf_crpool_free(sf); - } - if (sf->sf_lilp_dmahandle != NULL) { - if (handle_bound) { - (void) ddi_dma_unbind_handle(sf->sf_lilp_dmahandle); - } - ddi_dma_free_handle(&sf->sf_lilp_dmahandle); - } - if (sf->sf_pkt_cache != NULL) { - kmem_cache_destroy(sf->sf_pkt_cache); - } - if (sf->sf_lilp_map != NULL) { - ddi_dma_mem_free(&sf->sf_lilp_acchandle); - } - if (sf->sf_ksp != NULL) { - kstat_delete(sf->sf_ksp); - } - if (mutex_initted) { - mutex_destroy(&sf->sf_mutex); - mutex_destroy(&sf->sf_cmd_mutex); - mutex_destroy(&sf->sf_cr_mutex); - mutex_destroy(&sf->sf_hp_daemon_mutex); - cv_destroy(&sf->sf_cr_cv); - cv_destroy(&sf->sf_hp_daemon_cv); - } - mutex_enter(&sf_global_mutex); - - /* - * kill off the watchdog if we are the last instance - */ - if (!--sf_watchdog_init) { - timeout_id_t tid = sf_watchdog_id; - mutex_exit(&sf_global_mutex); - (void) untimeout(tid); - } else { - mutex_exit(&sf_global_mutex); - } - - ddi_soft_state_free(sf_state, instance); - - if (tran != NULL) { - /* remove all minor nodes */ - ddi_remove_minor_node(dip, NULL); - } - - return (DDI_FAILURE); -} - - -/* ARGSUSED */ -static int -sf_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) -{ - struct sf *sf; - int instance; - int i; - struct sf_target *target; - timeout_id_t tid; - - - - /* NO OTHER THREADS ARE RUNNING */ - - instance = ddi_get_instance(dip); - - if ((sf = ddi_get_soft_state(sf_state, instance)) == NULL) { - cmn_err(CE_WARN, "sf_detach, sf%d: bad soft state", instance); - return (DDI_FAILURE); - } - - switch (cmd) { - - case DDI_SUSPEND: - /* - * suspend our instance - */ - - SF_DEBUG(2, (sf, CE_CONT, - "sf_detach: DDI_SUSPEND for sf%d\n", instance)); - /* - * There is a race condition in socal where while doing - * callbacks if a ULP removes it self from the callback list - * the for loop in socal may panic as cblist is junk and - * while trying to get cblist->next the system will panic. - */ - - /* call transport to remove our unregister our callbacks */ - soc_remove_ulp(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, TYPE_SCSI_FCP, sf); - - /* - * begin process of clearing outstanding commands - * by issuing a lip - */ - sf_force_lip(sf); - - /* - * toggle the device OFFLINE in order to cause - * outstanding commands to drain - */ - mutex_enter(&sf->sf_mutex); - sf->sf_lip_cnt++; - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - sf->sf_state = (SF_STATE_OFFLINE | SF_STATE_SUSPENDED); - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - if (target != NULL) { - struct sf_target *ntarget; - - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_OFFLINE)) { - target->sft_state |= - (SF_TARGET_BUSY | SF_TARGET_MARK); - } - /* do this for all LUNs as well */ - for (ntarget = target->sft_next_lun; - ntarget; - ntarget = ntarget->sft_next_lun) { - mutex_enter(&ntarget->sft_mutex); - if (!(ntarget->sft_state & - SF_TARGET_OFFLINE)) { - ntarget->sft_state |= - (SF_TARGET_BUSY | - SF_TARGET_MARK); - } - mutex_exit(&ntarget->sft_mutex); - } - mutex_exit(&target->sft_mutex); - } - } - mutex_exit(&sf->sf_mutex); - mutex_enter(&sf_global_mutex); - - /* - * kill off the watchdog if we are the last instance - */ - if (!--sf_watchdog_init) { - tid = sf_watchdog_id; - mutex_exit(&sf_global_mutex); - (void) untimeout(tid); - } else { - mutex_exit(&sf_global_mutex); - } - - return (DDI_SUCCESS); - - case DDI_DETACH: - /* - * detach this instance - */ - - SF_DEBUG(2, (sf, CE_CONT, - "sf_detach: DDI_DETACH for sf%d\n", instance)); - - /* remove this "sf" from the list of sf softstates */ - sf_softstate_unlink(sf); - - /* - * prior to taking any DDI_DETACH actions, toggle the - * device OFFLINE in order to cause outstanding - * commands to drain - */ - mutex_enter(&sf->sf_mutex); - sf->sf_lip_cnt++; - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - sf->sf_state = SF_STATE_OFFLINE; - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - if (target != NULL) { - struct sf_target *ntarget; - - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_OFFLINE)) { - target->sft_state |= - (SF_TARGET_BUSY | SF_TARGET_MARK); - } - for (ntarget = target->sft_next_lun; - ntarget; - ntarget = ntarget->sft_next_lun) { - mutex_enter(&ntarget->sft_mutex); - if (!(ntarget->sft_state & - SF_TARGET_OFFLINE)) { - ntarget->sft_state |= - (SF_TARGET_BUSY | - SF_TARGET_MARK); - } - mutex_exit(&ntarget->sft_mutex); - } - mutex_exit(&target->sft_mutex); - } - } - mutex_exit(&sf->sf_mutex); - - /* call transport to remove and unregister our callbacks */ - soc_remove_ulp(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, TYPE_SCSI_FCP, sf); - - /* - * kill off the watchdog if we are the last instance - */ - mutex_enter(&sf_global_mutex); - if (!--sf_watchdog_init) { - tid = sf_watchdog_id; - mutex_exit(&sf_global_mutex); - (void) untimeout(tid); - } else { - mutex_exit(&sf_global_mutex); - } - - /* signal sf_hp_daemon() to exit and wait for exit */ - mutex_enter(&sf->sf_hp_daemon_mutex); - ASSERT(sf->sf_hp_tid); - sf->sf_hp_exit = 1; /* flag exit */ - cv_signal(&sf->sf_hp_daemon_cv); - mutex_exit(&sf->sf_hp_daemon_mutex); - thread_join(sf->sf_hp_tid); /* wait for hotplug to exit */ - - /* - * Unbind and free event set - */ - if (sf->sf_event_hdl) { - (void) ndi_event_unbind_set(sf->sf_event_hdl, - &sf->sf_events, NDI_SLEEP); - (void) ndi_event_free_hdl(sf->sf_event_hdl); - } - - if (sf->sf_event_defs) { - kmem_free(sf->sf_event_defs, sizeof (sf_event_defs)); - } - - /* detach this instance of the HBA driver */ - (void) scsi_hba_detach(dip); - scsi_hba_tran_free(sf->sf_tran); - - /* deallocate/unbind DMA handle for lilp map */ - if (sf->sf_lilp_map != NULL) { - (void) ddi_dma_unbind_handle(sf->sf_lilp_dmahandle); - if (sf->sf_lilp_dmahandle != NULL) { - ddi_dma_free_handle(&sf->sf_lilp_dmahandle); - } - ddi_dma_mem_free(&sf->sf_lilp_acchandle); - } - - /* - * the kmem cache must be destroyed before free'ing - * up the crpools - * - * our finagle of "ntot" and "nfree" - * causes an ASSERT failure in "sf_cr_free()" - * if the kmem cache is free'd after invoking - * "sf_crpool_free()". - */ - kmem_cache_destroy(sf->sf_pkt_cache); - - SF_DEBUG(2, (sf, CE_CONT, - "sf_detach: sf_crpool_free() for instance 0x%x\n", - instance)); - while (sf->sf_cr_pool != NULL) { - /* - * set ntot to nfree for this particular entry - * - * this causes sf_crpool_free() to update - * the cr_pool list when deallocating this entry - */ - sf->sf_cr_pool->ntot = sf->sf_cr_pool->nfree; - sf_crpool_free(sf); - } - - /* - * now that the cr_pool's are gone it's safe - * to destroy all softstate mutex's and cv's - */ - mutex_destroy(&sf->sf_mutex); - mutex_destroy(&sf->sf_cmd_mutex); - mutex_destroy(&sf->sf_cr_mutex); - mutex_destroy(&sf->sf_hp_daemon_mutex); - cv_destroy(&sf->sf_cr_cv); - cv_destroy(&sf->sf_hp_daemon_cv); - - /* remove all minor nodes from the device tree */ - ddi_remove_minor_node(dip, NULL); - - /* remove properties created during attach() */ - ddi_prop_remove_all(dip); - - /* remove kstat's if present */ - if (sf->sf_ksp != NULL) { - kstat_delete(sf->sf_ksp); - } - - SF_DEBUG(2, (sf, CE_CONT, - "sf_detach: ddi_soft_state_free() for instance 0x%x\n", - instance)); - ddi_soft_state_free(sf_state, instance); - return (DDI_SUCCESS); - - default: - SF_DEBUG(2, (sf, CE_CONT, "sf_detach: sf%d unknown cmd %x\n", - instance, (int)cmd)); - return (DDI_FAILURE); - } -} - - -/* - * sf_softstate_unlink() - remove an sf instance from the list of softstates - */ -static void -sf_softstate_unlink(struct sf *sf) -{ - struct sf *sf_ptr; - struct sf *sf_found_sibling; - struct sf *sf_reposition = NULL; - - - mutex_enter(&sf_global_mutex); - while (sf_watch_running) { - /* Busy working the list -- wait */ - cv_wait(&sf_watch_cv, &sf_global_mutex); - } - if ((sf_found_sibling = sf->sf_sibling) != NULL) { - /* - * we have a sibling so NULL out its reference to us - */ - mutex_enter(&sf_found_sibling->sf_mutex); - sf_found_sibling->sf_sibling = NULL; - mutex_exit(&sf_found_sibling->sf_mutex); - } - - /* remove our instance from the global list */ - if (sf == sf_head) { - /* we were at at head of the list */ - sf_head = sf->sf_next; - } else { - /* find us in the list */ - for (sf_ptr = sf_head; - sf_ptr != NULL; - sf_ptr = sf_ptr->sf_next) { - if (sf_ptr == sf) { - break; - } - /* remember this place */ - sf_reposition = sf_ptr; - } - ASSERT(sf_ptr == sf); - ASSERT(sf_reposition != NULL); - - sf_reposition->sf_next = sf_ptr->sf_next; - } - mutex_exit(&sf_global_mutex); -} - - -static int -sf_scsi_bus_config(dev_info_t *parent, uint_t flag, - ddi_bus_config_op_t op, void *arg, dev_info_t **childp) -{ - int64_t reset_delay; - struct sf *sf; - - sf = ddi_get_soft_state(sf_state, ddi_get_instance(parent)); - ASSERT(sf); - - reset_delay = (int64_t)(USEC_TO_TICK(SF_INIT_WAIT_TIMEOUT)) - - (ddi_get_lbolt64() - sf->sf_reset_time); - if (reset_delay < 0) - reset_delay = 0; - - if (sf_bus_config_debug) - flag |= NDI_DEVI_DEBUG; - - return (ndi_busop_bus_config(parent, flag, op, - arg, childp, (clock_t)reset_delay)); -} - -static int -sf_scsi_bus_unconfig(dev_info_t *parent, uint_t flag, - ddi_bus_config_op_t op, void *arg) -{ - if (sf_bus_config_debug) - flag |= NDI_DEVI_DEBUG; - - return (ndi_busop_bus_unconfig(parent, flag, op, arg)); -} - - -/* - * called by transport to initialize a SCSI target - */ -/* ARGSUSED */ -static int -sf_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip, - scsi_hba_tran_t *hba_tran, struct scsi_device *sd) -{ -#ifdef RAID_LUNS - int lun; -#else - int64_t lun; -#endif - struct sf_target *target; - struct sf *sf = (struct sf *)hba_tran->tran_hba_private; - int i, t_len; - unsigned int lip_cnt; - unsigned char wwn[FC_WWN_SIZE]; - - - /* get and validate our SCSI target ID */ - i = sd->sd_address.a_target; - if (i >= sf_max_targets) { - return (DDI_NOT_WELL_FORMED); - } - - /* get our port WWN property */ - t_len = sizeof (wwn); - if (ddi_prop_op(DDI_DEV_T_ANY, tgt_dip, PROP_LEN_AND_VAL_BUF, - DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, PORT_WWN_PROP, - (caddr_t)&wwn, &t_len) != DDI_SUCCESS) { - /* no port WWN property - ignore the OBP stub node */ - return (DDI_NOT_WELL_FORMED); - } - - /* get our LIP count property */ - t_len = sizeof (lip_cnt); - if (ddi_prop_op(DDI_DEV_T_ANY, tgt_dip, PROP_LEN_AND_VAL_BUF, - DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, LIP_CNT_PROP, - (caddr_t)&lip_cnt, &t_len) != DDI_SUCCESS) { - return (DDI_FAILURE); - } - /* and our LUN property */ - t_len = sizeof (lun); - if (ddi_prop_op(DDI_DEV_T_ANY, tgt_dip, PROP_LEN_AND_VAL_BUF, - DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, "lun", - (caddr_t)&lun, &t_len) != DDI_SUCCESS) { - return (DDI_FAILURE); - } - - /* find the target structure for this instance */ - mutex_enter(&sf->sf_mutex); - if ((target = sf_lookup_target(sf, wwn, lun)) == NULL) { - mutex_exit(&sf->sf_mutex); - return (DDI_FAILURE); - } - - mutex_enter(&target->sft_mutex); - if ((sf->sf_lip_cnt == lip_cnt) && !(target->sft_state - & SF_TARGET_INIT_DONE)) { - /* - * set links between HBA transport and target structures - * and set done flag - */ - hba_tran->tran_tgt_private = target; - target->sft_tran = hba_tran; - target->sft_state |= SF_TARGET_INIT_DONE; - } else { - /* already initialized ?? */ - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - return (DDI_FAILURE); - } - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - - return (DDI_SUCCESS); -} - - -/* - * called by transport to free a target - */ -/* ARGSUSED */ -static void -sf_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip, - scsi_hba_tran_t *hba_tran, struct scsi_device *sd) -{ - struct sf_target *target = hba_tran->tran_tgt_private; - - if (target != NULL) { - mutex_enter(&target->sft_mutex); - target->sft_tran = NULL; - target->sft_state &= ~SF_TARGET_INIT_DONE; - mutex_exit(&target->sft_mutex); - } -} - - -/* - * allocator for non-std size cdb/pkt_private/status -- return TRUE iff - * success, else return FALSE - */ -/*ARGSUSED*/ -static int -sf_pkt_alloc_extern(struct sf *sf, struct sf_pkt *cmd, - int tgtlen, int statuslen, int kf) -{ - caddr_t scbp, tgt; - int failure = FALSE; - struct scsi_pkt *pkt = CMD2PKT(cmd); - - - tgt = scbp = NULL; - - if (tgtlen > PKT_PRIV_LEN) { - if ((tgt = kmem_zalloc(tgtlen, kf)) == NULL) { - failure = TRUE; - } else { - cmd->cmd_flags |= CFLAG_PRIVEXTERN; - pkt->pkt_private = tgt; - } - } - if (statuslen > EXTCMDS_STATUS_SIZE) { - if ((scbp = kmem_zalloc((size_t)statuslen, kf)) == NULL) { - failure = TRUE; - } else { - cmd->cmd_flags |= CFLAG_SCBEXTERN; - pkt->pkt_scbp = (opaque_t)scbp; - } - } - if (failure) { - sf_pkt_destroy_extern(sf, cmd); - } - return (failure); -} - - -/* - * deallocator for non-std size cdb/pkt_private/status - */ -static void -sf_pkt_destroy_extern(struct sf *sf, struct sf_pkt *cmd) -{ - struct scsi_pkt *pkt = CMD2PKT(cmd); - - if (cmd->cmd_flags & CFLAG_FREE) { - cmn_err(CE_PANIC, - "sf_scsi_impl_pktfree: freeing free packet"); - _NOTE(NOT_REACHED) - /* NOTREACHED */ - } - if (cmd->cmd_flags & CFLAG_SCBEXTERN) { - kmem_free((caddr_t)pkt->pkt_scbp, - (size_t)cmd->cmd_scblen); - } - if (cmd->cmd_flags & CFLAG_PRIVEXTERN) { - kmem_free((caddr_t)pkt->pkt_private, - (size_t)cmd->cmd_privlen); - } - - cmd->cmd_flags = CFLAG_FREE; - kmem_cache_free(sf->sf_pkt_cache, (void *)cmd); -} - - -/* - * create or initialize a SCSI packet -- called internally and - * by the transport - */ -static struct scsi_pkt * -sf_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt, - struct buf *bp, int cmdlen, int statuslen, int tgtlen, - int flags, int (*callback)(), caddr_t arg) -{ - int kf; - int failure = FALSE; - struct sf_pkt *cmd; - struct sf *sf = ADDR2SF(ap); - struct sf_target *target = ADDR2TARGET(ap); - struct sf_pkt *new_cmd = NULL; - struct fcal_packet *fpkt; - fc_frame_header_t *hp; - struct fcp_cmd *fcmd; - - - /* - * If we've already allocated a pkt once, - * this request is for dma allocation only. - */ - if (pkt == NULL) { - - /* - * First step of sf_scsi_init_pkt: pkt allocation - */ - if (cmdlen > FCP_CDB_SIZE) { - return (NULL); - } - - kf = (callback == SLEEP_FUNC)? KM_SLEEP: KM_NOSLEEP; - - if ((cmd = kmem_cache_alloc(sf->sf_pkt_cache, kf)) != NULL) { - /* - * Selective zeroing of the pkt. - */ - - cmd->cmd_flags = 0; - cmd->cmd_forw = 0; - cmd->cmd_back = 0; - cmd->cmd_next = 0; - cmd->cmd_pkt = (struct scsi_pkt *)((char *)cmd + - sizeof (struct sf_pkt) + sizeof (struct - fcal_packet)); - cmd->cmd_fp_pkt = (struct fcal_packet *)((char *)cmd + - sizeof (struct sf_pkt)); - cmd->cmd_fp_pkt->fcal_pkt_private = (opaque_t)cmd; - cmd->cmd_state = SF_STATE_IDLE; - cmd->cmd_pkt->pkt_ha_private = (opaque_t)cmd; - cmd->cmd_pkt->pkt_scbp = (opaque_t)cmd->cmd_scsi_scb; - cmd->cmd_pkt->pkt_comp = NULL; - cmd->cmd_pkt->pkt_flags = 0; - cmd->cmd_pkt->pkt_time = 0; - cmd->cmd_pkt->pkt_resid = 0; - cmd->cmd_pkt->pkt_reason = 0; - cmd->cmd_cdblen = (uchar_t)cmdlen; - cmd->cmd_scblen = statuslen; - cmd->cmd_privlen = tgtlen; - cmd->cmd_pkt->pkt_address = *ap; - - /* zero pkt_private */ - (int *)(cmd->cmd_pkt->pkt_private = - cmd->cmd_pkt_private); - bzero((caddr_t)cmd->cmd_pkt->pkt_private, - PKT_PRIV_LEN); - } else { - failure = TRUE; - } - - if (failure || - (tgtlen > PKT_PRIV_LEN) || - (statuslen > EXTCMDS_STATUS_SIZE)) { - if (!failure) { - /* need to allocate more space */ - failure = sf_pkt_alloc_extern(sf, cmd, - tgtlen, statuslen, kf); - } - if (failure) { - return (NULL); - } - } - - fpkt = cmd->cmd_fp_pkt; - if (cmd->cmd_block == NULL) { - - /* allocate cmd/response pool buffers */ - if (sf_cr_alloc(sf, cmd, callback) == DDI_FAILURE) { - sf_pkt_destroy_extern(sf, cmd); - return (NULL); - } - - /* fill in the FC-AL packet */ - fpkt->fcal_pkt_cookie = sf->sf_socp; - fpkt->fcal_pkt_comp = sf_cmd_callback; - fpkt->fcal_pkt_flags = 0; - fpkt->fcal_magic = FCALP_MAGIC; - fpkt->fcal_socal_request.sr_soc_hdr.sh_flags = - (ushort_t)(SOC_FC_HEADER | - sf->sf_sochandle->fcal_portno); - fpkt->fcal_socal_request.sr_soc_hdr.sh_class = 3; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_count = 1; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_flags = 0; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_seqno = 0; - fpkt->fcal_socal_request.sr_dataseg[0].fc_base = - (uint32_t)cmd->cmd_dmac; - fpkt->fcal_socal_request.sr_dataseg[0].fc_count = - sizeof (struct fcp_cmd); - fpkt->fcal_socal_request.sr_dataseg[1].fc_base = - (uint32_t)cmd->cmd_rsp_dmac; - fpkt->fcal_socal_request.sr_dataseg[1].fc_count = - FCP_MAX_RSP_IU_SIZE; - - /* Fill in the Fabric Channel Header */ - hp = &fpkt->fcal_socal_request.sr_fc_frame_hdr; - hp->r_ctl = R_CTL_COMMAND; - hp->type = TYPE_SCSI_FCP; - hp->f_ctl = F_CTL_SEQ_INITIATIVE | F_CTL_FIRST_SEQ; - hp->reserved1 = 0; - hp->seq_id = 0; - hp->df_ctl = 0; - hp->seq_cnt = 0; - hp->ox_id = 0xffff; - hp->rx_id = 0xffff; - hp->ro = 0; - - /* Establish the LUN */ - bcopy((caddr_t)&target->sft_lun.b, - (caddr_t)&cmd->cmd_block->fcp_ent_addr, - FCP_LUN_SIZE); - *((int32_t *)&cmd->cmd_block->fcp_cntl) = 0; - } - cmd->cmd_pkt->pkt_cdbp = cmd->cmd_block->fcp_cdb; - - mutex_enter(&target->sft_pkt_mutex); - - target->sft_pkt_tail->cmd_forw = cmd; - cmd->cmd_back = target->sft_pkt_tail; - cmd->cmd_forw = (struct sf_pkt *)&target->sft_pkt_head; - target->sft_pkt_tail = cmd; - - mutex_exit(&target->sft_pkt_mutex); - new_cmd = cmd; /* for later cleanup if needed */ - } else { - /* pkt already exists -- just a request for DMA allocation */ - cmd = PKT2CMD(pkt); - fpkt = cmd->cmd_fp_pkt; - } - - /* zero cdb (bzero is too slow) */ - bzero((caddr_t)cmd->cmd_pkt->pkt_cdbp, cmdlen); - - /* - * Second step of sf_scsi_init_pkt: dma allocation - * Set up dma info - */ - if ((bp != NULL) && (bp->b_bcount != 0)) { - int cmd_flags, dma_flags; - int rval = 0; - uint_t dmacookie_count; - - /* there is a buffer and some data to transfer */ - - /* set up command and DMA flags */ - cmd_flags = cmd->cmd_flags; - if (bp->b_flags & B_READ) { - /* a read */ - cmd_flags &= ~CFLAG_DMASEND; - dma_flags = DDI_DMA_READ; - } else { - /* a write */ - cmd_flags |= CFLAG_DMASEND; - dma_flags = DDI_DMA_WRITE; - } - if (flags & PKT_CONSISTENT) { - cmd_flags |= CFLAG_CMDIOPB; - dma_flags |= DDI_DMA_CONSISTENT; - } - - /* ensure we have a DMA handle */ - if (cmd->cmd_dmahandle == NULL) { - rval = ddi_dma_alloc_handle(sf->sf_dip, - sf->sf_sochandle->fcal_dmaattr, callback, arg, - &cmd->cmd_dmahandle); - } - - if (rval == 0) { - /* bind our DMA handle to our buffer */ - rval = ddi_dma_buf_bind_handle(cmd->cmd_dmahandle, bp, - dma_flags, callback, arg, &cmd->cmd_dmacookie, - &dmacookie_count); - } - - if (rval != 0) { - /* DMA failure */ - SF_DEBUG(2, (sf, CE_CONT, "ddi_dma_buf.. failed\n")); - switch (rval) { - case DDI_DMA_NORESOURCES: - bioerror(bp, 0); - break; - case DDI_DMA_BADATTR: - case DDI_DMA_NOMAPPING: - bioerror(bp, EFAULT); - break; - case DDI_DMA_TOOBIG: - default: - bioerror(bp, EINVAL); - break; - } - /* clear valid flag */ - cmd->cmd_flags = cmd_flags & ~CFLAG_DMAVALID; - if (new_cmd != NULL) { - /* destroy packet if we just created it */ - sf_scsi_destroy_pkt(ap, new_cmd->cmd_pkt); - } - return (NULL); - } - - ASSERT(dmacookie_count == 1); - /* set up amt to transfer and set valid flag */ - cmd->cmd_dmacount = bp->b_bcount; - cmd->cmd_flags = cmd_flags | CFLAG_DMAVALID; - - ASSERT(cmd->cmd_dmahandle != NULL); - } - - /* set up FC-AL packet */ - fcmd = cmd->cmd_block; - - if (cmd->cmd_flags & CFLAG_DMAVALID) { - if (cmd->cmd_flags & CFLAG_DMASEND) { - /* DMA write */ - fcmd->fcp_cntl.cntl_read_data = 0; - fcmd->fcp_cntl.cntl_write_data = 1; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = - CQ_TYPE_IO_WRITE; - } else { - /* DMA read */ - fcmd->fcp_cntl.cntl_read_data = 1; - fcmd->fcp_cntl.cntl_write_data = 0; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = - CQ_TYPE_IO_READ; - } - fpkt->fcal_socal_request.sr_dataseg[2].fc_base = - (uint32_t)cmd->cmd_dmacookie.dmac_address; - fpkt->fcal_socal_request.sr_dataseg[2].fc_count = - cmd->cmd_dmacookie.dmac_size; - fpkt->fcal_socal_request.sr_soc_hdr.sh_seg_cnt = 3; - fpkt->fcal_socal_request.sr_soc_hdr.sh_byte_cnt = - cmd->cmd_dmacookie.dmac_size; - fcmd->fcp_data_len = cmd->cmd_dmacookie.dmac_size; - } else { - /* not a read or write */ - fcmd->fcp_cntl.cntl_read_data = 0; - fcmd->fcp_cntl.cntl_write_data = 0; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = CQ_TYPE_SIMPLE; - fpkt->fcal_socal_request.sr_soc_hdr.sh_seg_cnt = 2; - fpkt->fcal_socal_request.sr_soc_hdr.sh_byte_cnt = - sizeof (struct fcp_cmd); - fcmd->fcp_data_len = 0; - } - fcmd->fcp_cntl.cntl_qtype = FCP_QTYPE_SIMPLE; - - return (cmd->cmd_pkt); -} - - -/* - * destroy a SCSI packet -- called internally and by the transport - */ -static void -sf_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) -{ - struct sf_pkt *cmd = PKT2CMD(pkt); - struct sf *sf = ADDR2SF(ap); - struct sf_target *target = ADDR2TARGET(ap); - struct fcal_packet *fpkt = cmd->cmd_fp_pkt; - - - if (cmd->cmd_flags & CFLAG_DMAVALID) { - /* DMA was set up -- clean up */ - (void) ddi_dma_unbind_handle(cmd->cmd_dmahandle); - cmd->cmd_flags ^= CFLAG_DMAVALID; - } - - /* take this packet off the doubly-linked list */ - mutex_enter(&target->sft_pkt_mutex); - cmd->cmd_back->cmd_forw = cmd->cmd_forw; - cmd->cmd_forw->cmd_back = cmd->cmd_back; - mutex_exit(&target->sft_pkt_mutex); - - fpkt->fcal_pkt_flags = 0; - /* free the packet */ - if ((cmd->cmd_flags & - (CFLAG_FREE | CFLAG_PRIVEXTERN | CFLAG_SCBEXTERN)) == 0) { - /* just a regular packet */ - ASSERT(cmd->cmd_state != SF_STATE_ISSUED); - cmd->cmd_flags = CFLAG_FREE; - kmem_cache_free(sf->sf_pkt_cache, (void *)cmd); - } else { - /* a packet with extra memory */ - sf_pkt_destroy_extern(sf, cmd); - } -} - - -/* - * called by transport to unbind DMA handle - */ -/* ARGSUSED */ -static void -sf_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt) -{ - struct sf_pkt *cmd = PKT2CMD(pkt); - - - if (cmd->cmd_flags & CFLAG_DMAVALID) { - (void) ddi_dma_unbind_handle(cmd->cmd_dmahandle); - cmd->cmd_flags ^= CFLAG_DMAVALID; - } - -} - - -/* - * called by transport to synchronize CPU and I/O views of memory - */ -/* ARGSUSED */ -static void -sf_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) -{ - struct sf_pkt *cmd = PKT2CMD(pkt); - - - if (cmd->cmd_flags & CFLAG_DMAVALID) { - if (ddi_dma_sync(cmd->cmd_dmahandle, (off_t)0, (size_t)0, - (cmd->cmd_flags & CFLAG_DMASEND) ? - DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU) != - DDI_SUCCESS) { - cmn_err(CE_WARN, "sf: sync pkt failed"); - } - } -} - - -/* - * routine for reset notification setup, to register or cancel. -- called - * by transport - */ -static int -sf_scsi_reset_notify(struct scsi_address *ap, int flag, - void (*callback)(caddr_t), caddr_t arg) -{ - struct sf *sf = ADDR2SF(ap); - - return (scsi_hba_reset_notify_setup(ap, flag, callback, arg, - &sf->sf_mutex, &sf->sf_reset_notify_listf)); -} - - -/* - * called by transport to get port WWN property (except sun4u) - */ -/* ARGSUSED */ -static int -sf_scsi_get_name(struct scsi_device *sd, char *name, int len) -{ - char tbuf[(FC_WWN_SIZE*2)+1]; - unsigned char wwn[FC_WWN_SIZE]; - int i, lun; - dev_info_t *tgt_dip; - - tgt_dip = sd->sd_dev; - i = sizeof (wwn); - if (ddi_prop_op(DDI_DEV_T_ANY, tgt_dip, PROP_LEN_AND_VAL_BUF, - DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, PORT_WWN_PROP, - (caddr_t)&wwn, &i) != DDI_SUCCESS) { - name[0] = '\0'; - return (0); - } - i = sizeof (lun); - if (ddi_prop_op(DDI_DEV_T_ANY, tgt_dip, PROP_LEN_AND_VAL_BUF, - DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, "lun", - (caddr_t)&lun, &i) != DDI_SUCCESS) { - name[0] = '\0'; - return (0); - } - for (i = 0; i < FC_WWN_SIZE; i++) - (void) sprintf(&tbuf[i << 1], "%02x", wwn[i]); - (void) sprintf(name, "w%s,%x", tbuf, lun); - return (1); -} - - -/* - * called by transport to get target soft AL-PA (except sun4u) - */ -/* ARGSUSED */ -static int -sf_scsi_get_bus_addr(struct scsi_device *sd, char *name, int len) -{ - struct sf_target *target = ADDR2TARGET(&sd->sd_address); - - if (target == NULL) - return (0); - - (void) sprintf(name, "%x", target->sft_al_pa); - return (1); -} - - -/* - * add to the command/response buffer pool for this sf instance - */ -static int -sf_add_cr_pool(struct sf *sf) -{ - int cmd_buf_size; - size_t real_cmd_buf_size; - int rsp_buf_size; - size_t real_rsp_buf_size; - uint_t i, ccount; - struct sf_cr_pool *ptr; - struct sf_cr_free_elem *cptr; - caddr_t dptr, eptr; - ddi_dma_cookie_t cmd_cookie; - ddi_dma_cookie_t rsp_cookie; - int cmd_bound = FALSE, rsp_bound = FALSE; - - - /* allocate room for the pool */ - if ((ptr = kmem_zalloc(sizeof (struct sf_cr_pool), KM_NOSLEEP)) == - NULL) { - return (DDI_FAILURE); - } - - /* allocate a DMA handle for the command pool */ - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle->fcal_dmaattr, - DDI_DMA_DONTWAIT, NULL, &ptr->cmd_dma_handle) != DDI_SUCCESS) { - goto fail; - } - - /* - * Get a piece of memory in which to put commands - */ - cmd_buf_size = (sizeof (struct fcp_cmd) * SF_ELEMS_IN_POOL + 7) & ~7; - if (ddi_dma_mem_alloc(ptr->cmd_dma_handle, cmd_buf_size, - sf->sf_sochandle->fcal_accattr, DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, (caddr_t *)&ptr->cmd_base, - &real_cmd_buf_size, &ptr->cmd_acc_handle) != DDI_SUCCESS) { - goto fail; - } - - /* bind the DMA handle to an address */ - if (ddi_dma_addr_bind_handle(ptr->cmd_dma_handle, NULL, - ptr->cmd_base, real_cmd_buf_size, - DDI_DMA_WRITE | DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, - NULL, &cmd_cookie, &ccount) != DDI_DMA_MAPPED) { - goto fail; - } - cmd_bound = TRUE; - /* ensure only one cookie was allocated */ - if (ccount != 1) { - goto fail; - } - - /* allocate a DMA handle for the response pool */ - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle->fcal_dmaattr, - DDI_DMA_DONTWAIT, NULL, &ptr->rsp_dma_handle) != DDI_SUCCESS) { - goto fail; - } - - /* - * Get a piece of memory in which to put responses - */ - rsp_buf_size = FCP_MAX_RSP_IU_SIZE * SF_ELEMS_IN_POOL; - if (ddi_dma_mem_alloc(ptr->rsp_dma_handle, rsp_buf_size, - sf->sf_sochandle->fcal_accattr, DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, (caddr_t *)&ptr->rsp_base, - &real_rsp_buf_size, &ptr->rsp_acc_handle) != DDI_SUCCESS) { - goto fail; - } - - /* bind the DMA handle to an address */ - if (ddi_dma_addr_bind_handle(ptr->rsp_dma_handle, NULL, - ptr->rsp_base, real_rsp_buf_size, - DDI_DMA_READ | DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, - NULL, &rsp_cookie, &ccount) != DDI_DMA_MAPPED) { - goto fail; - } - rsp_bound = TRUE; - /* ensure only one cookie was allocated */ - if (ccount != 1) { - goto fail; - } - - /* - * Generate a (cmd/rsp structure) free list - */ - /* ensure ptr points to start of long word (8-byte block) */ - dptr = (caddr_t)((uintptr_t)(ptr->cmd_base) + 7 & ~7); - /* keep track of actual size after moving pointer */ - real_cmd_buf_size -= (dptr - ptr->cmd_base); - eptr = ptr->rsp_base; - - /* set actual total number of entries */ - ptr->ntot = min((real_cmd_buf_size / sizeof (struct fcp_cmd)), - (real_rsp_buf_size / FCP_MAX_RSP_IU_SIZE)); - ptr->nfree = ptr->ntot; - ptr->free = (struct sf_cr_free_elem *)ptr->cmd_base; - ptr->sf = sf; - - /* set up DMA for each pair of entries */ - i = 0; - while (i < ptr->ntot) { - cptr = (struct sf_cr_free_elem *)dptr; - dptr += sizeof (struct fcp_cmd); - - cptr->next = (struct sf_cr_free_elem *)dptr; - cptr->rsp = eptr; - - cptr->cmd_dmac = cmd_cookie.dmac_address + - (uint32_t)((caddr_t)cptr - ptr->cmd_base); - - cptr->rsp_dmac = rsp_cookie.dmac_address + - (uint32_t)((caddr_t)eptr - ptr->rsp_base); - - eptr += FCP_MAX_RSP_IU_SIZE; - i++; - } - - /* terminate the list */ - cptr->next = NULL; - - /* add this list at front of current one */ - mutex_enter(&sf->sf_cr_mutex); - ptr->next = sf->sf_cr_pool; - sf->sf_cr_pool = ptr; - sf->sf_cr_pool_cnt++; - mutex_exit(&sf->sf_cr_mutex); - - return (DDI_SUCCESS); - -fail: - /* we failed so clean up */ - if (ptr->cmd_dma_handle != NULL) { - if (cmd_bound) { - (void) ddi_dma_unbind_handle(ptr->cmd_dma_handle); - } - ddi_dma_free_handle(&ptr->cmd_dma_handle); - } - - if (ptr->rsp_dma_handle != NULL) { - if (rsp_bound) { - (void) ddi_dma_unbind_handle(ptr->rsp_dma_handle); - } - ddi_dma_free_handle(&ptr->rsp_dma_handle); - } - - if (ptr->cmd_base != NULL) { - ddi_dma_mem_free(&ptr->cmd_acc_handle); - } - - if (ptr->rsp_base != NULL) { - ddi_dma_mem_free(&ptr->rsp_acc_handle); - } - - kmem_free((caddr_t)ptr, sizeof (struct sf_cr_pool)); - return (DDI_FAILURE); -} - - -/* - * allocate a command/response buffer from the pool, allocating more - * in the pool as needed - */ -static int -sf_cr_alloc(struct sf *sf, struct sf_pkt *cmd, int (*func)()) -{ - struct sf_cr_pool *ptr; - struct sf_cr_free_elem *cptr; - - - mutex_enter(&sf->sf_cr_mutex); - -try_again: - - /* find a free buffer in the existing pool */ - ptr = sf->sf_cr_pool; - while (ptr != NULL) { - if (ptr->nfree != 0) { - ptr->nfree--; - break; - } else { - ptr = ptr->next; - } - } - - /* did we find a free buffer ? */ - if (ptr != NULL) { - /* we found a free buffer -- take it off the free list */ - cptr = ptr->free; - ptr->free = cptr->next; - mutex_exit(&sf->sf_cr_mutex); - /* set up the command to use the buffer pair */ - cmd->cmd_block = (struct fcp_cmd *)cptr; - cmd->cmd_dmac = cptr->cmd_dmac; - cmd->cmd_rsp_dmac = cptr->rsp_dmac; - cmd->cmd_rsp_block = (struct fcp_rsp *)cptr->rsp; - cmd->cmd_cr_pool = ptr; - return (DDI_SUCCESS); /* success */ - } - - /* no free buffer available -- can we allocate more ? */ - if (sf->sf_cr_pool_cnt < SF_CR_POOL_MAX) { - /* we need to allocate more buffer pairs */ - if (sf->sf_cr_flag) { - /* somebody already allocating for this instance */ - if (func == SLEEP_FUNC) { - /* user wants to wait */ - cv_wait(&sf->sf_cr_cv, &sf->sf_cr_mutex); - /* we've been woken so go try again */ - goto try_again; - } - /* user does not want to wait */ - mutex_exit(&sf->sf_cr_mutex); - sf->sf_stats.cralloc_failures++; - return (DDI_FAILURE); /* give up */ - } - /* set flag saying we're allocating */ - sf->sf_cr_flag = 1; - mutex_exit(&sf->sf_cr_mutex); - /* add to our pool */ - if (sf_add_cr_pool(sf) != DDI_SUCCESS) { - /* couldn't add to our pool for some reason */ - mutex_enter(&sf->sf_cr_mutex); - sf->sf_cr_flag = 0; - cv_broadcast(&sf->sf_cr_cv); - mutex_exit(&sf->sf_cr_mutex); - sf->sf_stats.cralloc_failures++; - return (DDI_FAILURE); /* give up */ - } - /* - * clear flag saying we're allocating and tell all other - * that care - */ - mutex_enter(&sf->sf_cr_mutex); - sf->sf_cr_flag = 0; - cv_broadcast(&sf->sf_cr_cv); - /* now that we have more buffers try again */ - goto try_again; - } - - /* we don't have room to allocate any more buffers */ - mutex_exit(&sf->sf_cr_mutex); - sf->sf_stats.cralloc_failures++; - return (DDI_FAILURE); /* give up */ -} - - -/* - * free a cmd/response buffer pair in our pool - */ -static void -sf_cr_free(struct sf_cr_pool *cp, struct sf_pkt *cmd) -{ - struct sf *sf = cp->sf; - struct sf_cr_free_elem *elem; - - elem = (struct sf_cr_free_elem *)cmd->cmd_block; - elem->rsp = (caddr_t)cmd->cmd_rsp_block; - elem->cmd_dmac = cmd->cmd_dmac; - elem->rsp_dmac = cmd->cmd_rsp_dmac; - - mutex_enter(&sf->sf_cr_mutex); - cp->nfree++; - ASSERT(cp->nfree <= cp->ntot); - - elem->next = cp->free; - cp->free = elem; - mutex_exit(&sf->sf_cr_mutex); -} - - -/* - * free our pool of cmd/response buffers - */ -static void -sf_crpool_free(struct sf *sf) -{ - struct sf_cr_pool *cp, *prev; - - prev = NULL; - mutex_enter(&sf->sf_cr_mutex); - cp = sf->sf_cr_pool; - while (cp != NULL) { - if (cp->nfree == cp->ntot) { - if (prev != NULL) { - prev->next = cp->next; - } else { - sf->sf_cr_pool = cp->next; - } - sf->sf_cr_pool_cnt--; - mutex_exit(&sf->sf_cr_mutex); - - (void) ddi_dma_unbind_handle(cp->cmd_dma_handle); - ddi_dma_free_handle(&cp->cmd_dma_handle); - (void) ddi_dma_unbind_handle(cp->rsp_dma_handle); - ddi_dma_free_handle(&cp->rsp_dma_handle); - ddi_dma_mem_free(&cp->cmd_acc_handle); - ddi_dma_mem_free(&cp->rsp_acc_handle); - kmem_free((caddr_t)cp, sizeof (struct sf_cr_pool)); - return; - } - prev = cp; - cp = cp->next; - } - mutex_exit(&sf->sf_cr_mutex); -} - - -/* ARGSUSED */ -static int -sf_kmem_cache_constructor(void *buf, void *arg, int size) -{ - struct sf_pkt *cmd = buf; - - mutex_init(&cmd->cmd_abort_mutex, NULL, MUTEX_DRIVER, NULL); - cmd->cmd_block = NULL; - cmd->cmd_dmahandle = NULL; - return (0); -} - - -/* ARGSUSED */ -static void -sf_kmem_cache_destructor(void *buf, void *size) -{ - struct sf_pkt *cmd = buf; - - if (cmd->cmd_dmahandle != NULL) { - ddi_dma_free_handle(&cmd->cmd_dmahandle); - } - - if (cmd->cmd_block != NULL) { - sf_cr_free(cmd->cmd_cr_pool, cmd); - } - mutex_destroy(&cmd->cmd_abort_mutex); -} - - -/* - * called by transport when a state change occurs - */ -static void -sf_statec_callback(void *arg, int msg) -{ - struct sf *sf = (struct sf *)arg; - struct sf_target *target; - int i; - struct sf_pkt *cmd; - struct scsi_pkt *pkt; - - - - switch (msg) { - - case FCAL_STATUS_LOOP_ONLINE: { - uchar_t al_pa; /* to save AL-PA */ - int ret; /* ret value from getmap */ - int lip_cnt; /* to save current count */ - int cnt; /* map length */ - - /* - * the loop has gone online - */ - SF_DEBUG(1, (sf, CE_CONT, "sf%d: loop online\n", - ddi_get_instance(sf->sf_dip))); - mutex_enter(&sf->sf_mutex); - sf->sf_lip_cnt++; - sf->sf_state = SF_STATE_ONLINING; - mutex_exit(&sf->sf_mutex); - - /* scan each target hash queue */ - for (i = 0; i < SF_NUM_HASH_QUEUES; i++) { - target = sf->sf_wwn_lists[i]; - while (target != NULL) { - /* - * foreach target, if it's not offline then - * mark it as busy - */ - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_OFFLINE)) - target->sft_state |= (SF_TARGET_BUSY - | SF_TARGET_MARK); -#ifdef DEBUG - /* - * for debugging, print out info on any - * pending commands (left hanging) - */ - cmd = target->sft_pkt_head; - while (cmd != (struct sf_pkt *)&target-> - sft_pkt_head) { - if (cmd->cmd_state == - SF_STATE_ISSUED) { - SF_DEBUG(1, (sf, CE_CONT, - "cmd 0x%p pending " - "after lip\n", - (void *)cmd->cmd_fp_pkt)); - } - cmd = cmd->cmd_forw; - } -#endif - mutex_exit(&target->sft_mutex); - target = target->sft_next; - } - } - - /* - * since the loop has just gone online get a new map from - * the transport - */ - if ((ret = soc_get_lilp_map(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, (uint32_t)sf-> - sf_lilp_dmacookie.dmac_address, 1)) != FCAL_SUCCESS) { - if (sf_core && (sf_core & SF_CORE_LILP_FAILED)) { - (void) soc_take_core(sf->sf_sochandle, - sf->sf_socp); - sf_core = 0; - } - sf_log(sf, CE_WARN, - "!soc lilp map failed status=0x%x\n", ret); - mutex_enter(&sf->sf_mutex); - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - sf->sf_lip_cnt++; - sf->sf_state = SF_STATE_OFFLINE; - mutex_exit(&sf->sf_mutex); - return; - } - - /* ensure consistent view of DMA memory */ - (void) ddi_dma_sync(sf->sf_lilp_dmahandle, (off_t)0, (size_t)0, - DDI_DMA_SYNC_FORKERNEL); - - /* how many entries in map ? */ - cnt = sf->sf_lilp_map->lilp_length; - if (cnt >= SF_MAX_LILP_ENTRIES) { - sf_log(sf, CE_WARN, "invalid lilp map\n"); - return; - } - - mutex_enter(&sf->sf_mutex); - sf->sf_device_count = cnt - 1; - sf->sf_al_pa = sf->sf_lilp_map->lilp_myalpa; - lip_cnt = sf->sf_lip_cnt; - al_pa = sf->sf_al_pa; - - SF_DEBUG(1, (sf, CE_CONT, - "!lilp map has %d entries, al_pa is %x\n", cnt, al_pa)); - - /* - * since the last entry of the map may be mine (common) check - * for that, and if it is we have one less entry to look at - */ - if (sf->sf_lilp_map->lilp_alpalist[cnt-1] == al_pa) { - cnt--; - } - /* If we didn't get a valid loop map enable all targets */ - if (sf->sf_lilp_map->lilp_magic == FCAL_BADLILP_MAGIC) { - for (i = 0; i < sizeof (sf_switch_to_alpa); i++) - sf->sf_lilp_map->lilp_alpalist[i] = - sf_switch_to_alpa[i]; - cnt = i; - sf->sf_device_count = cnt - 1; - } - if (sf->sf_device_count == 0) { - sf_finish_init(sf, lip_cnt); - mutex_exit(&sf->sf_mutex); - break; - } - mutex_exit(&sf->sf_mutex); - - SF_DEBUG(2, (sf, CE_WARN, - "!statec_callback: starting with %d targets\n", - sf->sf_device_count)); - - /* scan loop map, logging into all ports (except mine) */ - for (i = 0; i < cnt; i++) { - SF_DEBUG(1, (sf, CE_CONT, - "!lilp map entry %d = %x,%x\n", i, - sf->sf_lilp_map->lilp_alpalist[i], - sf_alpa_to_switch[ - sf->sf_lilp_map->lilp_alpalist[i]])); - /* is this entry for somebody else ? */ - if (sf->sf_lilp_map->lilp_alpalist[i] != al_pa) { - /* do a PLOGI to this port */ - if (!sf_login(sf, LA_ELS_PLOGI, - sf->sf_lilp_map->lilp_alpalist[i], - sf->sf_lilp_map->lilp_alpalist[cnt-1], - lip_cnt)) { - /* a problem logging in */ - mutex_enter(&sf->sf_mutex); - if (lip_cnt == sf->sf_lip_cnt) { - /* - * problem not from a new LIP - */ - sf->sf_device_count--; - ASSERT(sf->sf_device_count - >= 0); - if (sf->sf_device_count == 0) { - sf_finish_init(sf, - lip_cnt); - } - } - mutex_exit(&sf->sf_mutex); - } - } - } - break; - } - - case FCAL_STATUS_ERR_OFFLINE: - /* - * loop has gone offline due to an error - */ - SF_DEBUG(1, (sf, CE_CONT, "sf%d: loop offline\n", - ddi_get_instance(sf->sf_dip))); - mutex_enter(&sf->sf_mutex); - sf->sf_lip_cnt++; - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - if (!sf->sf_online_timer) { - sf->sf_online_timer = sf_watchdog_time + - SF_ONLINE_TIMEOUT; - } - /* - * if we are suspended, preserve the SF_STATE_SUSPENDED flag, - * since throttling logic in sf_watch() depends on - * preservation of this flag while device is suspended - */ - if (sf->sf_state & SF_STATE_SUSPENDED) { - sf->sf_state |= SF_STATE_OFFLINE; - SF_DEBUG(1, (sf, CE_CONT, - "sf_statec_callback, sf%d: " - "got FCAL_STATE_OFFLINE during DDI_SUSPEND\n", - ddi_get_instance(sf->sf_dip))); - } else { - sf->sf_state = SF_STATE_OFFLINE; - } - - /* scan each possible target on the loop */ - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - while (target != NULL) { - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_OFFLINE)) - target->sft_state |= (SF_TARGET_BUSY - | SF_TARGET_MARK); - mutex_exit(&target->sft_mutex); - target = target->sft_next_lun; - } - } - mutex_exit(&sf->sf_mutex); - break; - - case FCAL_STATE_RESET: { - struct sf_els_hdr *privp; /* ptr to private list */ - struct sf_els_hdr *tmpp1; /* tmp prev hdr ptr */ - struct sf_els_hdr *tmpp2; /* tmp next hdr ptr */ - struct sf_els_hdr *head; /* to save our private list */ - struct fcal_packet *fpkt; /* ptr to pkt in hdr */ - - /* - * a transport reset - */ - SF_DEBUG(1, (sf, CE_CONT, "!sf%d: soc reset\n", - ddi_get_instance(sf->sf_dip))); - tmpp1 = head = NULL; - mutex_enter(&sf->sf_mutex); - sf->sf_lip_cnt++; - sf->sf_timer = sf_watchdog_time + SF_RESET_TIMEOUT; - /* - * if we are suspended, preserve the SF_STATE_SUSPENDED flag, - * since throttling logic in sf_watch() depends on - * preservation of this flag while device is suspended - */ - if (sf->sf_state & SF_STATE_SUSPENDED) { - sf->sf_state |= SF_STATE_OFFLINE; - SF_DEBUG(1, (sf, CE_CONT, - "sf_statec_callback, sf%d: " - "got FCAL_STATE_RESET during DDI_SUSPEND\n", - ddi_get_instance(sf->sf_dip))); - } else { - sf->sf_state = SF_STATE_OFFLINE; - } - - /* - * scan each possible target on the loop, looking for targets - * that need callbacks ran - */ - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - while (target != NULL) { - if (!(target->sft_state & SF_TARGET_OFFLINE)) { - target->sft_state |= (SF_TARGET_BUSY - | SF_TARGET_MARK); - mutex_exit(&sf->sf_mutex); - /* - * run remove event callbacks for lun - * - * We have a nasty race condition here - * 'cause we're dropping this mutex to - * run the callback and expect the - * linked list to be the same. - */ - (void) ndi_event_retrieve_cookie( - sf->sf_event_hdl, target->sft_dip, - FCAL_REMOVE_EVENT, &sf_remove_eid, - NDI_EVENT_NOPASS); - (void) ndi_event_run_callbacks( - sf->sf_event_hdl, - target->sft_dip, - sf_remove_eid, NULL); - mutex_enter(&sf->sf_mutex); - } - target = target->sft_next_lun; - } - } - - /* - * scan for ELS commands that are in transport, not complete, - * and have a valid timeout, building a private list - */ - privp = sf->sf_els_list; - while (privp != NULL) { - fpkt = privp->fpkt; - if ((fpkt->fcal_cmd_state & FCAL_CMD_IN_TRANSPORT) && - (!(fpkt->fcal_cmd_state & FCAL_CMD_COMPLETE)) && - (privp->timeout != SF_INVALID_TIMEOUT)) { - /* - * cmd in transport && not complete && - * timeout valid - * - * move this entry from ELS input list to our - * private list - */ - - tmpp2 = privp->next; /* save ptr to next */ - - /* push this on private list head */ - privp->next = head; - head = privp; - - /* remove this entry from input list */ - if (tmpp1 != NULL) { - /* - * remove this entry from somewhere in - * the middle of the list - */ - tmpp1->next = tmpp2; - if (tmpp2 != NULL) { - tmpp2->prev = tmpp1; - } - } else { - /* - * remove this entry from the head - * of the list - */ - sf->sf_els_list = tmpp2; - if (tmpp2 != NULL) { - tmpp2->prev = NULL; - } - } - privp = tmpp2; /* skip to next entry */ - } else { - tmpp1 = privp; /* save ptr to prev entry */ - privp = privp->next; /* skip to next entry */ - } - } - - mutex_exit(&sf->sf_mutex); - - /* - * foreach cmd in our list free the ELS packet associated - * with it - */ - privp = head; - while (privp != NULL) { - fpkt = privp->fpkt; - privp = privp->next; - sf_els_free(fpkt); - } - - /* - * scan for commands from each possible target - */ - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - while (target != NULL) { - /* - * scan all active commands for this target, - * looking for commands that have been issued, - * are in transport, and are not yet complete - * (so we can terminate them because of the - * reset) - */ - mutex_enter(&target->sft_pkt_mutex); - cmd = target->sft_pkt_head; - while (cmd != (struct sf_pkt *)&target-> - sft_pkt_head) { - fpkt = cmd->cmd_fp_pkt; - mutex_enter(&cmd->cmd_abort_mutex); - if ((cmd->cmd_state == - SF_STATE_ISSUED) && - (fpkt->fcal_cmd_state & - FCAL_CMD_IN_TRANSPORT) && - (!(fpkt->fcal_cmd_state & - FCAL_CMD_COMPLETE))) { - /* a command to be reset */ - pkt = cmd->cmd_pkt; - pkt->pkt_reason = CMD_RESET; - pkt->pkt_statistics |= - STAT_BUS_RESET; - cmd->cmd_state = SF_STATE_IDLE; - mutex_exit(&cmd-> - cmd_abort_mutex); - mutex_exit(&target-> - sft_pkt_mutex); - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(pkt); - } - mutex_enter(&target-> - sft_pkt_mutex); - cmd = target->sft_pkt_head; - } else { - mutex_exit(&cmd-> - cmd_abort_mutex); - /* get next command */ - cmd = cmd->cmd_forw; - } - } - mutex_exit(&target->sft_pkt_mutex); - target = target->sft_next_lun; - } - } - - /* - * get packet queue for this target, resetting all remaining - * commands - */ - mutex_enter(&sf->sf_mutex); - cmd = sf->sf_pkt_head; - sf->sf_pkt_head = NULL; - mutex_exit(&sf->sf_mutex); - - while (cmd != NULL) { - pkt = cmd->cmd_pkt; - cmd = cmd->cmd_next; - pkt->pkt_reason = CMD_RESET; - pkt->pkt_statistics |= STAT_BUS_RESET; - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(pkt); - } - } - break; - } - - default: - break; - } -} - - -/* - * called to send a PLOGI (N_port login) ELS request to a destination ID, - * returning TRUE upon success, else returning FALSE - */ -static int -sf_login(struct sf *sf, uchar_t els_code, uchar_t dest_id, uint_t arg1, - int lip_cnt) -{ - struct la_els_logi *logi; - struct sf_els_hdr *privp; - - - if (sf_els_alloc(sf, dest_id, sizeof (struct sf_els_hdr), - sizeof (union sf_els_cmd), sizeof (union sf_els_rsp), - (caddr_t *)&privp, (caddr_t *)&logi) == NULL) { - sf_log(sf, CE_WARN, "Cannot allocate PLOGI for target %x " - "due to DVMA shortage.\n", sf_alpa_to_switch[dest_id]); - return (FALSE); - } - - privp->lip_cnt = lip_cnt; - if (els_code == LA_ELS_PLOGI) { - bcopy((caddr_t)sf->sf_sochandle->fcal_loginparms, - (caddr_t)&logi->common_service, sizeof (struct la_els_logi) - - 4); - bcopy((caddr_t)&sf->sf_sochandle->fcal_p_wwn, - (caddr_t)&logi->nport_ww_name, sizeof (la_wwn_t)); - bcopy((caddr_t)&sf->sf_sochandle->fcal_n_wwn, - (caddr_t)&logi->node_ww_name, sizeof (la_wwn_t)); - bzero((caddr_t)&logi->reserved, 16); - } else if (els_code == LA_ELS_LOGO) { - bcopy((caddr_t)&sf->sf_sochandle->fcal_p_wwn, - (caddr_t)&(((struct la_els_logo *)logi)->nport_ww_name), 8); - ((struct la_els_logo *)logi)->reserved = 0; - ((struct la_els_logo *)logi)->nport_id[0] = 0; - ((struct la_els_logo *)logi)->nport_id[1] = 0; - ((struct la_els_logo *)logi)->nport_id[2] = arg1; - } - - privp->els_code = els_code; - logi->ls_code = els_code; - logi->mbz[0] = 0; - logi->mbz[1] = 0; - logi->mbz[2] = 0; - - privp->timeout = sf_watchdog_time + SF_ELS_TIMEOUT; - return (sf_els_transport(sf, privp)); -} - - -/* - * send an ELS IU via the transport, - * returning TRUE upon success, else returning FALSE - */ -static int -sf_els_transport(struct sf *sf, struct sf_els_hdr *privp) -{ - struct fcal_packet *fpkt = privp->fpkt; - - - (void) ddi_dma_sync(privp->cmd_dma_handle, (off_t)0, (size_t)0, - DDI_DMA_SYNC_FORDEV); - privp->prev = NULL; - mutex_enter(&sf->sf_mutex); - privp->next = sf->sf_els_list; - if (sf->sf_els_list != NULL) { - sf->sf_els_list->prev = privp; - } - sf->sf_els_list = privp; - mutex_exit(&sf->sf_mutex); - - /* call the transport to send a packet */ - if (soc_transport(sf->sf_sochandle, fpkt, FCAL_NOSLEEP, - CQ_REQUEST_1) != FCAL_TRANSPORT_SUCCESS) { - mutex_enter(&sf->sf_mutex); - if (privp->prev != NULL) { - privp->prev->next = privp->next; - } - if (privp->next != NULL) { - privp->next->prev = privp->prev; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - mutex_exit(&sf->sf_mutex); - sf_els_free(fpkt); - return (FALSE); /* failure */ - } - return (TRUE); /* success */ -} - - -/* - * called as the pkt_comp routine for ELS FC packets - */ -static void -sf_els_callback(struct fcal_packet *fpkt) -{ - struct sf_els_hdr *privp = fpkt->fcal_pkt_private; - struct sf *sf = privp->sf; - struct sf *tsf; - int tgt_id; - struct la_els_logi *ptr = (struct la_els_logi *)privp->rsp; - struct la_els_adisc *adisc = (struct la_els_adisc *)ptr; - struct sf_target *target; - short ncmds; - short free_pkt = TRUE; - - - /* - * we've received an ELS callback, i.e. an ELS packet has arrived - */ - - /* take the current packet off of the queue */ - mutex_enter(&sf->sf_mutex); - if (privp->timeout == SF_INVALID_TIMEOUT) { - mutex_exit(&sf->sf_mutex); - return; - } - if (privp->prev != NULL) { - privp->prev->next = privp->next; - } - if (privp->next != NULL) { - privp->next->prev = privp->prev; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - privp->prev = privp->next = NULL; - mutex_exit(&sf->sf_mutex); - - /* get # pkts in this callback */ - ncmds = fpkt->fcal_ncmds; - ASSERT(ncmds >= 0); - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds = ncmds; - mutex_exit(&sf->sf_cmd_mutex); - - /* sync idea of memory */ - (void) ddi_dma_sync(privp->rsp_dma_handle, (off_t)0, (size_t)0, - DDI_DMA_SYNC_FORKERNEL); - - /* was this an OK ACC msg ?? */ - if ((fpkt->fcal_pkt_status == FCAL_STATUS_OK) && - (ptr->ls_code == LA_ELS_ACC)) { - - /* - * this was an OK ACC pkt - */ - - switch (privp->els_code) { - case LA_ELS_PLOGI: - /* - * was able to to an N_port login - */ - SF_DEBUG(2, (sf, CE_CONT, - "!PLOGI to al_pa %x succeeded, wwn %x%x\n", - privp->dest_nport_id, - *((int *)&ptr->nport_ww_name.raw_wwn[0]), - *((int *)&ptr->nport_ww_name.raw_wwn[4]))); - /* try to do a process login */ - if (!sf_do_prli(sf, privp, ptr)) { - free_pkt = FALSE; - goto fail; /* PRLI failed */ - } - break; - case LA_ELS_PRLI: - /* - * was able to do a process login - */ - SF_DEBUG(2, (sf, CE_CONT, - "!PRLI to al_pa %x succeeded\n", - privp->dest_nport_id)); - /* try to do address discovery */ - if (sf_do_adisc(sf, privp) != 1) { - free_pkt = FALSE; - goto fail; /* ADISC failed */ - } - break; - case LA_ELS_ADISC: - /* - * found a target via ADISC - */ - - SF_DEBUG(2, (sf, CE_CONT, - "!ADISC to al_pa %x succeeded\n", - privp->dest_nport_id)); - - /* create the target info */ - if ((target = sf_create_target(sf, privp, - sf_alpa_to_switch[(uchar_t)adisc->hard_address], - (int64_t)0)) - == NULL) { - goto fail; /* can't create target */ - } - - /* - * ensure address discovered matches what we thought - * it would be - */ - if ((uchar_t)adisc->hard_address != - privp->dest_nport_id) { - sf_log(sf, CE_WARN, - "target 0x%x, AL-PA 0x%x and " - "hard address 0x%x don't match\n", - sf_alpa_to_switch[ - (uchar_t)privp->dest_nport_id], - privp->dest_nport_id, - (uchar_t)adisc->hard_address); - mutex_enter(&sf->sf_mutex); - sf_offline_target(sf, target); - mutex_exit(&sf->sf_mutex); - goto fail; /* addr doesn't match */ - } - /* - * get inquiry data from the target - */ - if (!sf_do_reportlun(sf, privp, target)) { - mutex_enter(&sf->sf_mutex); - sf_offline_target(sf, target); - mutex_exit(&sf->sf_mutex); - free_pkt = FALSE; - goto fail; /* inquiry failed */ - } - break; - default: - SF_DEBUG(2, (sf, CE_CONT, - "!ELS %x to al_pa %x succeeded\n", - privp->els_code, privp->dest_nport_id)); - sf_els_free(fpkt); - break; - } - - } else { - - /* - * oh oh -- this was not an OK ACC packet - */ - - /* get target ID from dest loop address */ - tgt_id = sf_alpa_to_switch[(uchar_t)privp->dest_nport_id]; - - /* keep track of failures */ - sf->sf_stats.tstats[tgt_id].els_failures++; - if (++(privp->retries) < sf_els_retries && - fpkt->fcal_pkt_status != FCAL_STATUS_OPEN_FAIL) { - if (fpkt->fcal_pkt_status == - FCAL_STATUS_MAX_XCHG_EXCEEDED) { - tsf = sf->sf_sibling; - if (tsf != NULL) { - mutex_enter(&tsf->sf_cmd_mutex); - tsf->sf_flag = 1; - tsf->sf_throttle = SF_DECR_DELTA; - mutex_exit(&tsf->sf_cmd_mutex); - } - } - privp->timeout = sf_watchdog_time + SF_ELS_TIMEOUT; - privp->prev = NULL; - - mutex_enter(&sf->sf_mutex); - - if (privp->lip_cnt == sf->sf_lip_cnt) { - SF_DEBUG(1, (sf, CE_WARN, - "!ELS %x to al_pa %x failed, retrying", - privp->els_code, privp->dest_nport_id)); - privp->next = sf->sf_els_list; - if (sf->sf_els_list != NULL) { - sf->sf_els_list->prev = privp; - } - - sf->sf_els_list = privp; - - mutex_exit(&sf->sf_mutex); - /* device busy? wait a bit ... */ - if (fpkt->fcal_pkt_status == - FCAL_STATUS_MAX_XCHG_EXCEEDED) { - privp->delayed_retry = 1; - return; - } - /* call the transport to send a pkt */ - if (soc_transport(sf->sf_sochandle, fpkt, - FCAL_NOSLEEP, CQ_REQUEST_1) != - FCAL_TRANSPORT_SUCCESS) { - mutex_enter(&sf->sf_mutex); - if (privp->prev != NULL) { - privp->prev->next = - privp->next; - } - if (privp->next != NULL) { - privp->next->prev = - privp->prev; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - mutex_exit(&sf->sf_mutex); - goto fail; - } else - return; - } else { - mutex_exit(&sf->sf_mutex); - goto fail; - } - } else { -#ifdef DEBUG - if (fpkt->fcal_pkt_status != 0x36 || sfdebug > 4) { - SF_DEBUG(2, (sf, CE_NOTE, "ELS %x to al_pa %x failed", - privp->els_code, privp->dest_nport_id)); - if (fpkt->fcal_pkt_status == FCAL_STATUS_OK) { - SF_DEBUG(2, (sf, CE_NOTE, - "els reply code = %x", ptr->ls_code)); - if (ptr->ls_code == LA_ELS_RJT) - SF_DEBUG(1, (sf, CE_CONT, - "LS_RJT reason = %x\n", - *(((uint_t *)ptr) + 1))); - } else - SF_DEBUG(2, (sf, CE_NOTE, - "fc packet status = %x", - fpkt->fcal_pkt_status)); - } -#endif - goto fail; - } - } - return; /* success */ -fail: - mutex_enter(&sf->sf_mutex); - if (sf->sf_lip_cnt == privp->lip_cnt) { - sf->sf_device_count--; - ASSERT(sf->sf_device_count >= 0); - if (sf->sf_device_count == 0) { - sf_finish_init(sf, privp->lip_cnt); - } - } - mutex_exit(&sf->sf_mutex); - if (free_pkt) { - sf_els_free(fpkt); - } -} - - -/* - * send a PRLI (process login) ELS IU via the transport, - * returning TRUE upon success, else returning FALSE - */ -static int -sf_do_prli(struct sf *sf, struct sf_els_hdr *privp, struct la_els_logi *ptr) -{ - struct la_els_prli *prli = (struct la_els_prli *)privp->cmd; - struct fcp_prli *fprli; - struct fcal_packet *fpkt = privp->fpkt; - - - fpkt->fcal_socal_request.sr_dataseg[0].fc_count = - sizeof (struct la_els_prli); - privp->els_code = LA_ELS_PRLI; - fprli = (struct fcp_prli *)prli->service_params; - prli->ls_code = LA_ELS_PRLI; - prli->page_length = 0x10; - prli->payload_length = sizeof (struct la_els_prli); - fprli->type = 0x08; /* no define here? */ - fprli->resvd1 = 0; - fprli->orig_process_assoc_valid = 0; - fprli->resp_process_assoc_valid = 0; - fprli->establish_image_pair = 1; - fprli->resvd2 = 0; - fprli->resvd3 = 0; - fprli->data_overlay_allowed = 0; - fprli->initiator_fn = 1; - fprli->target_fn = 0; - fprli->cmd_data_mixed = 0; - fprli->data_resp_mixed = 0; - fprli->read_xfer_rdy_disabled = 1; - fprli->write_xfer_rdy_disabled = 0; - - bcopy((caddr_t)&ptr->nport_ww_name, (caddr_t)&privp->port_wwn, - sizeof (privp->port_wwn)); - bcopy((caddr_t)&ptr->node_ww_name, (caddr_t)&privp->node_wwn, - sizeof (privp->node_wwn)); - - privp->timeout = sf_watchdog_time + SF_ELS_TIMEOUT; - return (sf_els_transport(sf, privp)); -} - - -/* - * send an ADISC (address discovery) ELS IU via the transport, - * returning TRUE upon success, else returning FALSE - */ -static int -sf_do_adisc(struct sf *sf, struct sf_els_hdr *privp) -{ - struct la_els_adisc *adisc = (struct la_els_adisc *)privp->cmd; - struct fcal_packet *fpkt = privp->fpkt; - - privp->els_code = LA_ELS_ADISC; - adisc->ls_code = LA_ELS_ADISC; - adisc->mbz[0] = 0; - adisc->mbz[1] = 0; - adisc->mbz[2] = 0; - adisc->hard_address = 0; /* ??? */ - fpkt->fcal_socal_request.sr_dataseg[0].fc_count = - sizeof (struct la_els_adisc); - bcopy((caddr_t)&sf->sf_sochandle->fcal_p_wwn, - (caddr_t)&adisc->port_wwn, sizeof (adisc->port_wwn)); - bcopy((caddr_t)&sf->sf_sochandle->fcal_n_wwn, - (caddr_t)&adisc->node_wwn, sizeof (adisc->node_wwn)); - adisc->nport_id = sf->sf_al_pa; - - privp->timeout = sf_watchdog_time + SF_ELS_TIMEOUT; - return (sf_els_transport(sf, privp)); -} - - -static struct fcal_packet * -sf_els_alloc(struct sf *sf, uchar_t dest_id, int priv_size, int cmd_size, - int rsp_size, caddr_t *rprivp, caddr_t *cmd_buf) -{ - struct fcal_packet *fpkt; - ddi_dma_cookie_t pcookie; - ddi_dma_cookie_t rcookie; - struct sf_els_hdr *privp; - ddi_dma_handle_t cmd_dma_handle = NULL; - ddi_dma_handle_t rsp_dma_handle = NULL; - ddi_acc_handle_t cmd_acc_handle = NULL; - ddi_acc_handle_t rsp_acc_handle = NULL; - size_t real_size; - uint_t ccount; - fc_frame_header_t *hp; - int cmd_bound = FALSE, rsp_bound = FALSE; - caddr_t cmd = NULL; - caddr_t rsp = NULL; - - if ((fpkt = (struct fcal_packet *)kmem_zalloc( - sizeof (struct fcal_packet), KM_NOSLEEP)) == NULL) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not allocate fcal_packet for ELS\n")); - return (NULL); - } - - if ((privp = (struct sf_els_hdr *)kmem_zalloc(priv_size, - KM_NOSLEEP)) == NULL) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not allocate sf_els_hdr for ELS\n")); - goto fail; - } - - privp->size = priv_size; - fpkt->fcal_pkt_private = (caddr_t)privp; - - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle->fcal_dmaattr, - DDI_DMA_DONTWAIT, NULL, &cmd_dma_handle) != DDI_SUCCESS) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not allocate DMA handle for ELS\n")); - goto fail; - } - - if (ddi_dma_mem_alloc(cmd_dma_handle, cmd_size, - sf->sf_sochandle->fcal_accattr, DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &cmd, - &real_size, &cmd_acc_handle) != DDI_SUCCESS) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not allocate DMA memory for ELS\n")); - goto fail; - } - - if (real_size < cmd_size) { - SF_DEBUG(1, (sf, CE_WARN, - "DMA memory too small for ELS\n")); - goto fail; - } - - if (ddi_dma_addr_bind_handle(cmd_dma_handle, NULL, - cmd, real_size, DDI_DMA_WRITE | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &pcookie, &ccount) != DDI_DMA_MAPPED) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not bind DMA memory for ELS\n")); - goto fail; - } - cmd_bound = TRUE; - - if (ccount != 1) { - SF_DEBUG(1, (sf, CE_WARN, - "Wrong cookie count for ELS\n")); - goto fail; - } - - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle->fcal_dmaattr, - DDI_DMA_DONTWAIT, NULL, &rsp_dma_handle) != DDI_SUCCESS) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not allocate DMA handle for ELS rsp\n")); - goto fail; - } - if (ddi_dma_mem_alloc(rsp_dma_handle, rsp_size, - sf->sf_sochandle->fcal_accattr, DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &rsp, - &real_size, &rsp_acc_handle) != DDI_SUCCESS) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not allocate DMA memory for ELS rsp\n")); - goto fail; - } - - if (real_size < rsp_size) { - SF_DEBUG(1, (sf, CE_WARN, - "DMA memory too small for ELS rsp\n")); - goto fail; - } - - if (ddi_dma_addr_bind_handle(rsp_dma_handle, NULL, - rsp, real_size, DDI_DMA_READ | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &rcookie, &ccount) != DDI_DMA_MAPPED) { - SF_DEBUG(1, (sf, CE_WARN, - "Could not bind DMA memory for ELS rsp\n")); - goto fail; - } - rsp_bound = TRUE; - - if (ccount != 1) { - SF_DEBUG(1, (sf, CE_WARN, - "Wrong cookie count for ELS rsp\n")); - goto fail; - } - - privp->cmd = cmd; - privp->sf = sf; - privp->cmd_dma_handle = cmd_dma_handle; - privp->cmd_acc_handle = cmd_acc_handle; - privp->rsp = rsp; - privp->rsp_dma_handle = rsp_dma_handle; - privp->rsp_acc_handle = rsp_acc_handle; - privp->dest_nport_id = dest_id; - privp->fpkt = fpkt; - - fpkt->fcal_pkt_cookie = sf->sf_socp; - fpkt->fcal_pkt_comp = sf_els_callback; - fpkt->fcal_magic = FCALP_MAGIC; - fpkt->fcal_pkt_flags = 0; - fpkt->fcal_socal_request.sr_soc_hdr.sh_flags = - (ushort_t)(SOC_FC_HEADER | sf->sf_sochandle->fcal_portno); - fpkt->fcal_socal_request.sr_soc_hdr.sh_class = 3; - fpkt->fcal_socal_request.sr_soc_hdr.sh_seg_cnt = 2; - fpkt->fcal_socal_request.sr_soc_hdr.sh_byte_cnt = cmd_size; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_count = 1; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_flags = 0; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_seqno = 0; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = CQ_TYPE_SIMPLE; - fpkt->fcal_socal_request.sr_dataseg[0].fc_base = (uint32_t) - pcookie.dmac_address; - fpkt->fcal_socal_request.sr_dataseg[0].fc_count = cmd_size; - fpkt->fcal_socal_request.sr_dataseg[1].fc_base = (uint32_t) - rcookie.dmac_address; - fpkt->fcal_socal_request.sr_dataseg[1].fc_count = rsp_size; - - /* Fill in the Fabric Channel Header */ - hp = &fpkt->fcal_socal_request.sr_fc_frame_hdr; - hp->r_ctl = R_CTL_ELS_REQ; - hp->d_id = dest_id; - hp->s_id = sf->sf_al_pa; - hp->type = TYPE_EXTENDED_LS; - hp->reserved1 = 0; - hp->f_ctl = F_CTL_SEQ_INITIATIVE | F_CTL_FIRST_SEQ; - hp->seq_id = 0; - hp->df_ctl = 0; - hp->seq_cnt = 0; - hp->ox_id = 0xffff; - hp->rx_id = 0xffff; - hp->ro = 0; - - *rprivp = (caddr_t)privp; - *cmd_buf = cmd; - return (fpkt); - -fail: - if (cmd_dma_handle != NULL) { - if (cmd_bound) { - (void) ddi_dma_unbind_handle(cmd_dma_handle); - } - ddi_dma_free_handle(&cmd_dma_handle); - privp->cmd_dma_handle = NULL; - } - if (rsp_dma_handle != NULL) { - if (rsp_bound) { - (void) ddi_dma_unbind_handle(rsp_dma_handle); - } - ddi_dma_free_handle(&rsp_dma_handle); - privp->rsp_dma_handle = NULL; - } - sf_els_free(fpkt); - return (NULL); -} - - -static void -sf_els_free(struct fcal_packet *fpkt) -{ - struct sf_els_hdr *privp = fpkt->fcal_pkt_private; - - if (privp != NULL) { - if (privp->cmd_dma_handle != NULL) { - (void) ddi_dma_unbind_handle(privp->cmd_dma_handle); - ddi_dma_free_handle(&privp->cmd_dma_handle); - } - if (privp->cmd != NULL) { - ddi_dma_mem_free(&privp->cmd_acc_handle); - } - - if (privp->rsp_dma_handle != NULL) { - (void) ddi_dma_unbind_handle(privp->rsp_dma_handle); - ddi_dma_free_handle(&privp->rsp_dma_handle); - } - - if (privp->rsp != NULL) { - ddi_dma_mem_free(&privp->rsp_acc_handle); - } - if (privp->data_dma_handle) { - (void) ddi_dma_unbind_handle(privp->data_dma_handle); - ddi_dma_free_handle(&privp->data_dma_handle); - } - if (privp->data_buf) { - ddi_dma_mem_free(&privp->data_acc_handle); - } - kmem_free(privp, privp->size); - } - kmem_free(fpkt, sizeof (struct fcal_packet)); -} - - -static struct sf_target * -sf_create_target(struct sf *sf, struct sf_els_hdr *privp, int tnum, int64_t lun) -{ - struct sf_target *target, *ntarget, *otarget, *ptarget; - int hash; -#ifdef RAID_LUNS - int64_t orig_lun = lun; - - /* XXXX Work around SCSA limitations. */ - lun = *((short *)&lun); -#endif - ntarget = kmem_zalloc(sizeof (struct sf_target), KM_NOSLEEP); - mutex_enter(&sf->sf_mutex); - if (sf->sf_lip_cnt != privp->lip_cnt) { - mutex_exit(&sf->sf_mutex); - if (ntarget != NULL) - kmem_free(ntarget, sizeof (struct sf_target)); - return (NULL); - } - - target = sf_lookup_target(sf, privp->port_wwn, lun); - if (lun != 0) { - /* - * Since LUNs != 0 are queued up after LUN == 0, find LUN == 0 - * and enqueue the new LUN. - */ - if ((ptarget = sf_lookup_target(sf, privp->port_wwn, - (int64_t)0)) == NULL) { - /* - * Yeep -- no LUN 0? - */ - mutex_exit(&sf->sf_mutex); - sf_log(sf, CE_WARN, "target 0x%x " - "lun %" PRIx64 ": No LUN 0\n", tnum, lun); - if (ntarget != NULL) - kmem_free(ntarget, sizeof (struct sf_target)); - return (NULL); - } - mutex_enter(&ptarget->sft_mutex); - if (target != NULL && ptarget->sft_lip_cnt == sf->sf_lip_cnt && - ptarget->sft_state&SF_TARGET_OFFLINE) { - /* LUN 0 already finished, duplicate its state */ - mutex_exit(&ptarget->sft_mutex); - sf_offline_target(sf, target); - mutex_exit(&sf->sf_mutex); - if (ntarget != NULL) - kmem_free(ntarget, sizeof (struct sf_target)); - return (target); - } else if (target != NULL) { - /* - * LUN 0 online or not examined yet. - * Try to bring the LUN back online - */ - mutex_exit(&ptarget->sft_mutex); - mutex_enter(&target->sft_mutex); - target->sft_lip_cnt = privp->lip_cnt; - target->sft_state |= SF_TARGET_BUSY; - target->sft_state &= ~(SF_TARGET_OFFLINE| - SF_TARGET_MARK); - target->sft_al_pa = (uchar_t)privp->dest_nport_id; - target->sft_hard_address = sf_switch_to_alpa[tnum]; - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - if (ntarget != NULL) - kmem_free(ntarget, sizeof (struct sf_target)); - return (target); - } - mutex_exit(&ptarget->sft_mutex); - if (ntarget == NULL) { - mutex_exit(&sf->sf_mutex); - return (NULL); - } - /* Initialize new target structure */ - bcopy((caddr_t)&privp->node_wwn, - (caddr_t)&ntarget->sft_node_wwn, sizeof (privp->node_wwn)); - bcopy((caddr_t)&privp->port_wwn, - (caddr_t)&ntarget->sft_port_wwn, sizeof (privp->port_wwn)); - ntarget->sft_lun.l = lun; -#ifdef RAID_LUNS - ntarget->sft_lun.l = orig_lun; - ntarget->sft_raid_lun = (uint_t)lun; -#endif - mutex_init(&ntarget->sft_mutex, NULL, MUTEX_DRIVER, NULL); - mutex_init(&ntarget->sft_pkt_mutex, NULL, MUTEX_DRIVER, NULL); - /* Don't let anyone use this till we finishup init. */ - mutex_enter(&ntarget->sft_mutex); - mutex_enter(&ntarget->sft_pkt_mutex); - - hash = SF_HASH(privp->port_wwn, lun); - ntarget->sft_next = sf->sf_wwn_lists[hash]; - sf->sf_wwn_lists[hash] = ntarget; - - ntarget->sft_lip_cnt = privp->lip_cnt; - ntarget->sft_al_pa = (uchar_t)privp->dest_nport_id; - ntarget->sft_hard_address = sf_switch_to_alpa[tnum]; - ntarget->sft_device_type = DTYPE_UNKNOWN; - ntarget->sft_state = SF_TARGET_BUSY; - ntarget->sft_pkt_head = (struct sf_pkt *)&ntarget-> - sft_pkt_head; - ntarget->sft_pkt_tail = (struct sf_pkt *)&ntarget-> - sft_pkt_head; - - mutex_enter(&ptarget->sft_mutex); - /* Traverse the list looking for this target */ - for (target = ptarget; target->sft_next_lun; - target = target->sft_next_lun) { - otarget = target->sft_next_lun; - } - ntarget->sft_next_lun = target->sft_next_lun; - target->sft_next_lun = ntarget; - mutex_exit(&ptarget->sft_mutex); - mutex_exit(&ntarget->sft_pkt_mutex); - mutex_exit(&ntarget->sft_mutex); - mutex_exit(&sf->sf_mutex); - return (ntarget); - - } - if (target != NULL && target->sft_lip_cnt == sf->sf_lip_cnt) { - /* It's been touched this LIP -- duplicate WWNs */ - sf_offline_target(sf, target); /* And all the baby targets */ - mutex_exit(&sf->sf_mutex); - sf_log(sf, CE_WARN, "target 0x%x, duplicate port wwns\n", - tnum); - if (ntarget != NULL) { - kmem_free(ntarget, sizeof (struct sf_target)); - } - return (NULL); - } - - if ((otarget = sf->sf_targets[tnum]) != NULL) { - /* Someone else is in our slot */ - mutex_enter(&otarget->sft_mutex); - if (otarget->sft_lip_cnt == sf->sf_lip_cnt) { - mutex_exit(&otarget->sft_mutex); - sf_offline_target(sf, otarget); - if (target != NULL) - sf_offline_target(sf, target); - mutex_exit(&sf->sf_mutex); - sf_log(sf, CE_WARN, - "target 0x%x, duplicate switch settings\n", tnum); - if (ntarget != NULL) - kmem_free(ntarget, sizeof (struct sf_target)); - return (NULL); - } - mutex_exit(&otarget->sft_mutex); - if (bcmp((caddr_t)&privp->port_wwn, (caddr_t)&otarget-> - sft_port_wwn, sizeof (privp->port_wwn))) { - sf_offline_target(sf, otarget); - mutex_exit(&sf->sf_mutex); - sf_log(sf, CE_WARN, "wwn changed on target 0x%x\n", - tnum); - bzero((caddr_t)&sf->sf_stats.tstats[tnum], - sizeof (struct sf_target_stats)); - mutex_enter(&sf->sf_mutex); - } - } - - sf->sf_targets[tnum] = target; - if ((target = sf->sf_targets[tnum]) == NULL) { - if (ntarget == NULL) { - mutex_exit(&sf->sf_mutex); - return (NULL); - } - bcopy((caddr_t)&privp->node_wwn, - (caddr_t)&ntarget->sft_node_wwn, sizeof (privp->node_wwn)); - bcopy((caddr_t)&privp->port_wwn, - (caddr_t)&ntarget->sft_port_wwn, sizeof (privp->port_wwn)); - ntarget->sft_lun.l = lun; -#ifdef RAID_LUNS - ntarget->sft_lun.l = orig_lun; - ntarget->sft_raid_lun = (uint_t)lun; -#endif - mutex_init(&ntarget->sft_mutex, NULL, MUTEX_DRIVER, NULL); - mutex_init(&ntarget->sft_pkt_mutex, NULL, MUTEX_DRIVER, NULL); - mutex_enter(&ntarget->sft_mutex); - mutex_enter(&ntarget->sft_pkt_mutex); - hash = SF_HASH(privp->port_wwn, lun); /* lun 0 */ - ntarget->sft_next = sf->sf_wwn_lists[hash]; - sf->sf_wwn_lists[hash] = ntarget; - - target = ntarget; - target->sft_lip_cnt = privp->lip_cnt; - target->sft_al_pa = (uchar_t)privp->dest_nport_id; - target->sft_hard_address = sf_switch_to_alpa[tnum]; - target->sft_device_type = DTYPE_UNKNOWN; - target->sft_state = SF_TARGET_BUSY; - target->sft_pkt_head = (struct sf_pkt *)&target-> - sft_pkt_head; - target->sft_pkt_tail = (struct sf_pkt *)&target-> - sft_pkt_head; - sf->sf_targets[tnum] = target; - mutex_exit(&ntarget->sft_mutex); - mutex_exit(&ntarget->sft_pkt_mutex); - mutex_exit(&sf->sf_mutex); - } else { - mutex_enter(&target->sft_mutex); - target->sft_lip_cnt = privp->lip_cnt; - target->sft_state |= SF_TARGET_BUSY; - target->sft_state &= ~(SF_TARGET_OFFLINE|SF_TARGET_MARK); - target->sft_al_pa = (uchar_t)privp->dest_nport_id; - target->sft_hard_address = sf_switch_to_alpa[tnum]; - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - if (ntarget != NULL) - kmem_free(ntarget, sizeof (struct sf_target)); - } - return (target); -} - - -/* - * find the target for a given sf instance - */ -/* ARGSUSED */ -static struct sf_target * -#ifdef RAID_LUNS -sf_lookup_target(struct sf *sf, uchar_t *wwn, int lun) -#else -sf_lookup_target(struct sf *sf, uchar_t *wwn, int64_t lun) -#endif -{ - int hash; - struct sf_target *target; - - ASSERT(mutex_owned(&sf->sf_mutex)); - hash = SF_HASH(wwn, lun); - - target = sf->sf_wwn_lists[hash]; - while (target != NULL) { - -#ifndef RAID_LUNS - if (bcmp((caddr_t)wwn, (caddr_t)&target->sft_port_wwn, - sizeof (target->sft_port_wwn)) == 0 && - target->sft_lun.l == lun) - break; -#else - if (bcmp((caddr_t)wwn, (caddr_t)&target->sft_port_wwn, - sizeof (target->sft_port_wwn)) == 0 && - target->sft_raid_lun == lun) - break; -#endif - target = target->sft_next; - } - - return (target); -} - - -/* - * Send out a REPORT_LUNS command. - */ -static int -sf_do_reportlun(struct sf *sf, struct sf_els_hdr *privp, - struct sf_target *target) -{ - struct fcal_packet *fpkt = privp->fpkt; - ddi_dma_cookie_t pcookie; - ddi_dma_handle_t lun_dma_handle = NULL; - ddi_acc_handle_t lun_acc_handle; - uint_t ccount; - size_t real_size; - caddr_t lun_buf = NULL; - int handle_bound = 0; - fc_frame_header_t *hp = &fpkt->fcal_socal_request.sr_fc_frame_hdr; - struct fcp_cmd *reportlun = (struct fcp_cmd *)privp->cmd; - char *msg = "Transport"; - - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle->fcal_dmaattr, - DDI_DMA_DONTWAIT, NULL, &lun_dma_handle) != DDI_SUCCESS) { - msg = "ddi_dma_alloc_handle()"; - goto fail; - } - - if (ddi_dma_mem_alloc(lun_dma_handle, REPORT_LUNS_SIZE, - sf->sf_sochandle->fcal_accattr, DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &lun_buf, - &real_size, &lun_acc_handle) != DDI_SUCCESS) { - msg = "ddi_dma_mem_alloc()"; - goto fail; - } - - if (real_size < REPORT_LUNS_SIZE) { - msg = "DMA mem < REPORT_LUNS_SIZE"; - goto fail; - } - - if (ddi_dma_addr_bind_handle(lun_dma_handle, NULL, - lun_buf, real_size, DDI_DMA_READ | - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, - NULL, &pcookie, &ccount) != DDI_DMA_MAPPED) { - msg = "ddi_dma_addr_bind_handle()"; - goto fail; - } - handle_bound = 1; - - if (ccount != 1) { - msg = "ccount != 1"; - goto fail; - } - privp->els_code = 0; - privp->target = target; - privp->data_dma_handle = lun_dma_handle; - privp->data_acc_handle = lun_acc_handle; - privp->data_buf = lun_buf; - - fpkt->fcal_pkt_comp = sf_reportlun_callback; - fpkt->fcal_socal_request.sr_soc_hdr.sh_seg_cnt = 3; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = CQ_TYPE_IO_READ; - fpkt->fcal_socal_request.sr_dataseg[0].fc_count = - sizeof (struct fcp_cmd); - fpkt->fcal_socal_request.sr_dataseg[2].fc_base = - (uint32_t)pcookie.dmac_address; - fpkt->fcal_socal_request.sr_dataseg[2].fc_count = pcookie.dmac_size; - fpkt->fcal_socal_request.sr_soc_hdr.sh_byte_cnt = pcookie.dmac_size; - hp->r_ctl = R_CTL_COMMAND; - hp->type = TYPE_SCSI_FCP; - bzero((caddr_t)reportlun, sizeof (struct fcp_cmd)); - ((union scsi_cdb *)reportlun->fcp_cdb)->scc_cmd = SCMD_REPORT_LUNS; - /* Now set the buffer size. If DDI gave us extra, that's O.K. */ - ((union scsi_cdb *)reportlun->fcp_cdb)->scc5_count0 = - (real_size&0x0ff); - ((union scsi_cdb *)reportlun->fcp_cdb)->scc5_count1 = - (real_size>>8)&0x0ff; - ((union scsi_cdb *)reportlun->fcp_cdb)->scc5_count2 = - (real_size>>16)&0x0ff; - ((union scsi_cdb *)reportlun->fcp_cdb)->scc5_count3 = - (real_size>>24)&0x0ff; - reportlun->fcp_cntl.cntl_read_data = 1; - reportlun->fcp_cntl.cntl_write_data = 0; - reportlun->fcp_data_len = pcookie.dmac_size; - reportlun->fcp_cntl.cntl_qtype = FCP_QTYPE_SIMPLE; - - (void) ddi_dma_sync(lun_dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV); - /* We know it's there, so this should be fast */ - privp->timeout = sf_watchdog_time + SF_FCP_TIMEOUT; - if (sf_els_transport(sf, privp) == 1) - return (1); - -fail: - sf_log(sf, CE_WARN, - "%s failure for REPORTLUN to target 0x%x\n", - msg, sf_alpa_to_switch[privp->dest_nport_id]); - sf_els_free(fpkt); - if (lun_dma_handle != NULL) { - if (handle_bound) - (void) ddi_dma_unbind_handle(lun_dma_handle); - ddi_dma_free_handle(&lun_dma_handle); - } - if (lun_buf != NULL) { - ddi_dma_mem_free(&lun_acc_handle); - } - return (0); -} - -/* - * Handle the results of a REPORT_LUNS command: - * Create additional targets if necessary - * Initiate INQUIRYs on all LUNs. - */ -static void -sf_reportlun_callback(struct fcal_packet *fpkt) -{ - struct sf_els_hdr *privp = (struct sf_els_hdr *)fpkt-> - fcal_pkt_private; - struct scsi_report_luns *ptr = - (struct scsi_report_luns *)privp->data_buf; - struct sf *sf = privp->sf; - struct sf_target *target = privp->target; - struct fcp_rsp *rsp = NULL; - int delayed_retry = 0; - int tid = sf_alpa_to_switch[target->sft_hard_address]; - int i, free_pkt = 1; - short ncmds; - - mutex_enter(&sf->sf_mutex); - /* use as temporary state variable */ - if (privp->timeout == SF_INVALID_TIMEOUT) { - mutex_exit(&sf->sf_mutex); - return; - } - if (privp->prev) - privp->prev->next = privp->next; - if (privp->next) - privp->next->prev = privp->prev; - if (sf->sf_els_list == privp) - sf->sf_els_list = privp->next; - privp->prev = privp->next = NULL; - mutex_exit(&sf->sf_mutex); - ncmds = fpkt->fcal_ncmds; - ASSERT(ncmds >= 0); - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds = ncmds; - mutex_exit(&sf->sf_cmd_mutex); - - if (fpkt->fcal_pkt_status == FCAL_STATUS_OK) { - (void) ddi_dma_sync(privp->rsp_dma_handle, 0, - 0, DDI_DMA_SYNC_FORKERNEL); - - rsp = (struct fcp_rsp *)privp->rsp; - } - SF_DEBUG(1, (sf, CE_CONT, - "!REPORTLUN to al_pa %x pkt status %x scsi status %x\n", - privp->dest_nport_id, - fpkt->fcal_pkt_status, - rsp?rsp->fcp_u.fcp_status.scsi_status:0)); - - /* See if target simply does not support REPORT_LUNS. */ - if (rsp && rsp->fcp_u.fcp_status.scsi_status == STATUS_CHECK && - rsp->fcp_u.fcp_status.sense_len_set && - rsp->fcp_sense_len >= - offsetof(struct scsi_extended_sense, es_qual_code)) { - struct scsi_extended_sense *sense; - sense = (struct scsi_extended_sense *) - ((caddr_t)rsp + sizeof (struct fcp_rsp) - + rsp->fcp_response_len); - if (sense->es_key == KEY_ILLEGAL_REQUEST) { - if (sense->es_add_code == 0x20) { - /* Fake LUN 0 */ - SF_DEBUG(1, (sf, CE_CONT, - "!REPORTLUN Faking good " - "completion for alpa %x\n", - privp->dest_nport_id)); - ptr->lun_list_len = FCP_LUN_SIZE; - ptr->lun[0] = 0; - rsp->fcp_u.fcp_status.scsi_status = - STATUS_GOOD; - } else if (sense->es_add_code == 0x25) { - SF_DEBUG(1, (sf, CE_CONT, - "!REPORTLUN device alpa %x " - "key %x code %x\n", - privp->dest_nport_id, - sense->es_key, sense->es_add_code)); - goto fail; - } - } else if (sense->es_key == - KEY_UNIT_ATTENTION && - sense->es_add_code == 0x29) { - SF_DEBUG(1, (sf, CE_CONT, - "!REPORTLUN device alpa %x was reset\n", - privp->dest_nport_id)); - } else { - SF_DEBUG(1, (sf, CE_CONT, - "!REPORTLUN device alpa %x " - "key %x code %x\n", - privp->dest_nport_id, - sense->es_key, sense->es_add_code)); -/* XXXXXX The following is here to handle broken targets -- remove it later */ - if (sf_reportlun_forever && - sense->es_key == KEY_UNIT_ATTENTION) - goto retry; -/* XXXXXX */ - if (sense->es_key == KEY_NOT_READY) - delayed_retry = 1; - } - } - - if (rsp && rsp->fcp_u.fcp_status.scsi_status == STATUS_GOOD) { - struct fcp_rsp_info *bep; - - bep = (struct fcp_rsp_info *)(&rsp-> - fcp_response_len + 1); - if (!rsp->fcp_u.fcp_status.rsp_len_set || - bep->rsp_code == FCP_NO_FAILURE) { - (void) ddi_dma_sync(privp->data_dma_handle, - 0, 0, DDI_DMA_SYNC_FORKERNEL); - - /* Convert from #bytes to #ints */ - ptr->lun_list_len = ptr->lun_list_len >> 3; - SF_DEBUG(2, (sf, CE_CONT, - "!REPORTLUN to al_pa %x succeeded: %d LUNs\n", - privp->dest_nport_id, ptr->lun_list_len)); - if (!ptr->lun_list_len) { - /* No LUNs? Ya gotta be kidding... */ - sf_log(sf, CE_WARN, - "SCSI violation -- " - "target 0x%x reports no LUNs\n", - sf_alpa_to_switch[ - privp->dest_nport_id]); - ptr->lun_list_len = 1; - ptr->lun[0] = 0; - } - - mutex_enter(&sf->sf_mutex); - if (sf->sf_lip_cnt == privp->lip_cnt) { - sf->sf_device_count += ptr->lun_list_len - 1; - } - - mutex_exit(&sf->sf_mutex); - for (i = 0; i < ptr->lun_list_len && privp->lip_cnt == - sf->sf_lip_cnt; i++) { - struct sf_els_hdr *nprivp; - struct fcal_packet *nfpkt; - - /* LUN 0 is already in `target' */ - if (ptr->lun[i] != 0) { - target = sf_create_target(sf, - privp, tid, ptr->lun[i]); - } - nprivp = NULL; - nfpkt = NULL; - if (target) { - nfpkt = sf_els_alloc(sf, - target->sft_al_pa, - sizeof (struct sf_els_hdr), - sizeof (union sf_els_cmd), - sizeof (union sf_els_rsp), - (caddr_t *)&nprivp, - (caddr_t *)&rsp); - if (nprivp) - nprivp->lip_cnt = - privp->lip_cnt; - } - if (nfpkt && nprivp && - (sf_do_inquiry(sf, nprivp, target) == - 0)) { - mutex_enter(&sf->sf_mutex); - if (sf->sf_lip_cnt == privp-> - lip_cnt) { - sf->sf_device_count --; - } - sf_offline_target(sf, target); - mutex_exit(&sf->sf_mutex); - } - } - sf_els_free(fpkt); - return; - } else { - SF_DEBUG(1, (sf, CE_CONT, - "!REPORTLUN al_pa %x fcp failure, " - "fcp_rsp_code %x scsi status %x\n", - privp->dest_nport_id, bep->rsp_code, - rsp ? rsp->fcp_u.fcp_status.scsi_status:0)); - goto fail; - } - } - if (rsp && ((rsp->fcp_u.fcp_status.scsi_status == STATUS_BUSY) || - (rsp->fcp_u.fcp_status.scsi_status == STATUS_QFULL))) { - delayed_retry = 1; - } - - if (++(privp->retries) < sf_els_retries || - (delayed_retry && privp->retries < SF_BSY_RETRIES)) { -/* XXXXXX The following is here to handle broken targets -- remove it later */ -retry: -/* XXXXXX */ - if (delayed_retry) { - privp->retries--; - privp->timeout = sf_watchdog_time + SF_BSY_TIMEOUT; - privp->delayed_retry = 1; - } else { - privp->timeout = sf_watchdog_time + SF_FCP_TIMEOUT; - } - - privp->prev = NULL; - mutex_enter(&sf->sf_mutex); - if (privp->lip_cnt == sf->sf_lip_cnt) { - if (!delayed_retry) - SF_DEBUG(1, (sf, CE_WARN, - "!REPORTLUN to al_pa %x failed, retrying\n", - privp->dest_nport_id)); - privp->next = sf->sf_els_list; - if (sf->sf_els_list != NULL) - sf->sf_els_list->prev = privp; - sf->sf_els_list = privp; - mutex_exit(&sf->sf_mutex); - if (!delayed_retry && soc_transport(sf->sf_sochandle, - fpkt, FCAL_NOSLEEP, CQ_REQUEST_1) != - FCAL_TRANSPORT_SUCCESS) { - mutex_enter(&sf->sf_mutex); - if (privp->prev) - privp->prev->next = privp->next; - if (privp->next) - privp->next->prev = privp->prev; - if (sf->sf_els_list == privp) - sf->sf_els_list = privp->next; - mutex_exit(&sf->sf_mutex); - goto fail; - } else - return; - } else { - mutex_exit(&sf->sf_mutex); - } - } else { -fail: - - /* REPORT_LUN failed -- try inquiry */ - if (sf_do_inquiry(sf, privp, target) != 0) { - return; - } else { - free_pkt = 0; - } - mutex_enter(&sf->sf_mutex); - if (sf->sf_lip_cnt == privp->lip_cnt) { - sf_log(sf, CE_WARN, - "!REPORTLUN to target 0x%x failed\n", - sf_alpa_to_switch[privp->dest_nport_id]); - sf_offline_target(sf, target); - sf->sf_device_count--; - ASSERT(sf->sf_device_count >= 0); - if (sf->sf_device_count == 0) - sf_finish_init(sf, privp->lip_cnt); - } - mutex_exit(&sf->sf_mutex); - } - if (free_pkt) { - sf_els_free(fpkt); - } -} - -static int -sf_do_inquiry(struct sf *sf, struct sf_els_hdr *privp, - struct sf_target *target) -{ - struct fcal_packet *fpkt = privp->fpkt; - ddi_dma_cookie_t pcookie; - ddi_dma_handle_t inq_dma_handle = NULL; - ddi_acc_handle_t inq_acc_handle; - uint_t ccount; - size_t real_size; - caddr_t inq_buf = NULL; - int handle_bound = FALSE; - fc_frame_header_t *hp = &fpkt->fcal_socal_request.sr_fc_frame_hdr; - struct fcp_cmd *inq = (struct fcp_cmd *)privp->cmd; - char *msg = "Transport"; - - - if (ddi_dma_alloc_handle(sf->sf_dip, sf->sf_sochandle->fcal_dmaattr, - DDI_DMA_DONTWAIT, NULL, &inq_dma_handle) != DDI_SUCCESS) { - msg = "ddi_dma_alloc_handle()"; - goto fail; - } - - if (ddi_dma_mem_alloc(inq_dma_handle, SUN_INQSIZE, - sf->sf_sochandle->fcal_accattr, DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &inq_buf, - &real_size, &inq_acc_handle) != DDI_SUCCESS) { - msg = "ddi_dma_mem_alloc()"; - goto fail; - } - - if (real_size < SUN_INQSIZE) { - msg = "DMA mem < inquiry size"; - goto fail; - } - - if (ddi_dma_addr_bind_handle(inq_dma_handle, NULL, - inq_buf, real_size, DDI_DMA_READ | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &pcookie, &ccount) != DDI_DMA_MAPPED) { - msg = "ddi_dma_addr_bind_handle()"; - goto fail; - } - handle_bound = TRUE; - - if (ccount != 1) { - msg = "ccount != 1"; - goto fail; - } - privp->els_code = 0; /* not an ELS command */ - privp->target = target; - privp->data_dma_handle = inq_dma_handle; - privp->data_acc_handle = inq_acc_handle; - privp->data_buf = inq_buf; - fpkt->fcal_pkt_comp = sf_inq_callback; - fpkt->fcal_socal_request.sr_soc_hdr.sh_seg_cnt = 3; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = CQ_TYPE_IO_READ; - fpkt->fcal_socal_request.sr_dataseg[0].fc_count = - sizeof (struct fcp_cmd); - fpkt->fcal_socal_request.sr_dataseg[2].fc_base = - (uint32_t)pcookie.dmac_address; - fpkt->fcal_socal_request.sr_dataseg[2].fc_count = pcookie.dmac_size; - fpkt->fcal_socal_request.sr_soc_hdr.sh_byte_cnt = pcookie.dmac_size; - hp->r_ctl = R_CTL_COMMAND; - hp->type = TYPE_SCSI_FCP; - bzero((caddr_t)inq, sizeof (struct fcp_cmd)); - ((union scsi_cdb *)inq->fcp_cdb)->scc_cmd = SCMD_INQUIRY; - ((union scsi_cdb *)inq->fcp_cdb)->g0_count0 = SUN_INQSIZE; - bcopy((caddr_t)&target->sft_lun.b, (caddr_t)&inq->fcp_ent_addr, - FCP_LUN_SIZE); - inq->fcp_cntl.cntl_read_data = 1; - inq->fcp_cntl.cntl_write_data = 0; - inq->fcp_data_len = pcookie.dmac_size; - inq->fcp_cntl.cntl_qtype = FCP_QTYPE_SIMPLE; - - (void) ddi_dma_sync(inq_dma_handle, (off_t)0, (size_t)0, - DDI_DMA_SYNC_FORDEV); - privp->timeout = sf_watchdog_time + SF_FCP_TIMEOUT; - SF_DEBUG(5, (sf, CE_WARN, - "!Sending INQUIRY to al_pa %x lun %" PRIx64 "\n", - privp->dest_nport_id, - SCSA_LUN(target))); - return (sf_els_transport(sf, privp)); - -fail: - sf_log(sf, CE_WARN, - "%s failure for INQUIRY to target 0x%x\n", - msg, sf_alpa_to_switch[privp->dest_nport_id]); - sf_els_free(fpkt); - if (inq_dma_handle != NULL) { - if (handle_bound) { - (void) ddi_dma_unbind_handle(inq_dma_handle); - } - ddi_dma_free_handle(&inq_dma_handle); - } - if (inq_buf != NULL) { - ddi_dma_mem_free(&inq_acc_handle); - } - return (FALSE); -} - - -/* - * called as the pkt_comp routine for INQ packets - */ -static void -sf_inq_callback(struct fcal_packet *fpkt) -{ - struct sf_els_hdr *privp = (struct sf_els_hdr *)fpkt-> - fcal_pkt_private; - struct scsi_inquiry *prt = (struct scsi_inquiry *)privp->data_buf; - struct sf *sf = privp->sf; - struct sf *tsf; - struct sf_target *target = privp->target; - struct fcp_rsp *rsp; - int delayed_retry = FALSE; - short ncmds; - - - mutex_enter(&sf->sf_mutex); - /* use as temporary state variable */ - if (privp->timeout == SF_INVALID_TIMEOUT) { - mutex_exit(&sf->sf_mutex); - return; - } - if (privp->prev != NULL) { - privp->prev->next = privp->next; - } - if (privp->next != NULL) { - privp->next->prev = privp->prev; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - privp->prev = privp->next = NULL; - mutex_exit(&sf->sf_mutex); - ncmds = fpkt->fcal_ncmds; - ASSERT(ncmds >= 0); - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds = ncmds; - mutex_exit(&sf->sf_cmd_mutex); - - if (fpkt->fcal_pkt_status == FCAL_STATUS_OK) { - - (void) ddi_dma_sync(privp->rsp_dma_handle, (off_t)0, - (size_t)0, DDI_DMA_SYNC_FORKERNEL); - - rsp = (struct fcp_rsp *)privp->rsp; - SF_DEBUG(2, (sf, CE_CONT, - "!INQUIRY to al_pa %x scsi status %x", - privp->dest_nport_id, rsp->fcp_u.fcp_status.scsi_status)); - - if ((rsp->fcp_u.fcp_status.scsi_status == STATUS_GOOD) && - !rsp->fcp_u.fcp_status.resid_over && - (!rsp->fcp_u.fcp_status.resid_under || - ((SUN_INQSIZE - rsp->fcp_resid) >= SUN_MIN_INQLEN))) { - struct fcp_rsp_info *bep; - - bep = (struct fcp_rsp_info *)(&rsp-> - fcp_response_len + 1); - - if (!rsp->fcp_u.fcp_status.rsp_len_set || - (bep->rsp_code == FCP_NO_FAILURE)) { - - SF_DEBUG(2, (sf, CE_CONT, - "!INQUIRY to al_pa %x lun %" PRIx64 - " succeeded\n", - privp->dest_nport_id, SCSA_LUN(target))); - - (void) ddi_dma_sync(privp->data_dma_handle, - (off_t)0, (size_t)0, - DDI_DMA_SYNC_FORKERNEL); - - mutex_enter(&sf->sf_mutex); - - if (sf->sf_lip_cnt == privp->lip_cnt) { - mutex_enter(&target->sft_mutex); - target->sft_device_type = - prt->inq_dtype; - bcopy(prt, &target->sft_inq, - sizeof (*prt)); - mutex_exit(&target->sft_mutex); - sf->sf_device_count--; - ASSERT(sf->sf_device_count >= 0); - if (sf->sf_device_count == 0) { - sf_finish_init(sf, - privp->lip_cnt); - } - } - mutex_exit(&sf->sf_mutex); - sf_els_free(fpkt); - return; - } - } else if ((rsp->fcp_u.fcp_status.scsi_status == - STATUS_BUSY) || - (rsp->fcp_u.fcp_status.scsi_status == STATUS_QFULL) || - (rsp->fcp_u.fcp_status.scsi_status == STATUS_CHECK)) { - delayed_retry = TRUE; - } - } else { - SF_DEBUG(2, (sf, CE_CONT, "!INQUIRY to al_pa %x fc status %x", - privp->dest_nport_id, fpkt->fcal_pkt_status)); - } - - if (++(privp->retries) < sf_els_retries || - (delayed_retry && privp->retries < SF_BSY_RETRIES)) { - if (fpkt->fcal_pkt_status == FCAL_STATUS_MAX_XCHG_EXCEEDED) { - tsf = sf->sf_sibling; - if (tsf != NULL) { - mutex_enter(&tsf->sf_cmd_mutex); - tsf->sf_flag = 1; - tsf->sf_throttle = SF_DECR_DELTA; - mutex_exit(&tsf->sf_cmd_mutex); - } - delayed_retry = 1; - } - if (delayed_retry) { - privp->retries--; - privp->timeout = sf_watchdog_time + SF_BSY_TIMEOUT; - privp->delayed_retry = TRUE; - } else { - privp->timeout = sf_watchdog_time + SF_FCP_TIMEOUT; - } - - privp->prev = NULL; - mutex_enter(&sf->sf_mutex); - if (privp->lip_cnt == sf->sf_lip_cnt) { - if (!delayed_retry) { - SF_DEBUG(1, (sf, CE_WARN, - "INQUIRY to al_pa %x failed, retrying", - privp->dest_nport_id)); - } - privp->next = sf->sf_els_list; - if (sf->sf_els_list != NULL) { - sf->sf_els_list->prev = privp; - } - sf->sf_els_list = privp; - mutex_exit(&sf->sf_mutex); - /* if not delayed call transport to send a pkt */ - if (!delayed_retry && - (soc_transport(sf->sf_sochandle, fpkt, - FCAL_NOSLEEP, CQ_REQUEST_1) != - FCAL_TRANSPORT_SUCCESS)) { - mutex_enter(&sf->sf_mutex); - if (privp->prev != NULL) { - privp->prev->next = privp->next; - } - if (privp->next != NULL) { - privp->next->prev = privp->prev; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - mutex_exit(&sf->sf_mutex); - goto fail; - } - return; - } - mutex_exit(&sf->sf_mutex); - } else { -fail: - mutex_enter(&sf->sf_mutex); - if (sf->sf_lip_cnt == privp->lip_cnt) { - sf_offline_target(sf, target); - sf_log(sf, CE_NOTE, - "INQUIRY to target 0x%x lun %" PRIx64 " failed. " - "Retry Count: %d\n", - sf_alpa_to_switch[privp->dest_nport_id], - SCSA_LUN(target), - privp->retries); - sf->sf_device_count--; - ASSERT(sf->sf_device_count >= 0); - if (sf->sf_device_count == 0) { - sf_finish_init(sf, privp->lip_cnt); - } - } - mutex_exit(&sf->sf_mutex); - } - sf_els_free(fpkt); -} - - -static void -sf_finish_init(struct sf *sf, int lip_cnt) -{ - int i; /* loop index */ - int cflag; - struct sf_target *target; /* current target */ - dev_info_t *dip; - struct sf_hp_elem *elem; /* hotplug element created */ - - SF_DEBUG(1, (sf, CE_WARN, "!sf_finish_init\n")); - ASSERT(mutex_owned(&sf->sf_mutex)); - - /* scan all hash queues */ - for (i = 0; i < SF_NUM_HASH_QUEUES; i++) { - target = sf->sf_wwn_lists[i]; - while (target != NULL) { - mutex_enter(&target->sft_mutex); - - /* see if target is not offline */ - if ((target->sft_state & SF_TARGET_OFFLINE)) { - /* - * target already offline - */ - mutex_exit(&target->sft_mutex); - goto next_entry; - } - - /* - * target is not already offline -- see if it has - * already been marked as ready to go offline - */ - if (target->sft_state & SF_TARGET_MARK) { - /* - * target already marked, so take it offline - */ - mutex_exit(&target->sft_mutex); - sf_offline_target(sf, target); - goto next_entry; - } - - /* clear target busy flag */ - target->sft_state &= ~SF_TARGET_BUSY; - - /* is target init not yet done ?? */ - cflag = !(target->sft_state & SF_TARGET_INIT_DONE); - - /* get pointer to target dip */ - dip = target->sft_dip; - - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - - if (cflag && (dip == NULL)) { - /* - * target init not yet done && - * devinfo not yet created - */ - sf_create_devinfo(sf, target, lip_cnt); - mutex_enter(&sf->sf_mutex); - goto next_entry; - } - - /* - * target init already done || devinfo already created - */ - ASSERT(dip != NULL); - if (!sf_create_props(dip, target, lip_cnt)) { - /* a problem creating properties */ - mutex_enter(&sf->sf_mutex); - goto next_entry; - } - - /* create a new element for the hotplug list */ - if ((elem = kmem_zalloc(sizeof (struct sf_hp_elem), - KM_NOSLEEP)) != NULL) { - - /* fill in the new element */ - elem->dip = dip; - elem->target = target; - elem->what = SF_ONLINE; - - /* add the new element into the hotplug list */ - mutex_enter(&sf->sf_hp_daemon_mutex); - if (sf->sf_hp_elem_tail != NULL) { - sf->sf_hp_elem_tail->next = elem; - sf->sf_hp_elem_tail = elem; - } else { - /* this is the first element in list */ - sf->sf_hp_elem_head = - sf->sf_hp_elem_tail = - elem; - } - cv_signal(&sf->sf_hp_daemon_cv); - mutex_exit(&sf->sf_hp_daemon_mutex); - } else { - /* could not allocate memory for element ?? */ - (void) ndi_devi_online_async(dip, 0); - } - - mutex_enter(&sf->sf_mutex); - -next_entry: - /* ensure no new LIPs have occurred */ - if (sf->sf_lip_cnt != lip_cnt) { - return; - } - target = target->sft_next; - } - - /* done scanning all targets in this queue */ - } - - /* done with all hash queues */ - - sf->sf_state = SF_STATE_ONLINE; - sf->sf_online_timer = 0; -} - - -/* - * create devinfo node - */ -static void -sf_create_devinfo(struct sf *sf, struct sf_target *target, int lip_cnt) -{ - dev_info_t *cdip = NULL; - char *nname = NULL; - char **compatible = NULL; - int ncompatible; - struct scsi_inquiry *inq = &target->sft_inq; - char *scsi_binding_set; - - /* get the 'scsi-binding-set' property */ - if (ddi_prop_lookup_string(DDI_DEV_T_ANY, sf->sf_dip, - DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, "scsi-binding-set", - &scsi_binding_set) != DDI_PROP_SUCCESS) - scsi_binding_set = NULL; - - /* determine the node name and compatible */ - scsi_hba_nodename_compatible_get(inq, scsi_binding_set, - inq->inq_dtype, NULL, &nname, &compatible, &ncompatible); - if (scsi_binding_set) - ddi_prop_free(scsi_binding_set); - - /* if nodename can't be determined then print a message and skip it */ - if (nname == NULL) { -#ifndef RAID_LUNS - sf_log(sf, CE_WARN, "%s%d: no driver for device " - "@w%02x%02x%02x%02x%02x%02x%02x%02x,%x\n" - " compatible: %s", - ddi_driver_name(sf->sf_dip), ddi_get_instance(sf->sf_dip), - target->sft_port_wwn[0], target->sft_port_wwn[1], - target->sft_port_wwn[2], target->sft_port_wwn[3], - target->sft_port_wwn[4], target->sft_port_wwn[5], - target->sft_port_wwn[6], target->sft_port_wwn[7], - target->sft_lun.l, *compatible); -#else - sf_log(sf, CE_WARN, "%s%d: no driver for device " - "@w%02x%02x%02x%02x%02x%02x%02x%02x,%x\n" - " compatible: %s", - ddi_driver_name(sf->sf_dip), ddi_get_instance(sf->sf_dip), - target->sft_port_wwn[0], target->sft_port_wwn[1], - target->sft_port_wwn[2], target->sft_port_wwn[3], - target->sft_port_wwn[4], target->sft_port_wwn[5], - target->sft_port_wwn[6], target->sft_port_wwn[7], - target->sft_raid_lun, *compatible); -#endif - goto fail; - } - - /* allocate the node */ - if (ndi_devi_alloc(sf->sf_dip, nname, - DEVI_SID_NODEID, &cdip) != NDI_SUCCESS) { - goto fail; - } - - /* decorate the node with compatible */ - if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, - "compatible", compatible, ncompatible) != DDI_PROP_SUCCESS) { - goto fail; - } - - /* add addressing properties to the node */ - if (sf_create_props(cdip, target, lip_cnt) != 1) { - goto fail; - } - - mutex_enter(&target->sft_mutex); - if (target->sft_dip != NULL) { - mutex_exit(&target->sft_mutex); - goto fail; - } - target->sft_dip = cdip; - mutex_exit(&target->sft_mutex); - - if (ndi_devi_online_async(cdip, 0) != DDI_SUCCESS) { - goto fail; - } - - scsi_hba_nodename_compatible_free(nname, compatible); - return; - -fail: - scsi_hba_nodename_compatible_free(nname, compatible); - if (cdip != NULL) { - (void) ndi_prop_remove(DDI_DEV_T_NONE, cdip, NODE_WWN_PROP); - (void) ndi_prop_remove(DDI_DEV_T_NONE, cdip, PORT_WWN_PROP); - (void) ndi_prop_remove(DDI_DEV_T_NONE, cdip, LIP_CNT_PROP); - (void) ndi_prop_remove(DDI_DEV_T_NONE, cdip, TARGET_PROP); - (void) ndi_prop_remove(DDI_DEV_T_NONE, cdip, LUN_PROP); - if (ndi_devi_free(cdip) != NDI_SUCCESS) { - sf_log(sf, CE_WARN, "ndi_devi_free failed\n"); - } else { - mutex_enter(&target->sft_mutex); - if (cdip == target->sft_dip) { - target->sft_dip = NULL; - } - mutex_exit(&target->sft_mutex); - } - } -} - -/* - * create required properties, returning TRUE iff we succeed, else - * returning FALSE - */ -static int -sf_create_props(dev_info_t *cdip, struct sf_target *target, int lip_cnt) -{ - int tgt_id = sf_alpa_to_switch[target->sft_al_pa]; - - - if (ndi_prop_update_byte_array(DDI_DEV_T_NONE, - cdip, NODE_WWN_PROP, target->sft_node_wwn, FC_WWN_SIZE) != - DDI_PROP_SUCCESS) { - return (FALSE); - } - - if (ndi_prop_update_byte_array(DDI_DEV_T_NONE, - cdip, PORT_WWN_PROP, target->sft_port_wwn, FC_WWN_SIZE) != - DDI_PROP_SUCCESS) { - return (FALSE); - } - - if (ndi_prop_update_int(DDI_DEV_T_NONE, - cdip, LIP_CNT_PROP, lip_cnt) != DDI_PROP_SUCCESS) { - return (FALSE); - } - - if (ndi_prop_update_int(DDI_DEV_T_NONE, - cdip, TARGET_PROP, tgt_id) != DDI_PROP_SUCCESS) { - return (FALSE); - } - -#ifndef RAID_LUNS - if (ndi_prop_update_int(DDI_DEV_T_NONE, - cdip, LUN_PROP, target->sft_lun.l) != DDI_PROP_SUCCESS) { - return (0); - } -#else - if (ndi_prop_update_int(DDI_DEV_T_NONE, - cdip, LUN_PROP, target->sft_raid_lun) != DDI_PROP_SUCCESS) { - return (0); - } -#endif - - return (TRUE); -} - - -/* - * called by the transport to offline a target - */ -/* ARGSUSED */ -static void -sf_offline_target(struct sf *sf, struct sf_target *target) -{ - dev_info_t *dip; - struct sf_target *next_target = NULL; - struct sf_hp_elem *elem; - - ASSERT(mutex_owned(&sf->sf_mutex)); - - if (sf_core && (sf_core & SF_CORE_OFFLINE_TARGET)) { - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - - while (target != NULL) { - sf_log(sf, CE_NOTE, - "!target 0x%x al_pa 0x%x lun %" PRIx64 " offlined\n", - sf_alpa_to_switch[target->sft_al_pa], - target->sft_al_pa, SCSA_LUN(target)); - mutex_enter(&target->sft_mutex); - target->sft_state &= ~(SF_TARGET_BUSY|SF_TARGET_MARK); - target->sft_state |= SF_TARGET_OFFLINE; - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - - /* XXXX if this is LUN 0, offline all other LUNs */ - if (next_target || target->sft_lun.l == 0) - next_target = target->sft_next_lun; - - /* abort all cmds for this target */ - sf_abort_all(sf, target, FALSE, sf->sf_lip_cnt, FALSE); - - mutex_enter(&sf->sf_mutex); - mutex_enter(&target->sft_mutex); - if (target->sft_state & SF_TARGET_INIT_DONE) { - dip = target->sft_dip; - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - (void) ndi_prop_remove(DDI_DEV_T_NONE, dip, - TARGET_PROP); - (void) ndi_event_retrieve_cookie(sf->sf_event_hdl, - dip, FCAL_REMOVE_EVENT, &sf_remove_eid, - NDI_EVENT_NOPASS); - (void) ndi_event_run_callbacks(sf->sf_event_hdl, - target->sft_dip, sf_remove_eid, NULL); - - elem = kmem_zalloc(sizeof (struct sf_hp_elem), - KM_NOSLEEP); - if (elem != NULL) { - elem->dip = dip; - elem->target = target; - elem->what = SF_OFFLINE; - mutex_enter(&sf->sf_hp_daemon_mutex); - if (sf->sf_hp_elem_tail != NULL) { - sf->sf_hp_elem_tail->next = elem; - sf->sf_hp_elem_tail = elem; - } else { - sf->sf_hp_elem_head = - sf->sf_hp_elem_tail = - elem; - } - cv_signal(&sf->sf_hp_daemon_cv); - mutex_exit(&sf->sf_hp_daemon_mutex); - } else { - /* don't do NDI_DEVI_REMOVE for now */ - if (ndi_devi_offline(dip, 0) != NDI_SUCCESS) { - SF_DEBUG(1, (sf, CE_WARN, - "target %x lun %" PRIx64 ", " - "device offline failed", - sf_alpa_to_switch[target-> - sft_al_pa], - SCSA_LUN(target))); - } else { - SF_DEBUG(1, (sf, CE_NOTE, - "target %x, lun %" PRIx64 ", " - "device offline succeeded\n", - sf_alpa_to_switch[target-> - sft_al_pa], - SCSA_LUN(target))); - } - } - mutex_enter(&sf->sf_mutex); - } else { - mutex_exit(&target->sft_mutex); - } - target = next_target; - } -} - - -/* - * routine to get/set a capability - * - * returning: - * 1 (TRUE) boolean capability is true (on get) - * 0 (FALSE) invalid capability, can't set capability (on set), - * or boolean capability is false (on get) - * -1 (UNDEFINED) can't find capability (SCSA) or unsupported capability - * 3 when getting SCSI version number - * AL_PA when getting port initiator ID - */ -static int -sf_commoncap(struct scsi_address *ap, char *cap, - int val, int tgtonly, int doset) -{ - struct sf *sf = ADDR2SF(ap); - int cidx; - int rval = FALSE; - - - if (cap == NULL) { - SF_DEBUG(3, (sf, CE_WARN, "sf_commoncap: invalid arg")); - return (rval); - } - - /* get index of capability string */ - if ((cidx = scsi_hba_lookup_capstr(cap)) == -1) { - /* can't find capability */ - return (UNDEFINED); - } - - if (doset) { - /* - * Process setcap request. - */ - - /* - * At present, we can only set binary (0/1) values - */ - switch (cidx) { - case SCSI_CAP_ARQ: /* can't set this capability */ - break; - default: - SF_DEBUG(3, (sf, CE_WARN, - "sf_setcap: unsupported %d", cidx)); - rval = UNDEFINED; - break; - } - - SF_DEBUG(4, (sf, CE_NOTE, - "set cap: cap=%s,val=0x%x,tgtonly=0x%x" - ",doset=0x%x,rval=%d\n", - cap, val, tgtonly, doset, rval)); - - } else { - /* - * Process getcap request. - */ - switch (cidx) { - case SCSI_CAP_DMA_MAX: - break; /* don't' have this capability */ - case SCSI_CAP_INITIATOR_ID: - rval = sf->sf_al_pa; - break; - case SCSI_CAP_ARQ: - rval = TRUE; /* do have this capability */ - break; - case SCSI_CAP_RESET_NOTIFICATION: - case SCSI_CAP_TAGGED_QING: - rval = TRUE; /* do have this capability */ - break; - case SCSI_CAP_SCSI_VERSION: - rval = 3; - break; - case SCSI_CAP_INTERCONNECT_TYPE: - rval = INTERCONNECT_FIBRE; - break; - default: - SF_DEBUG(4, (sf, CE_WARN, - "sf_scsi_getcap: unsupported")); - rval = UNDEFINED; - break; - } - SF_DEBUG(4, (sf, CE_NOTE, - "get cap: cap=%s,val=0x%x,tgtonly=0x%x," - "doset=0x%x,rval=%d\n", - cap, val, tgtonly, doset, rval)); - } - - return (rval); -} - - -/* - * called by the transport to get a capability - */ -static int -sf_getcap(struct scsi_address *ap, char *cap, int whom) -{ - return (sf_commoncap(ap, cap, 0, whom, FALSE)); -} - - -/* - * called by the transport to set a capability - */ -static int -sf_setcap(struct scsi_address *ap, char *cap, int value, int whom) -{ - return (sf_commoncap(ap, cap, value, whom, TRUE)); -} - - -/* - * called by the transport to abort a target - */ -static int -sf_abort(struct scsi_address *ap, struct scsi_pkt *pkt) -{ - struct sf *sf = ADDR2SF(ap); - struct sf_target *target = ADDR2TARGET(ap); - struct sf_pkt *cmd, *ncmd, *pcmd; - struct fcal_packet *fpkt; - int rval = 0, t, my_rval = FALSE; - int old_target_state; - int lip_cnt; - int tgt_id; - fc_frame_header_t *hp; - int deferred_destroy; - - deferred_destroy = 0; - - if (pkt != NULL) { - cmd = PKT2CMD(pkt); - fpkt = cmd->cmd_fp_pkt; - SF_DEBUG(2, (sf, CE_NOTE, "sf_abort packet %p\n", - (void *)fpkt)); - pcmd = NULL; - mutex_enter(&sf->sf_cmd_mutex); - ncmd = sf->sf_pkt_head; - while (ncmd != NULL) { - if (ncmd == cmd) { - if (pcmd != NULL) { - pcmd->cmd_next = cmd->cmd_next; - } else { - sf->sf_pkt_head = cmd->cmd_next; - } - cmd->cmd_flags &= ~CFLAG_IN_QUEUE; - cmd->cmd_state = SF_STATE_IDLE; - pkt->pkt_reason = CMD_ABORTED; - pkt->pkt_statistics |= STAT_ABORTED; - my_rval = TRUE; - break; - } else { - pcmd = ncmd; - ncmd = ncmd->cmd_next; - } - } - mutex_exit(&sf->sf_cmd_mutex); - if (ncmd == NULL) { - mutex_enter(&cmd->cmd_abort_mutex); - if (cmd->cmd_state == SF_STATE_ISSUED) { - cmd->cmd_state = SF_STATE_ABORTING; - cmd->cmd_timeout = sf_watchdog_time + 20; - mutex_exit(&cmd->cmd_abort_mutex); - /* call transport to abort command */ - if (((rval = soc_abort(sf->sf_sochandle, - sf->sf_socp, sf->sf_sochandle->fcal_portno, - fpkt, 1)) == FCAL_ABORTED) || - (rval == FCAL_ABORT_FAILED)) { - my_rval = TRUE; - pkt->pkt_reason = CMD_ABORTED; - pkt->pkt_statistics |= STAT_ABORTED; - cmd->cmd_state = SF_STATE_IDLE; - } else if (rval == FCAL_BAD_ABORT) { - cmd->cmd_timeout = sf_watchdog_time - + 20; - my_rval = FALSE; - } else { - SF_DEBUG(1, (sf, CE_NOTE, - "Command Abort failed\n")); - } - } else { - mutex_exit(&cmd->cmd_abort_mutex); - } - } - } else { - SF_DEBUG(2, (sf, CE_NOTE, "sf_abort target\n")); - mutex_enter(&sf->sf_mutex); - lip_cnt = sf->sf_lip_cnt; - mutex_enter(&target->sft_mutex); - if (target->sft_state & (SF_TARGET_BUSY | - SF_TARGET_OFFLINE)) { - mutex_exit(&target->sft_mutex); - return (rval); - } - old_target_state = target->sft_state; - target->sft_state |= SF_TARGET_BUSY; - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - - if ((pkt = sf_scsi_init_pkt(ap, NULL, NULL, 0, - 0, 0, 0, NULL, 0)) != NULL) { - - cmd = PKT2CMD(pkt); - cmd->cmd_block->fcp_cntl.cntl_abort_tsk = 1; - cmd->cmd_fp_pkt->fcal_pkt_comp = NULL; - cmd->cmd_pkt->pkt_flags |= FLAG_NOINTR; - - /* prepare the packet for transport */ - if (sf_prepare_pkt(sf, cmd, target) == TRAN_ACCEPT) { - - cmd->cmd_state = SF_STATE_ISSUED; - /* - * call transport to send a pkt polled - * - * if that fails call the transport to abort it - */ - if (soc_transport_poll(sf->sf_sochandle, - cmd->cmd_fp_pkt, SF_ABORT_TIMEOUT, - CQ_REQUEST_1) == FCAL_TRANSPORT_SUCCESS) { - (void) ddi_dma_sync( - cmd->cmd_cr_pool->rsp_dma_handle, - (off_t) - ((caddr_t)cmd->cmd_rsp_block - - cmd->cmd_cr_pool->rsp_base), - FCP_MAX_RSP_IU_SIZE, - DDI_DMA_SYNC_FORKERNEL); - if (((struct fcp_rsp_info *) - (&cmd->cmd_rsp_block-> - fcp_response_len + 1))-> - rsp_code == FCP_NO_FAILURE) { - /* abort cmds for this targ */ - sf_abort_all(sf, target, TRUE, - lip_cnt, TRUE); - } else { - hp = &cmd->cmd_fp_pkt-> - fcal_socal_request. - sr_fc_frame_hdr; - tgt_id = sf_alpa_to_switch[ - (uchar_t)hp->d_id]; - sf->sf_stats.tstats[tgt_id]. - task_mgmt_failures++; - SF_DEBUG(1, (sf, CE_NOTE, - "Target %d Abort Task " - "Set failed\n", hp->d_id)); - } - } else { - mutex_enter(&cmd->cmd_abort_mutex); - if (cmd->cmd_state == SF_STATE_ISSUED) { - cmd->cmd_state = SF_STATE_ABORTING; - cmd->cmd_timeout = sf_watchdog_time - + 20; - mutex_exit(&cmd->cmd_abort_mutex); - if ((t = soc_abort(sf->sf_sochandle, - sf->sf_socp, sf->sf_sochandle-> - fcal_portno, cmd->cmd_fp_pkt, 1)) != - FCAL_ABORTED && - (t != FCAL_ABORT_FAILED)) { - sf_log(sf, CE_NOTE, - "sf_abort failed, " - "initiating LIP\n"); - sf_force_lip(sf); - deferred_destroy = 1; - } - } else { - mutex_exit(&cmd->cmd_abort_mutex); - } - } - } - if (!deferred_destroy) { - cmd->cmd_fp_pkt->fcal_pkt_comp = - sf_cmd_callback; - cmd->cmd_block->fcp_cntl.cntl_abort_tsk = 0; - sf_scsi_destroy_pkt(ap, pkt); - my_rval = TRUE; - } - } - mutex_enter(&sf->sf_mutex); - if (lip_cnt == sf->sf_lip_cnt) { - mutex_enter(&target->sft_mutex); - target->sft_state = old_target_state; - mutex_exit(&target->sft_mutex); - } - mutex_exit(&sf->sf_mutex); - } - return (my_rval); -} - - -/* - * called by the transport and internally to reset a target - */ -static int -sf_reset(struct scsi_address *ap, int level) -{ - struct scsi_pkt *pkt; - struct fcal_packet *fpkt; - struct sf *sf = ADDR2SF(ap); - struct sf_target *target = ADDR2TARGET(ap), *ntarget; - struct sf_pkt *cmd; - int rval = FALSE, t; - int lip_cnt; - int tgt_id, ret; - fc_frame_header_t *hp; - int deferred_destroy; - - /* We don't support RESET_LUN yet. */ - if (level == RESET_TARGET) { - struct sf_reset_list *p; - - if ((p = kmem_alloc(sizeof (struct sf_reset_list), KM_NOSLEEP)) - == NULL) - return (rval); - - SF_DEBUG(2, (sf, CE_NOTE, "sf_reset target\n")); - mutex_enter(&sf->sf_mutex); - /* All target resets go to LUN 0 */ - if (target->sft_lun.l) { - target = sf_lookup_target(sf, target->sft_port_wwn, 0); - } - mutex_enter(&target->sft_mutex); - if (target->sft_state & (SF_TARGET_BUSY | - SF_TARGET_OFFLINE)) { - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - kmem_free(p, sizeof (struct sf_reset_list)); - return (rval); - } - lip_cnt = sf->sf_lip_cnt; - target->sft_state |= SF_TARGET_BUSY; - for (ntarget = target->sft_next_lun; - ntarget; - ntarget = ntarget->sft_next_lun) { - mutex_enter(&ntarget->sft_mutex); - /* - * XXXX If we supported RESET_LUN we should check here - * to see if any LUN were being reset and somehow fail - * that operation. - */ - ntarget->sft_state |= SF_TARGET_BUSY; - mutex_exit(&ntarget->sft_mutex); - } - mutex_exit(&target->sft_mutex); - mutex_exit(&sf->sf_mutex); - - deferred_destroy = 0; - if ((pkt = sf_scsi_init_pkt(ap, NULL, NULL, 0, - 0, 0, 0, NULL, 0)) != NULL) { - cmd = PKT2CMD(pkt); - cmd->cmd_block->fcp_cntl.cntl_reset = 1; - cmd->cmd_fp_pkt->fcal_pkt_comp = NULL; - cmd->cmd_pkt->pkt_flags |= FLAG_NOINTR; - - /* prepare the packet for transport */ - if (sf_prepare_pkt(sf, cmd, target) == TRAN_ACCEPT) { - /* call transport to send a pkt polled */ - cmd->cmd_state = SF_STATE_ISSUED; - if ((ret = soc_transport_poll(sf->sf_sochandle, - cmd->cmd_fp_pkt, SF_ABORT_TIMEOUT, - CQ_REQUEST_1)) == FCAL_TRANSPORT_SUCCESS) { - (void) ddi_dma_sync(cmd->cmd_cr_pool-> - rsp_dma_handle, (caddr_t)cmd-> - cmd_rsp_block - cmd->cmd_cr_pool-> - rsp_base, FCP_MAX_RSP_IU_SIZE, - DDI_DMA_SYNC_FORKERNEL); - fpkt = cmd->cmd_fp_pkt; - if ((fpkt->fcal_pkt_status == - FCAL_STATUS_OK) && - (((struct fcp_rsp_info *) - (&cmd->cmd_rsp_block-> - fcp_response_len + 1))-> - rsp_code == FCP_NO_FAILURE)) { - sf_log(sf, CE_NOTE, - "!sf%d: Target 0x%x Reset " - "successful\n", - ddi_get_instance(\ - sf->sf_dip), - sf_alpa_to_switch[ - target->sft_al_pa]); - rval = TRUE; - } else { - hp = &cmd->cmd_fp_pkt-> - fcal_socal_request. - sr_fc_frame_hdr; - tgt_id = sf_alpa_to_switch[ - (uchar_t)hp->d_id]; - sf->sf_stats.tstats[tgt_id]. - task_mgmt_failures++; - sf_log(sf, CE_NOTE, - "!sf%d: Target 0x%x " - "Reset failed." - "Status code 0x%x " - "Resp code 0x%x\n", - ddi_get_instance(\ - sf->sf_dip), - tgt_id, - fpkt->fcal_pkt_status, - ((struct fcp_rsp_info *) - (&cmd->cmd_rsp_block-> - fcp_response_len + 1))-> - rsp_code); - } - } else { - sf_log(sf, CE_NOTE, "!sf%d: Target " - "0x%x Reset Failed. Ret=%x\n", - ddi_get_instance(sf->sf_dip), - sf_alpa_to_switch[ - target->sft_al_pa], ret); - mutex_enter(&cmd->cmd_abort_mutex); - if (cmd->cmd_state == SF_STATE_ISSUED) { - /* call the transport to abort a cmd */ - cmd->cmd_timeout = sf_watchdog_time - + 20; - cmd->cmd_state = SF_STATE_ABORTING; - mutex_exit(&cmd->cmd_abort_mutex); - if (((t = soc_abort(sf->sf_sochandle, - sf->sf_socp, - sf->sf_sochandle->fcal_portno, - cmd->cmd_fp_pkt, 1)) != - FCAL_ABORTED) && - (t != FCAL_ABORT_FAILED)) { - sf_log(sf, CE_NOTE, - "!sf%d: Target 0x%x Reset " - "failed. Abort Failed, " - "forcing LIP\n", - ddi_get_instance( - sf->sf_dip), - sf_alpa_to_switch[ - target->sft_al_pa]); - sf_force_lip(sf); - rval = TRUE; - deferred_destroy = 1; - } - } else { - mutex_exit - (&cmd->cmd_abort_mutex); - } - } - } - /* - * Defer releasing the packet if we abort returned with - * a BAD_ABORT or timed out, because there is a - * possibility that the ucode might return it. - * We wait for at least 20s and let it be released - * by the sf_watch thread - */ - if (!deferred_destroy) { - cmd->cmd_block->fcp_cntl.cntl_reset = 0; - cmd->cmd_fp_pkt->fcal_pkt_comp = - sf_cmd_callback; - cmd->cmd_state = SF_STATE_IDLE; - /* for cache */ - sf_scsi_destroy_pkt(ap, pkt); - } - } else { - cmn_err(CE_WARN, "!sf%d: Target 0x%x Reset Failed. " - "Resource allocation error.\n", - ddi_get_instance(sf->sf_dip), - sf_alpa_to_switch[target->sft_al_pa]); - } - mutex_enter(&sf->sf_mutex); - if ((rval == TRUE) && (lip_cnt == sf->sf_lip_cnt)) { - p->target = target; - p->lip_cnt = lip_cnt; - p->timeout = ddi_get_lbolt() + - drv_usectohz(SF_TARGET_RESET_DELAY); - p->next = sf->sf_reset_list; - sf->sf_reset_list = p; - mutex_exit(&sf->sf_mutex); - mutex_enter(&sf_global_mutex); - if (sf_reset_timeout_id == 0) { - sf_reset_timeout_id = timeout( - sf_check_reset_delay, NULL, - drv_usectohz(SF_TARGET_RESET_DELAY)); - } - mutex_exit(&sf_global_mutex); - } else { - if (lip_cnt == sf->sf_lip_cnt) { - mutex_enter(&target->sft_mutex); - target->sft_state &= ~SF_TARGET_BUSY; - for (ntarget = target->sft_next_lun; - ntarget; - ntarget = ntarget->sft_next_lun) { - mutex_enter(&ntarget->sft_mutex); - ntarget->sft_state &= ~SF_TARGET_BUSY; - mutex_exit(&ntarget->sft_mutex); - } - mutex_exit(&target->sft_mutex); - } - mutex_exit(&sf->sf_mutex); - kmem_free(p, sizeof (struct sf_reset_list)); - } - } else { - mutex_enter(&sf->sf_mutex); - if ((sf->sf_state == SF_STATE_OFFLINE) && - (sf_watchdog_time < sf->sf_timer)) { - /* - * We are currently in a lip, so let this one - * finish before forcing another one. - */ - mutex_exit(&sf->sf_mutex); - return (TRUE); - } - mutex_exit(&sf->sf_mutex); - sf_log(sf, CE_NOTE, "!sf:Target driver initiated lip\n"); - sf_force_lip(sf); - rval = TRUE; - } - return (rval); -} - - -/* - * abort all commands for a target - * - * if try_abort is set then send an abort - * if abort is set then this is abort, else this is a reset - */ -static void -sf_abort_all(struct sf *sf, struct sf_target *target, int abort, int - lip_cnt, int try_abort) -{ - struct sf_target *ntarget; - struct sf_pkt *cmd, *head = NULL, *tail = NULL, *pcmd = NULL, *tcmd; - struct fcal_packet *fpkt; - struct scsi_pkt *pkt; - int rval = FCAL_ABORTED; - - /* - * First pull all commands for all LUNs on this target out of the - * overflow list. We can tell it's the same target by comparing - * the node WWN. - */ - mutex_enter(&sf->sf_mutex); - if (lip_cnt == sf->sf_lip_cnt) { - mutex_enter(&sf->sf_cmd_mutex); - cmd = sf->sf_pkt_head; - while (cmd != NULL) { - ntarget = ADDR2TARGET(&cmd->cmd_pkt-> - pkt_address); - if (ntarget == target) { - if (pcmd != NULL) - pcmd->cmd_next = cmd->cmd_next; - else - sf->sf_pkt_head = cmd->cmd_next; - if (sf->sf_pkt_tail == cmd) { - sf->sf_pkt_tail = pcmd; - if (pcmd != NULL) - pcmd->cmd_next = NULL; - } - tcmd = cmd->cmd_next; - if (head == NULL) { - head = cmd; - tail = cmd; - } else { - tail->cmd_next = cmd; - tail = cmd; - } - cmd->cmd_next = NULL; - cmd = tcmd; - } else { - pcmd = cmd; - cmd = cmd->cmd_next; - } - } - mutex_exit(&sf->sf_cmd_mutex); - } - mutex_exit(&sf->sf_mutex); - - /* - * Now complete all the commands on our list. In the process, - * the completion routine may take the commands off the target - * lists. - */ - cmd = head; - while (cmd != NULL) { - pkt = cmd->cmd_pkt; - if (abort) { - pkt->pkt_reason = CMD_ABORTED; - pkt->pkt_statistics |= STAT_ABORTED; - } else { - pkt->pkt_reason = CMD_RESET; - pkt->pkt_statistics |= STAT_DEV_RESET; - } - cmd->cmd_flags &= ~CFLAG_IN_QUEUE; - cmd->cmd_state = SF_STATE_IDLE; - cmd = cmd->cmd_next; - /* - * call the packet completion routine only for - * non-polled commands. Ignore the polled commands as - * they timeout and will be handled differently - */ - if ((pkt->pkt_comp) && !(pkt->pkt_flags & FLAG_NOINTR)) - (*pkt->pkt_comp)(pkt); - - } - - /* - * Finally get all outstanding commands for each LUN, and abort them if - * they've been issued, and call the completion routine. - * For the case where sf_offline_target is called from sf_watch - * due to a Offline Timeout, it is quite possible that the soc+ - * ucode is hosed and therefore cannot return the commands. - * Clear up all the issued commands as well. - * Try_abort will be false only if sf_abort_all is coming from - * sf_target_offline. - */ - - if (try_abort || sf->sf_state == SF_STATE_OFFLINE) { - mutex_enter(&target->sft_pkt_mutex); - cmd = tcmd = target->sft_pkt_head; - while (cmd != (struct sf_pkt *)&target->sft_pkt_head) { - fpkt = cmd->cmd_fp_pkt; - pkt = cmd->cmd_pkt; - mutex_enter(&cmd->cmd_abort_mutex); - if ((cmd->cmd_state == SF_STATE_ISSUED) && - (fpkt->fcal_cmd_state & - FCAL_CMD_IN_TRANSPORT) && - ((fpkt->fcal_cmd_state & FCAL_CMD_COMPLETE) == - 0) && !(pkt->pkt_flags & FLAG_NOINTR)) { - cmd->cmd_state = SF_STATE_ABORTING; - cmd->cmd_timeout = sf_watchdog_time + - cmd->cmd_pkt->pkt_time + 20; - mutex_exit(&cmd->cmd_abort_mutex); - mutex_exit(&target->sft_pkt_mutex); - if (try_abort) { - /* call the transport to abort a pkt */ - rval = soc_abort(sf->sf_sochandle, - sf->sf_socp, - sf->sf_sochandle->fcal_portno, - fpkt, 1); - } - if ((rval == FCAL_ABORTED) || - (rval == FCAL_ABORT_FAILED)) { - if (abort) { - pkt->pkt_reason = CMD_ABORTED; - pkt->pkt_statistics |= - STAT_ABORTED; - } else { - pkt->pkt_reason = CMD_RESET; - pkt->pkt_statistics |= - STAT_DEV_RESET; - } - cmd->cmd_state = SF_STATE_IDLE; - if (pkt->pkt_comp) - (*pkt->pkt_comp)(pkt); - } - mutex_enter(&sf->sf_mutex); - if (lip_cnt != sf->sf_lip_cnt) { - mutex_exit(&sf->sf_mutex); - return; - } - mutex_exit(&sf->sf_mutex); - mutex_enter(&target->sft_pkt_mutex); - cmd = target->sft_pkt_head; - } else { - mutex_exit(&cmd->cmd_abort_mutex); - cmd = cmd->cmd_forw; - } - } - mutex_exit(&target->sft_pkt_mutex); - } -} - - -/* - * called by the transport to start a packet - */ -static int -sf_start(struct scsi_address *ap, struct scsi_pkt *pkt) -{ - struct sf *sf = ADDR2SF(ap); - struct sf_target *target = ADDR2TARGET(ap); - struct sf_pkt *cmd = PKT2CMD(pkt); - int rval; - - - SF_DEBUG(6, (sf, CE_NOTE, "sf_start\n")); - - if (cmd->cmd_state == SF_STATE_ISSUED) { - cmn_err(CE_PANIC, "sf: issuing packet twice 0x%p\n", - (void *)cmd); - } - - /* prepare the packet for transport */ - if ((rval = sf_prepare_pkt(sf, cmd, target)) != TRAN_ACCEPT) { - return (rval); - } - - if (target->sft_state & (SF_TARGET_BUSY|SF_TARGET_OFFLINE)) { - if (target->sft_state & SF_TARGET_OFFLINE) { - return (TRAN_FATAL_ERROR); - } - if (pkt->pkt_flags & FLAG_NOINTR) { - return (TRAN_BUSY); - } - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_use_lock = TRUE; - goto enque; - } - - - /* if no interrupts then do polled I/O */ - if (pkt->pkt_flags & FLAG_NOINTR) { - return (sf_dopoll(sf, cmd)); - } - - /* regular interrupt-driven I/O */ - - if (!sf->sf_use_lock) { - - /* locking no needed */ - - cmd->cmd_timeout = cmd->cmd_pkt->pkt_time ? - sf_watchdog_time + cmd->cmd_pkt->pkt_time : 0; - cmd->cmd_state = SF_STATE_ISSUED; - - /* call the transport to send a pkt */ - if (soc_transport(sf->sf_sochandle, cmd->cmd_fp_pkt, - FCAL_NOSLEEP, CQ_REQUEST_1) != FCAL_TRANSPORT_SUCCESS) { - cmd->cmd_state = SF_STATE_IDLE; - return (TRAN_BADPKT); - } - return (TRAN_ACCEPT); - } - - /* regular I/O using locking */ - - mutex_enter(&sf->sf_cmd_mutex); - if ((sf->sf_ncmds >= sf->sf_throttle) || - (sf->sf_pkt_head != NULL)) { -enque: - /* - * either we're throttling back or there are already commands - * on the queue, so enqueue this one for later - */ - cmd->cmd_flags |= CFLAG_IN_QUEUE; - if (sf->sf_pkt_head != NULL) { - /* add to the queue */ - sf->sf_pkt_tail->cmd_next = cmd; - cmd->cmd_next = NULL; - sf->sf_pkt_tail = cmd; - } else { - /* this is the first entry in the queue */ - sf->sf_pkt_head = sf->sf_pkt_tail = cmd; - cmd->cmd_next = NULL; - } - mutex_exit(&sf->sf_cmd_mutex); - return (TRAN_ACCEPT); - } - - /* - * start this packet now - */ - - /* still have cmd mutex */ - return (sf_start_internal(sf, cmd)); -} - - -/* - * internal routine to start a packet from the queue now - * - * enter with cmd mutex held and leave with it released - */ -static int -sf_start_internal(struct sf *sf, struct sf_pkt *cmd) -{ - /* we have the cmd mutex */ - sf->sf_ncmds++; - mutex_exit(&sf->sf_cmd_mutex); - - ASSERT(cmd->cmd_state != SF_STATE_ISSUED); - SF_DEBUG(6, (sf, CE_NOTE, "sf_start_internal\n")); - - cmd->cmd_timeout = cmd->cmd_pkt->pkt_time ? sf_watchdog_time + - cmd->cmd_pkt->pkt_time : 0; - cmd->cmd_state = SF_STATE_ISSUED; - - /* call transport to send the pkt */ - if (soc_transport(sf->sf_sochandle, cmd->cmd_fp_pkt, FCAL_NOSLEEP, - CQ_REQUEST_1) != FCAL_TRANSPORT_SUCCESS) { - cmd->cmd_state = SF_STATE_IDLE; - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds--; - mutex_exit(&sf->sf_cmd_mutex); - return (TRAN_BADPKT); - } - return (TRAN_ACCEPT); -} - - -/* - * prepare a packet for transport - */ -static int -sf_prepare_pkt(struct sf *sf, struct sf_pkt *cmd, struct sf_target *target) -{ - struct fcp_cmd *fcmd = cmd->cmd_block; - -/* XXXX Need to set the LUN ? */ - bcopy((caddr_t)&target->sft_lun.b, - (caddr_t)&fcmd->fcp_ent_addr, - FCP_LUN_SIZE); - cmd->cmd_pkt->pkt_reason = CMD_CMPLT; - cmd->cmd_pkt->pkt_state = 0; - cmd->cmd_pkt->pkt_statistics = 0; - - - if ((cmd->cmd_pkt->pkt_comp == NULL) && - ((cmd->cmd_pkt->pkt_flags & FLAG_NOINTR) == 0)) { - return (TRAN_BADPKT); - } - - /* invalidate imp field(s) of rsp block */ - cmd->cmd_rsp_block->fcp_u.i_fcp_status = SF_BAD_DMA_MAGIC; - - /* set up amt of I/O to do */ - if (cmd->cmd_flags & CFLAG_DMAVALID) { - cmd->cmd_pkt->pkt_resid = cmd->cmd_dmacount; - if (cmd->cmd_flags & CFLAG_CMDIOPB) { - (void) ddi_dma_sync(cmd->cmd_dmahandle, 0, 0, - DDI_DMA_SYNC_FORDEV); - } - } else { - cmd->cmd_pkt->pkt_resid = 0; - } - - /* set up the Tagged Queuing type */ - if (cmd->cmd_pkt->pkt_flags & FLAG_HTAG) { - fcmd->fcp_cntl.cntl_qtype = FCP_QTYPE_HEAD_OF_Q; - } else if (cmd->cmd_pkt->pkt_flags & FLAG_OTAG) { - fcmd->fcp_cntl.cntl_qtype = FCP_QTYPE_ORDERED; - } - - /* - * Sync the cmd segment - */ - (void) ddi_dma_sync(cmd->cmd_cr_pool->cmd_dma_handle, - (caddr_t)fcmd - cmd->cmd_cr_pool->cmd_base, - sizeof (struct fcp_cmd), DDI_DMA_SYNC_FORDEV); - - sf_fill_ids(sf, cmd, target); - return (TRAN_ACCEPT); -} - - -/* - * fill in packet hdr source and destination IDs and hdr byte count - */ -static void -sf_fill_ids(struct sf *sf, struct sf_pkt *cmd, struct sf_target *target) -{ - struct fcal_packet *fpkt = cmd->cmd_fp_pkt; - fc_frame_header_t *hp; - - - hp = &fpkt->fcal_socal_request.sr_fc_frame_hdr; - hp->d_id = target->sft_al_pa; - hp->s_id = sf->sf_al_pa; - fpkt->fcal_socal_request.sr_soc_hdr.sh_byte_cnt = - cmd->cmd_dmacookie.dmac_size; -} - - -/* - * do polled I/O using transport - */ -static int -sf_dopoll(struct sf *sf, struct sf_pkt *cmd) -{ - int timeout; - int rval; - - - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds++; - mutex_exit(&sf->sf_cmd_mutex); - - timeout = cmd->cmd_pkt->pkt_time ? cmd->cmd_pkt->pkt_time - : SF_POLL_TIMEOUT; - cmd->cmd_timeout = 0; - cmd->cmd_fp_pkt->fcal_pkt_comp = NULL; - cmd->cmd_state = SF_STATE_ISSUED; - - /* call transport to send a pkt polled */ - rval = soc_transport_poll(sf->sf_sochandle, cmd->cmd_fp_pkt, - timeout*1000000, CQ_REQUEST_1); - mutex_enter(&cmd->cmd_abort_mutex); - cmd->cmd_fp_pkt->fcal_pkt_comp = sf_cmd_callback; - if (rval != FCAL_TRANSPORT_SUCCESS) { - if (rval == FCAL_TRANSPORT_TIMEOUT) { - cmd->cmd_state = SF_STATE_ABORTING; - mutex_exit(&cmd->cmd_abort_mutex); - (void) sf_target_timeout(sf, cmd); - } else { - mutex_exit(&cmd->cmd_abort_mutex); - } - cmd->cmd_state = SF_STATE_IDLE; - cmd->cmd_fp_pkt->fcal_pkt_comp = sf_cmd_callback; - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds--; - mutex_exit(&sf->sf_cmd_mutex); - return (TRAN_BADPKT); - } - mutex_exit(&cmd->cmd_abort_mutex); - cmd->cmd_fp_pkt->fcal_pkt_comp = sf_cmd_callback; - sf_cmd_callback(cmd->cmd_fp_pkt); - return (TRAN_ACCEPT); -} - - -/* a shortcut for defining debug messages below */ -#ifdef DEBUG -#define SF_DMSG1(s) msg1 = s -#else -#define SF_DMSG1(s) /* do nothing */ -#endif - - -/* - * the pkt_comp callback for command packets - */ -static void -sf_cmd_callback(struct fcal_packet *fpkt) -{ - struct sf_pkt *cmd = (struct sf_pkt *)fpkt->fcal_pkt_private; - struct scsi_pkt *pkt = cmd->cmd_pkt; - struct sf *sf = ADDR2SF(&pkt->pkt_address); - struct sf_target *target = ADDR2TARGET(&pkt->pkt_address); - struct fcp_rsp *rsp; - char *msg1 = NULL; - char *msg2 = NULL; - short ncmds; - int tgt_id; - int good_scsi_status = TRUE; - - - - if (cmd->cmd_state == SF_STATE_IDLE) { - cmn_err(CE_PANIC, "sf: completing idle packet 0x%p\n", - (void *)cmd); - } - - mutex_enter(&cmd->cmd_abort_mutex); - if (cmd->cmd_state == SF_STATE_ABORTING) { - /* cmd already being aborted -- nothing to do */ - mutex_exit(&cmd->cmd_abort_mutex); - return; - } - - cmd->cmd_state = SF_STATE_IDLE; - mutex_exit(&cmd->cmd_abort_mutex); - - if (fpkt->fcal_pkt_status == FCAL_STATUS_OK) { - - (void) ddi_dma_sync(cmd->cmd_cr_pool->rsp_dma_handle, - (caddr_t)cmd->cmd_rsp_block - cmd->cmd_cr_pool->rsp_base, - FCP_MAX_RSP_IU_SIZE, DDI_DMA_SYNC_FORKERNEL); - - rsp = (struct fcp_rsp *)cmd->cmd_rsp_block; - - if (rsp->fcp_u.i_fcp_status == SF_BAD_DMA_MAGIC) { - - if (sf_core && (sf_core & SF_CORE_BAD_DMA)) { - sf_token = (int *)(uintptr_t) - fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, - sf->sf_socp); - } - - pkt->pkt_reason = CMD_INCOMPLETE; - pkt->pkt_state = STATE_GOT_BUS; - pkt->pkt_statistics |= STAT_ABORTED; - - } else { - - pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | - STATE_SENT_CMD | STATE_GOT_STATUS; - pkt->pkt_resid = 0; - if (cmd->cmd_flags & CFLAG_DMAVALID) { - pkt->pkt_state |= STATE_XFERRED_DATA; - } - - if ((pkt->pkt_scbp != NULL) && - ((*(pkt->pkt_scbp) = - rsp->fcp_u.fcp_status.scsi_status) - != STATUS_GOOD)) { - good_scsi_status = FALSE; - /* - * The next two checks make sure that if there - * is no sense data or a valid response and - * the command came back with check condition, - * the command should be retried - */ - if (!rsp->fcp_u.fcp_status.rsp_len_set && - !rsp->fcp_u.fcp_status.sense_len_set) { - pkt->pkt_state &= ~STATE_XFERRED_DATA; - pkt->pkt_resid = cmd->cmd_dmacount; - } - } - - if ((cmd->cmd_flags & CFLAG_CMDIOPB) && - (pkt->pkt_state & STATE_XFERRED_DATA)) { - (void) ddi_dma_sync(cmd->cmd_dmahandle, 0, - (uint_t)0, DDI_DMA_SYNC_FORCPU); - } - /* - * Update the transfer resid, if appropriate - */ - if (rsp->fcp_u.fcp_status.resid_over || - rsp->fcp_u.fcp_status.resid_under) - pkt->pkt_resid = rsp->fcp_resid; - - /* - * Check to see if the SCSI command failed. - * - */ - - /* - * First see if we got a FCP protocol error. - */ - if (rsp->fcp_u.fcp_status.rsp_len_set) { - struct fcp_rsp_info *bep; - - bep = (struct fcp_rsp_info *) - (&rsp->fcp_response_len + 1); - if (bep->rsp_code != FCP_NO_FAILURE) { - pkt->pkt_reason = CMD_TRAN_ERR; - tgt_id = pkt->pkt_address.a_target; - switch (bep->rsp_code) { - case FCP_CMND_INVALID: - SF_DMSG1("FCP_RSP FCP_CMND " - "fields invalid"); - break; - case FCP_TASK_MGMT_NOT_SUPPTD: - SF_DMSG1("FCP_RSP Task" - "Management Function" - "Not Supported"); - break; - case FCP_TASK_MGMT_FAILED: - SF_DMSG1("FCP_RSP Task " - "Management Function" - "Failed"); - sf->sf_stats.tstats[tgt_id]. - task_mgmt_failures++; - break; - case FCP_DATA_RO_MISMATCH: - SF_DMSG1("FCP_RSP FCP_DATA RO " - "mismatch with " - "FCP_XFER_RDY DATA_RO"); - sf->sf_stats.tstats[tgt_id]. - data_ro_mismatches++; - break; - case FCP_DL_LEN_MISMATCH: - SF_DMSG1("FCP_RSP FCP_DATA " - "length " - "different than BURST_LEN"); - sf->sf_stats.tstats[tgt_id]. - dl_len_mismatches++; - break; - default: - SF_DMSG1("FCP_RSP invalid " - "RSP_CODE"); - break; - } - } - } - - /* - * See if we got a SCSI error with sense data - */ - if (rsp->fcp_u.fcp_status.sense_len_set) { - uchar_t rqlen = min(rsp->fcp_sense_len, - sizeof (struct scsi_extended_sense)); - caddr_t sense = (caddr_t)rsp + - sizeof (struct fcp_rsp) + - rsp->fcp_response_len; - struct scsi_arq_status *arq; - struct scsi_extended_sense *sensep = - (struct scsi_extended_sense *)sense; - - if (rsp->fcp_u.fcp_status.scsi_status != - STATUS_GOOD) { - if (rsp->fcp_u.fcp_status.scsi_status - == STATUS_CHECK) { - if (sensep->es_key == - KEY_RECOVERABLE_ERROR) - good_scsi_status = 1; - if (sensep->es_key == - KEY_UNIT_ATTENTION && - sensep->es_add_code == 0x3f && - sensep->es_qual_code == 0x0e) { - /* REPORT_LUNS_HAS_CHANGED */ - sf_log(sf, CE_NOTE, - "!REPORT_LUNS_HAS_CHANGED\n"); - sf_force_lip(sf); - } - } - } - - if ((pkt->pkt_scbp != NULL) && - (cmd->cmd_scblen >= - sizeof (struct scsi_arq_status))) { - - pkt->pkt_state |= STATE_ARQ_DONE; - - arq = (struct scsi_arq_status *)pkt->pkt_scbp; - /* - * copy out sense information - */ - bcopy(sense, (caddr_t)&arq->sts_sensedata, - rqlen); - arq->sts_rqpkt_resid = - sizeof (struct scsi_extended_sense) - - rqlen; - *((uchar_t *)&arq->sts_rqpkt_status) = - STATUS_GOOD; - arq->sts_rqpkt_reason = 0; - arq->sts_rqpkt_statistics = 0; - arq->sts_rqpkt_state = STATE_GOT_BUS | - STATE_GOT_TARGET | STATE_SENT_CMD | - STATE_GOT_STATUS | STATE_ARQ_DONE | - STATE_XFERRED_DATA; - } - target->sft_alive = TRUE; - } - - /* - * The firmware returns the number of bytes actually - * xfered into/out of host. Compare this with what - * we asked and if it is different, we lost frames ? - */ - if ((pkt->pkt_reason == 0) && (pkt->pkt_resid == 0) && - (good_scsi_status) && - (pkt->pkt_state & STATE_XFERRED_DATA) && - (!(cmd->cmd_flags & CFLAG_CMDIOPB)) && - (target->sft_device_type != DTYPE_ESI)) { - int byte_cnt = - fpkt->fcal_socal_request. - sr_soc_hdr.sh_byte_cnt; - if (cmd->cmd_flags & CFLAG_DMASEND) { - if (byte_cnt != 0) { - sf_log(sf, CE_NOTE, - "!sf_cmd_callback: Lost Frame: " - "(write) received 0x%x expected" - " 0x%x target 0x%x\n", - byte_cnt, cmd->cmd_dmacount, - sf_alpa_to_switch[ - target->sft_al_pa]); - pkt->pkt_reason = CMD_INCOMPLETE; - pkt->pkt_statistics |= STAT_ABORTED; - } - } else if (byte_cnt < cmd->cmd_dmacount) { - sf_log(sf, CE_NOTE, - "!sf_cmd_callback: " - "Lost Frame: (read) " - "received 0x%x expected 0x%x " - "target 0x%x\n", byte_cnt, - cmd->cmd_dmacount, - sf_alpa_to_switch[ - target->sft_al_pa]); - pkt->pkt_reason = CMD_INCOMPLETE; - pkt->pkt_statistics |= STAT_ABORTED; - } - } - } - - } else { - - /* pkt status was not ok */ - - switch (fpkt->fcal_pkt_status) { - - case FCAL_STATUS_ERR_OFFLINE: - SF_DMSG1("Fibre Channel Offline"); - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_OFFLINE)) { - target->sft_state |= (SF_TARGET_BUSY - | SF_TARGET_MARK); - } - mutex_exit(&target->sft_mutex); - (void) ndi_event_retrieve_cookie(sf->sf_event_hdl, - target->sft_dip, FCAL_REMOVE_EVENT, - &sf_remove_eid, NDI_EVENT_NOPASS); - (void) ndi_event_run_callbacks(sf->sf_event_hdl, - target->sft_dip, sf_remove_eid, NULL); - pkt->pkt_reason = CMD_TRAN_ERR; - pkt->pkt_statistics |= STAT_BUS_RESET; - break; - - case FCAL_STATUS_MAX_XCHG_EXCEEDED: - sf_throttle(sf); - sf->sf_use_lock = TRUE; - pkt->pkt_reason = CMD_TRAN_ERR; - pkt->pkt_state = STATE_GOT_BUS; - pkt->pkt_statistics |= STAT_ABORTED; - break; - - case FCAL_STATUS_TIMEOUT: - SF_DMSG1("Fibre Channel Timeout"); - pkt->pkt_reason = CMD_TIMEOUT; - break; - - case FCAL_STATUS_ERR_OVERRUN: - SF_DMSG1("CMD_DATA_OVR"); - pkt->pkt_reason = CMD_DATA_OVR; - break; - - case FCAL_STATUS_UNKNOWN_CQ_TYPE: - SF_DMSG1("Unknown CQ type"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_BAD_SEG_CNT: - SF_DMSG1("Bad SEG CNT"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_BAD_XID: - SF_DMSG1("Fibre Channel Invalid X_ID"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_XCHG_BUSY: - SF_DMSG1("Fibre Channel Exchange Busy"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_INSUFFICIENT_CQES: - SF_DMSG1("Insufficient CQEs"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_ALLOC_FAIL: - SF_DMSG1("ALLOC FAIL"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_BAD_SID: - SF_DMSG1("Fibre Channel Invalid S_ID"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_INCOMPLETE_DMA_ERR: - if (sf_core && (sf_core & SF_CORE_INCOMPLETE_DMA)) { - sf_token = (int *)(uintptr_t) - fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, - sf->sf_socp); - sf_core = 0; - } - msg2 = - "INCOMPLETE DMA XFER due to bad SOC+ card, replace HBA"; - pkt->pkt_reason = CMD_INCOMPLETE; - pkt->pkt_state = STATE_GOT_BUS; - pkt->pkt_statistics |= STAT_ABORTED; - break; - - case FCAL_STATUS_CRC_ERR: - msg2 = "Fibre Channel CRC Error on frames"; - pkt->pkt_reason = CMD_INCOMPLETE; - pkt->pkt_state = STATE_GOT_BUS; - pkt->pkt_statistics |= STAT_ABORTED; - break; - - case FCAL_STATUS_NO_SEQ_INIT: - SF_DMSG1("Fibre Channel Seq Init Error"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - case FCAL_STATUS_OPEN_FAIL: - pkt->pkt_reason = CMD_TRAN_ERR; - SF_DMSG1("Fibre Channel Open Failure"); - if ((target->sft_state & (SF_TARGET_BUSY | - SF_TARGET_MARK | SF_TARGET_OFFLINE)) == 0) { - sf_log(sf, CE_NOTE, - "!Open failure to target 0x%x " - "forcing LIP\n", - sf_alpa_to_switch[target->sft_al_pa]); - sf_force_lip(sf); - } - break; - - - case FCAL_STATUS_ONLINE_TIMEOUT: - SF_DMSG1("Fibre Channel Online Timeout"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - - default: - SF_DMSG1("Unknown FC Status"); - pkt->pkt_reason = CMD_TRAN_ERR; - break; - } - } - -#ifdef DEBUG - /* - * msg1 will be non-NULL if we've detected some sort of error - */ - if (msg1 != NULL && sfdebug >= 4) { - sf_log(sf, CE_WARN, - "!Transport error on cmd=0x%p target=0x%x: %s\n", - (void *)fpkt, pkt->pkt_address.a_target, msg1); - } -#endif - - if (msg2 != NULL) { - sf_log(sf, CE_WARN, "!Transport error on target=0x%x: %s\n", - pkt->pkt_address.a_target, msg2); - } - - ncmds = fpkt->fcal_ncmds; - ASSERT(ncmds >= 0); - if (ncmds >= (sf->sf_throttle - SF_HI_CMD_DELTA)) { -#ifdef DEBUG - if (!sf->sf_use_lock) { - SF_DEBUG(4, (sf, CE_NOTE, "use lock flag on\n")); - } -#endif - sf->sf_use_lock = TRUE; - } - - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_ncmds = ncmds; - sf_throttle_start(sf); - mutex_exit(&sf->sf_cmd_mutex); - - if (!msg1 && !msg2) - SF_DEBUG(6, (sf, CE_NOTE, "Completing pkt 0x%p\n", - (void *)pkt)); - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(pkt); - } -} - -#undef SF_DMSG1 - - - -/* - * start throttling for this instance - */ -static void -sf_throttle_start(struct sf *sf) -{ - struct sf_pkt *cmd, *prev_cmd = NULL; - struct scsi_pkt *pkt; - struct sf_target *target; - - - ASSERT(mutex_owned(&sf->sf_cmd_mutex)); - - cmd = sf->sf_pkt_head; - while ((cmd != NULL) && - (sf->sf_state == SF_STATE_ONLINE) && - (sf->sf_ncmds < sf->sf_throttle)) { - - pkt = CMD2PKT(cmd); - - target = ADDR2TARGET(&pkt->pkt_address); - if (target->sft_state & SF_TARGET_BUSY) { - /* this command is busy -- go to next */ - ASSERT(cmd->cmd_state != SF_STATE_ISSUED); - prev_cmd = cmd; - cmd = cmd->cmd_next; - continue; - } - - ASSERT(cmd->cmd_state != SF_STATE_ISSUED); - - /* this cmd not busy and not issued */ - - /* remove this packet from the queue */ - if (sf->sf_pkt_head == cmd) { - /* this was the first packet */ - sf->sf_pkt_head = cmd->cmd_next; - } else if (sf->sf_pkt_tail == cmd) { - /* this was the last packet */ - sf->sf_pkt_tail = prev_cmd; - if (prev_cmd != NULL) { - prev_cmd->cmd_next = NULL; - } - } else { - /* some packet in the middle of the queue */ - ASSERT(prev_cmd != NULL); - prev_cmd->cmd_next = cmd->cmd_next; - } - cmd->cmd_flags &= ~CFLAG_IN_QUEUE; - - if (target->sft_state & SF_TARGET_OFFLINE) { - mutex_exit(&sf->sf_cmd_mutex); - pkt->pkt_reason = CMD_TRAN_ERR; - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(cmd->cmd_pkt); - } - } else { - sf_fill_ids(sf, cmd, target); - if (sf_start_internal(sf, cmd) != TRAN_ACCEPT) { - pkt->pkt_reason = CMD_TRAN_ERR; - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(cmd->cmd_pkt); - } - } - } - mutex_enter(&sf->sf_cmd_mutex); - cmd = sf->sf_pkt_head; - prev_cmd = NULL; - } -} - - -/* - * called when the max exchange value is exceeded to throttle back commands - */ -static void -sf_throttle(struct sf *sf) -{ - int cmdmax = sf->sf_sochandle->fcal_cmdmax; - - - mutex_enter(&sf->sf_cmd_mutex); - - sf->sf_flag = TRUE; - - if (sf->sf_ncmds > (cmdmax / 2)) { - sf->sf_throttle = cmdmax / 2; - } else { - if (sf->sf_ncmds > SF_DECR_DELTA) { - sf->sf_throttle = sf->sf_ncmds - SF_DECR_DELTA; - } else { - /* - * This case is just a safeguard, should not really - * happen(ncmds < SF_DECR_DELTA and MAX_EXCHG exceed - */ - sf->sf_throttle = SF_DECR_DELTA; - } - } - mutex_exit(&sf->sf_cmd_mutex); - - sf = sf->sf_sibling; - if (sf != NULL) { - mutex_enter(&sf->sf_cmd_mutex); - sf->sf_flag = TRUE; - if (sf->sf_ncmds >= (cmdmax / 2)) { - sf->sf_throttle = cmdmax / 2; - } else { - if (sf->sf_ncmds > SF_DECR_DELTA) { - sf->sf_throttle = sf->sf_ncmds - SF_DECR_DELTA; - } else { - sf->sf_throttle = SF_DECR_DELTA; - } - } - - mutex_exit(&sf->sf_cmd_mutex); - } -} - - -/* - * sf watchdog routine, called for a timeout - */ -/*ARGSUSED*/ -static void -sf_watch(void *arg) -{ - struct sf *sf; - struct sf_els_hdr *privp; - static int count = 0, pscan_count = 0; - int cmdmax, i, mescount = 0; - struct sf_target *target; - - - sf_watchdog_time += sf_watchdog_timeout; - count++; - pscan_count++; - - mutex_enter(&sf_global_mutex); - sf_watch_running = 1; - for (sf = sf_head; sf != NULL; sf = sf->sf_next) { - - mutex_exit(&sf_global_mutex); - - /* disable throttling while we're suspended */ - mutex_enter(&sf->sf_mutex); - if (sf->sf_state & SF_STATE_SUSPENDED) { - mutex_exit(&sf->sf_mutex); - SF_DEBUG(1, (sf, CE_CONT, - "sf_watch, sf%d:throttle disabled " - "due to DDI_SUSPEND\n", - ddi_get_instance(sf->sf_dip))); - mutex_enter(&sf_global_mutex); - continue; - } - mutex_exit(&sf->sf_mutex); - - cmdmax = sf->sf_sochandle->fcal_cmdmax; - - if (sf->sf_take_core) { - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - } - - mutex_enter(&sf->sf_cmd_mutex); - - if (!sf->sf_flag) { - if (sf->sf_throttle < (cmdmax / 2)) { - sf->sf_throttle = cmdmax / 2; - } else if ((sf->sf_throttle += SF_INCR_DELTA) > - cmdmax) { - sf->sf_throttle = cmdmax; - } - } else { - sf->sf_flag = FALSE; - } - - sf->sf_ncmds_exp_avg = (sf->sf_ncmds + sf->sf_ncmds_exp_avg) - >> 2; - if ((sf->sf_ncmds <= (sf->sf_throttle - SF_LO_CMD_DELTA)) && - (sf->sf_pkt_head == NULL)) { -#ifdef DEBUG - if (sf->sf_use_lock) { - SF_DEBUG(4, (sf, CE_NOTE, - "use lock flag off\n")); - } -#endif - sf->sf_use_lock = FALSE; - } - - if (sf->sf_state == SF_STATE_ONLINE && sf->sf_pkt_head && - sf->sf_ncmds < sf->sf_throttle) { - sf_throttle_start(sf); - } - - mutex_exit(&sf->sf_cmd_mutex); - - if (pscan_count >= sf_pool_scan_cnt) { - if (sf->sf_ncmds_exp_avg < (sf->sf_cr_pool_cnt << - SF_LOG2_ELEMS_IN_POOL) - SF_FREE_CR_EPSILON) { - sf_crpool_free(sf); - } - } - mutex_enter(&sf->sf_mutex); - - privp = sf->sf_els_list; - while (privp != NULL) { - if (privp->timeout < sf_watchdog_time) { - /* timeout this command */ - privp = sf_els_timeout(sf, privp); - } else if ((privp->timeout == SF_INVALID_TIMEOUT) && - (privp->lip_cnt != sf->sf_lip_cnt)) { - if (privp->prev != NULL) { - privp->prev->next = privp->next; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - if (privp->next != NULL) { - privp->next->prev = privp->prev; - } - mutex_exit(&sf->sf_mutex); - sf_els_free(privp->fpkt); - mutex_enter(&sf->sf_mutex); - privp = sf->sf_els_list; - } else { - privp = privp->next; - } - } - - if (sf->sf_online_timer && sf->sf_online_timer < - sf_watchdog_time) { - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - if (target != NULL) { - if (!mescount && target->sft_state & - SF_TARGET_BUSY) { - sf_log(sf, CE_WARN, "!Loop " - "Unstable: Failed to bring " - "Loop Online\n"); - mescount = 1; - } - target->sft_state |= SF_TARGET_MARK; - } - } - sf_finish_init(sf, sf->sf_lip_cnt); - sf->sf_state = SF_STATE_INIT; - sf->sf_online_timer = 0; - } - - if (sf->sf_state == SF_STATE_ONLINE) { - mutex_exit(&sf->sf_mutex); - if (count >= sf_pkt_scan_cnt) { - sf_check_targets(sf); - } - } else if ((sf->sf_state == SF_STATE_OFFLINE) && - (sf->sf_timer < sf_watchdog_time)) { - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - if ((target != NULL) && - (target->sft_state & - SF_TARGET_BUSY)) { - sf_log(sf, CE_WARN, - "!Offline Timeout\n"); - if (sf_core && (sf_core & - SF_CORE_OFFLINE_TIMEOUT)) { - (void) soc_take_core( - sf->sf_sochandle, - sf->sf_socp); - sf_core = 0; - } - break; - } - } - sf_finish_init(sf, sf->sf_lip_cnt); - sf->sf_state = SF_STATE_INIT; - mutex_exit(&sf->sf_mutex); - } else { - mutex_exit(&sf->sf_mutex); - } - mutex_enter(&sf_global_mutex); - } - mutex_exit(&sf_global_mutex); - if (count >= sf_pkt_scan_cnt) { - count = 0; - } - if (pscan_count >= sf_pool_scan_cnt) { - pscan_count = 0; - } - - /* reset timeout */ - sf_watchdog_id = timeout(sf_watch, (caddr_t)0, sf_watchdog_tick); - - /* signal waiting thread */ - mutex_enter(&sf_global_mutex); - sf_watch_running = 0; - cv_broadcast(&sf_watch_cv); - mutex_exit(&sf_global_mutex); -} - - -/* - * called during a timeout to check targets - */ -static void -sf_check_targets(struct sf *sf) -{ - struct sf_target *target; - int i; - struct sf_pkt *cmd; - struct scsi_pkt *pkt; - int lip_cnt; - - mutex_enter(&sf->sf_mutex); - lip_cnt = sf->sf_lip_cnt; - mutex_exit(&sf->sf_mutex); - - /* check scan all possible targets */ - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - while (target != NULL) { - mutex_enter(&target->sft_pkt_mutex); - if (target->sft_alive && target->sft_scan_count != - sf_target_scan_cnt) { - target->sft_alive = 0; - target->sft_scan_count++; - mutex_exit(&target->sft_pkt_mutex); - return; - } - target->sft_alive = 0; - target->sft_scan_count = 0; - cmd = target->sft_pkt_head; - while (cmd != (struct sf_pkt *)&target->sft_pkt_head) { - mutex_enter(&cmd->cmd_abort_mutex); - if (cmd->cmd_state == SF_STATE_ISSUED && - ((cmd->cmd_timeout && sf_watchdog_time > -#ifdef DEBUG - cmd->cmd_timeout) || sf_abort_flag)) { - sf_abort_flag = 0; -#else - cmd->cmd_timeout))) { -#endif - cmd->cmd_timeout = 0; - /* prevent reset from getting at this packet */ - cmd->cmd_state = SF_STATE_ABORTING; - mutex_exit(&cmd->cmd_abort_mutex); - mutex_exit(&target->sft_pkt_mutex); - sf->sf_stats.tstats[i].timeouts++; - if (sf_target_timeout(sf, cmd)) - return; - else { - if (lip_cnt != sf->sf_lip_cnt) { - return; - } else { - mutex_enter(&target-> - sft_pkt_mutex); - cmd = target-> - sft_pkt_head; - } - } - /* - * if the abort and lip fail, a reset will be carried out. - * But the reset will ignore this packet. We have waited at least - * 20 seconds after the initial timeout. Now, complete it here. - * This also takes care of spurious bad aborts. - */ - } else if ((cmd->cmd_state == - SF_STATE_ABORTING) && (cmd->cmd_timeout - <= sf_watchdog_time)) { - cmd->cmd_state = SF_STATE_IDLE; - mutex_exit(&cmd->cmd_abort_mutex); - mutex_exit(&target->sft_pkt_mutex); - SF_DEBUG(1, (sf, CE_NOTE, - "Command 0x%p to sft 0x%p" - " delayed release\n", - (void *)cmd, (void *)target)); - pkt = cmd->cmd_pkt; - pkt->pkt_statistics |= - (STAT_TIMEOUT|STAT_ABORTED); - pkt->pkt_reason = CMD_TIMEOUT; - if (pkt->pkt_comp) { - scsi_hba_pkt_comp(pkt); - /* handle deferred_destroy case */ - } else { - if ((cmd->cmd_block->fcp_cntl. - cntl_reset == 1) || - (cmd->cmd_block-> - fcp_cntl.cntl_abort_tsk == - 1)) { - cmd->cmd_block-> - fcp_cntl. - cntl_reset = 0; - cmd->cmd_block-> - fcp_cntl. - cntl_abort_tsk = 0; - cmd->cmd_fp_pkt-> - fcal_pkt_comp = - sf_cmd_callback; - /* for cache */ - sf_scsi_destroy_pkt - (&pkt->pkt_address, - pkt); - } - } - mutex_enter(&target->sft_pkt_mutex); - cmd = target->sft_pkt_head; - } else { - mutex_exit(&cmd->cmd_abort_mutex); - cmd = cmd->cmd_forw; - } - } - mutex_exit(&target->sft_pkt_mutex); - target = target->sft_next_lun; - } - } -} - - -/* - * a command to a target has timed out - * return TRUE iff cmd abort failed or timed out, else return FALSE - */ -static int -sf_target_timeout(struct sf *sf, struct sf_pkt *cmd) -{ - int rval; - struct scsi_pkt *pkt; - struct fcal_packet *fpkt; - int tgt_id; - int retval = FALSE; - - - SF_DEBUG(1, (sf, CE_NOTE, "Command 0x%p to target %x timed out\n", - (void *)cmd->cmd_fp_pkt, cmd->cmd_pkt->pkt_address.a_target)); - - fpkt = cmd->cmd_fp_pkt; - - if (sf_core && (sf_core & SF_CORE_CMD_TIMEOUT)) { - sf_token = (int *)(uintptr_t) - fpkt->fcal_socal_request.sr_soc_hdr.\ - sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - - /* call the transport to abort a command */ - rval = soc_abort(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, fpkt, 1); - - switch (rval) { - case FCAL_ABORTED: - SF_DEBUG(1, (sf, CE_NOTE, "Command Abort succeeded\n")); - pkt = cmd->cmd_pkt; - cmd->cmd_state = SF_STATE_IDLE; - pkt->pkt_statistics |= (STAT_TIMEOUT|STAT_ABORTED); - pkt->pkt_reason = CMD_TIMEOUT; - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(pkt); - } - break; /* success */ - - case FCAL_ABORT_FAILED: - SF_DEBUG(1, (sf, CE_NOTE, "Command Abort failed at target\n")); - pkt = cmd->cmd_pkt; - cmd->cmd_state = SF_STATE_IDLE; - pkt->pkt_reason = CMD_TIMEOUT; - pkt->pkt_statistics |= STAT_TIMEOUT; - tgt_id = pkt->pkt_address.a_target; - sf->sf_stats.tstats[tgt_id].abts_failures++; - if (pkt->pkt_comp != NULL) { - (*pkt->pkt_comp)(pkt); - } - break; - - case FCAL_BAD_ABORT: - if (sf_core && (sf_core & SF_CORE_BAD_ABORT)) { - sf_token = (int *)(uintptr_t)fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - SF_DEBUG(1, (sf, CE_NOTE, "Command Abort bad abort\n")); - cmd->cmd_timeout = sf_watchdog_time + cmd->cmd_pkt->pkt_time - + 20; - break; - - case FCAL_TIMEOUT: - retval = TRUE; - break; - - default: - pkt = cmd->cmd_pkt; - tgt_id = pkt->pkt_address.a_target; - sf_log(sf, CE_WARN, - "Command Abort failed target 0x%x, forcing a LIP\n", tgt_id); - if (sf_core && (sf_core & SF_CORE_ABORT_TIMEOUT)) { - sf_token = (int *)(uintptr_t)fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - sf_force_lip(sf); - retval = TRUE; - break; - } - - return (retval); -} - - -/* - * an ELS command has timed out - * return ??? - */ -static struct sf_els_hdr * -sf_els_timeout(struct sf *sf, struct sf_els_hdr *privp) -{ - struct fcal_packet *fpkt; - int rval, dflag, timeout = SF_ELS_TIMEOUT; - uint_t lip_cnt = privp->lip_cnt; - uchar_t els_code = privp->els_code; - struct sf_target *target = privp->target; - char what[64]; - - fpkt = privp->fpkt; - dflag = privp->delayed_retry; - /* use as temporary state variable */ - privp->timeout = SF_INVALID_TIMEOUT; - mutex_exit(&sf->sf_mutex); - - if (privp->fpkt->fcal_pkt_comp == sf_els_callback) { - /* - * take socal core if required. Timeouts for IB and hosts - * are not very interesting, so we take socal core only - * if the timeout is *not* for a IB or host. - */ - if (sf_core && (sf_core & SF_CORE_ELS_TIMEOUT) && - ((sf_alpa_to_switch[privp->dest_nport_id] & - 0x0d) != 0x0d) && ((privp->dest_nport_id != 1) || - (privp->dest_nport_id != 2) || - (privp->dest_nport_id != 4) || - (privp->dest_nport_id != 8) || - (privp->dest_nport_id != 0xf))) { - sf_token = (int *)(uintptr_t)fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - (void) sprintf(what, "ELS 0x%x", privp->els_code); - } else if (privp->fpkt->fcal_pkt_comp == sf_reportlun_callback) { - if (sf_core && (sf_core & SF_CORE_REPORTLUN_TIMEOUT)) { - sf_token = (int *)(uintptr_t)fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - timeout = SF_FCP_TIMEOUT; - (void) sprintf(what, "REPORT_LUNS"); - } else if (privp->fpkt->fcal_pkt_comp == sf_inq_callback) { - if (sf_core && (sf_core & SF_CORE_INQUIRY_TIMEOUT)) { - sf_token = (int *)(uintptr_t) - fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - timeout = SF_FCP_TIMEOUT; - (void) sprintf(what, "INQUIRY to LUN 0x%lx", - (long)SCSA_LUN(target)); - } else { - (void) sprintf(what, "UNKNOWN OPERATION"); - } - - if (dflag) { - /* delayed retry */ - SF_DEBUG(2, (sf, CE_CONT, - "!sf%d: %s to target %x delayed retry\n", - ddi_get_instance(sf->sf_dip), what, - sf_alpa_to_switch[privp->dest_nport_id])); - privp->delayed_retry = FALSE; - goto try_again; - } - - sf_log(sf, CE_NOTE, "!%s to target 0x%x alpa 0x%x timed out\n", - what, sf_alpa_to_switch[privp->dest_nport_id], - privp->dest_nport_id); - - rval = soc_abort(sf->sf_sochandle, sf->sf_socp, sf->sf_sochandle - ->fcal_portno, fpkt, 1); - if (rval == FCAL_ABORTED || rval == FCAL_ABORT_FAILED) { - SF_DEBUG(1, (sf, CE_NOTE, "!%s abort to al_pa %x succeeded\n", - what, privp->dest_nport_id)); -try_again: - - mutex_enter(&sf->sf_mutex); - if (privp->prev != NULL) { - privp->prev->next = privp->next; - } - if (sf->sf_els_list == privp) { - sf->sf_els_list = privp->next; - } - if (privp->next != NULL) { - privp->next->prev = privp->prev; - } - privp->prev = privp->next = NULL; - if (lip_cnt == sf->sf_lip_cnt) { - privp->timeout = sf_watchdog_time + timeout; - if ((++(privp->retries) < sf_els_retries) || - (dflag && (privp->retries < SF_BSY_RETRIES))) { - mutex_exit(&sf->sf_mutex); - sf_log(sf, CE_NOTE, - "!%s to target 0x%x retrying\n", - what, - sf_alpa_to_switch[privp->dest_nport_id]); - if (sf_els_transport(sf, privp) == 1) { - mutex_enter(&sf->sf_mutex); - return (sf->sf_els_list); /* success */ - } - mutex_enter(&sf->sf_mutex); - fpkt = NULL; - } - if ((lip_cnt == sf->sf_lip_cnt) && - (els_code != LA_ELS_LOGO)) { - if (target != NULL) { - sf_offline_target(sf, target); - } - if (sf->sf_lip_cnt == lip_cnt) { - sf->sf_device_count--; - ASSERT(sf->sf_device_count >= 0); - if (sf->sf_device_count == 0) { - sf_finish_init(sf, - sf->sf_lip_cnt); - } - } - } - privp = sf->sf_els_list; - mutex_exit(&sf->sf_mutex); - if (fpkt != NULL) { - sf_els_free(fpkt); - } - } else { - mutex_exit(&sf->sf_mutex); - sf_els_free(privp->fpkt); - privp = NULL; - } - } else { - if (sf_core && (sf_core & SF_CORE_ELS_FAILED)) { - sf_token = (int *)(uintptr_t) - fpkt->fcal_socal_request.\ - sr_soc_hdr.sh_request_token; - (void) soc_take_core(sf->sf_sochandle, sf->sf_socp); - sf_core = 0; - } - sf_log(sf, CE_NOTE, "%s abort to target 0x%x failed. " - "status=0x%x, forcing LIP\n", what, - sf_alpa_to_switch[privp->dest_nport_id], rval); - privp = NULL; - if (sf->sf_lip_cnt == lip_cnt) { - sf_force_lip(sf); - } - } - - mutex_enter(&sf->sf_mutex); - return (privp); -} - - -/* - * called by timeout when a reset times out - */ -/*ARGSUSED*/ -static void -sf_check_reset_delay(void *arg) -{ - struct sf *sf; - struct sf_target *target; - struct sf_reset_list *rp, *tp; - uint_t lip_cnt, reset_timeout_flag = FALSE; - clock_t lb; - - lb = ddi_get_lbolt(); - - mutex_enter(&sf_global_mutex); - - sf_reset_timeout_id = 0; - - for (sf = sf_head; sf != NULL; sf = sf->sf_next) { - - mutex_exit(&sf_global_mutex); - mutex_enter(&sf->sf_mutex); - - /* is this type cast needed? */ - tp = (struct sf_reset_list *)&sf->sf_reset_list; - - rp = sf->sf_reset_list; - while (rp != NULL) { - if (((rp->timeout - lb) < 0) && - (rp->lip_cnt == sf->sf_lip_cnt)) { - tp->next = rp->next; - mutex_exit(&sf->sf_mutex); - target = rp->target; - lip_cnt = rp->lip_cnt; - kmem_free(rp, sizeof (struct sf_reset_list)); - /* abort all cmds for this target */ - while (target) { - sf_abort_all(sf, target, FALSE, - lip_cnt, TRUE); - mutex_enter(&target->sft_mutex); - if (lip_cnt == sf->sf_lip_cnt) { - target->sft_state &= - ~SF_TARGET_BUSY; - } - mutex_exit(&target->sft_mutex); - target = target->sft_next_lun; - } - mutex_enter(&sf->sf_mutex); - tp = (struct sf_reset_list *) - &sf->sf_reset_list; - rp = sf->sf_reset_list; - lb = ddi_get_lbolt(); - } else if (rp->lip_cnt != sf->sf_lip_cnt) { - tp->next = rp->next; - kmem_free(rp, sizeof (struct sf_reset_list)); - rp = tp->next; - } else { - reset_timeout_flag = TRUE; - tp = rp; - rp = rp->next; - } - } - mutex_exit(&sf->sf_mutex); - mutex_enter(&sf_global_mutex); - } - - if (reset_timeout_flag && (sf_reset_timeout_id == 0)) { - sf_reset_timeout_id = timeout(sf_check_reset_delay, - NULL, drv_usectohz(SF_TARGET_RESET_DELAY)); - } - - mutex_exit(&sf_global_mutex); -} - - -/* - * called to "reset the bus", i.e. force loop initialization (and address - * re-negotiation) - */ -static void -sf_force_lip(struct sf *sf) -{ - int i; - struct sf_target *target; - - - /* disable restart of lip if we're suspended */ - mutex_enter(&sf->sf_mutex); - if (sf->sf_state & SF_STATE_SUSPENDED) { - mutex_exit(&sf->sf_mutex); - SF_DEBUG(1, (sf, CE_CONT, - "sf_force_lip, sf%d: lip restart disabled " - "due to DDI_SUSPEND\n", - ddi_get_instance(sf->sf_dip))); - return; - } - - sf_log(sf, CE_NOTE, "Forcing lip\n"); - - for (i = 0; i < sf_max_targets; i++) { - target = sf->sf_targets[i]; - while (target != NULL) { - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_OFFLINE)) - target->sft_state |= SF_TARGET_BUSY; - mutex_exit(&target->sft_mutex); - target = target->sft_next_lun; - } - } - - sf->sf_lip_cnt++; - sf->sf_timer = sf_watchdog_time + SF_OFFLINE_TIMEOUT; - sf->sf_state = SF_STATE_OFFLINE; - mutex_exit(&sf->sf_mutex); - sf->sf_stats.lip_count++; /* no mutex for this? */ - -#ifdef DEBUG - /* are we allowing LIPs ?? */ - if (sf_lip_flag != 0) { -#endif - /* call the transport to force loop initialization */ - if (((i = soc_force_lip(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, 1, - FCAL_FORCE_LIP)) != FCAL_SUCCESS) && - (i != FCAL_TIMEOUT)) { - /* force LIP failed */ - if (sf_core && (sf_core & SF_CORE_LIP_FAILED)) { - (void) soc_take_core(sf->sf_sochandle, - sf->sf_socp); - sf_core = 0; - } -#ifdef DEBUG - /* are we allowing reset after LIP failed ?? */ - if (sf_reset_flag != 0) { -#endif - /* restart socal after resetting it */ - sf_log(sf, CE_NOTE, - "!Force lip failed Status code 0x%x." - " Reseting\n", i); - /* call transport to force a reset */ - soc_force_reset(sf->sf_sochandle, sf->sf_socp, - sf->sf_sochandle->fcal_portno, 1); -#ifdef DEBUG - } -#endif - } -#ifdef DEBUG - } -#endif -} - - -/* - * called by the transport when an unsolicited ELS is received - */ -static void -sf_unsol_els_callback(void *arg, soc_response_t *srp, caddr_t payload) -{ - struct sf *sf = (struct sf *)arg; - els_payload_t *els = (els_payload_t *)payload; - struct la_els_rjt *rsp; - int i, tgt_id; - uchar_t dest_id; - struct fcal_packet *fpkt; - fc_frame_header_t *hp; - struct sf_els_hdr *privp; - - - if ((els == NULL) || ((i = srp->sr_soc_hdr.sh_byte_cnt) == 0)) { - return; - } - - if (i > SOC_CQE_PAYLOAD) { - i = SOC_CQE_PAYLOAD; - } - - dest_id = (uchar_t)srp->sr_fc_frame_hdr.s_id; - tgt_id = sf_alpa_to_switch[dest_id]; - - switch (els->els_cmd.c.ls_command) { - - case LA_ELS_LOGO: - /* - * logout received -- log the fact - */ - sf->sf_stats.tstats[tgt_id].logouts_recvd++; - sf_log(sf, CE_NOTE, "!LOGO recvd from target %x, %s\n", - tgt_id, - sf_lip_on_plogo ? "Forcing LIP...." : ""); - if (sf_lip_on_plogo) { - sf_force_lip(sf); - } - break; - - default: /* includes LA_ELS_PLOGI */ - /* - * something besides a logout received -- we don't handle - * this so send back a reject saying its unsupported - */ - - sf_log(sf, CE_NOTE, "!ELS 0x%x recvd from target 0x%x\n", - els->els_cmd.c.ls_command, tgt_id); - - - /* allocate room for a response */ - if (sf_els_alloc(sf, dest_id, sizeof (struct sf_els_hdr), - sizeof (struct la_els_rjt), sizeof (union sf_els_rsp), - (caddr_t *)&privp, (caddr_t *)&rsp) == NULL) { - break; - } - - fpkt = privp->fpkt; - - /* fill in pkt header */ - hp = &fpkt->fcal_socal_request.sr_fc_frame_hdr; - hp->r_ctl = R_CTL_ELS_RSP; - hp->f_ctl = F_CTL_LAST_SEQ | F_CTL_XCHG_CONTEXT; - hp->ox_id = srp->sr_fc_frame_hdr.ox_id; - hp->rx_id = srp->sr_fc_frame_hdr.rx_id; - fpkt->fcal_socal_request.sr_cqhdr.cq_hdr_type = - CQ_TYPE_OUTBOUND; - - fpkt->fcal_socal_request.sr_soc_hdr.sh_seg_cnt = 1; - - /* fill in response */ - rsp->ls_code = LA_ELS_RJT; /* reject this ELS */ - rsp->mbz[0] = 0; - rsp->mbz[1] = 0; - rsp->mbz[2] = 0; - ((struct la_els_logi *)privp->rsp)->ls_code = LA_ELS_ACC; - *((int *)&rsp->reserved) = 0; - rsp->reason_code = RJT_UNSUPPORTED; - privp->retries = sf_els_retries; - privp->els_code = LA_ELS_RJT; - privp->timeout = (unsigned)0xffffffff; - (void) sf_els_transport(sf, privp); - break; - } -} - - -/* - * Error logging, printing, and debug print routines - */ - -/*PRINTFLIKE3*/ -static void -sf_log(struct sf *sf, int level, const char *fmt, ...) -{ - char buf[256]; - dev_info_t *dip; - va_list ap; - - if (sf != NULL) { - dip = sf->sf_dip; - } else { - dip = NULL; - } - - va_start(ap, fmt); - (void) vsprintf(buf, fmt, ap); - va_end(ap); - scsi_log(dip, "sf", level, buf); -} - - -/* - * called to get some sf kstats -- return 0 on success else return errno - */ -static int -sf_kstat_update(kstat_t *ksp, int rw) -{ - struct sf *sf; - - if (rw == KSTAT_WRITE) { - /* can't write */ - return (EACCES); - } - - sf = ksp->ks_private; - sf->sf_stats.ncmds = sf->sf_ncmds; - sf->sf_stats.throttle_limit = sf->sf_throttle; - sf->sf_stats.cr_pool_size = sf->sf_cr_pool_cnt; - - return (0); /* success */ -} - - -/* - * Unix Entry Points - */ - -/* - * driver entry point for opens on control device - */ -/* ARGSUSED */ -static int -sf_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p) -{ - dev_t dev = *dev_p; - struct sf *sf; - - - /* just ensure soft state exists for this device */ - sf = ddi_get_soft_state(sf_state, SF_MINOR2INST(getminor(dev))); - if (sf == NULL) { - return (ENXIO); - } - - ++(sf->sf_check_n_close); - - return (0); -} - - -/* - * driver entry point for last close on control device - */ -/* ARGSUSED */ -static int -sf_close(dev_t dev, int flag, int otyp, cred_t *cred_p) -{ - struct sf *sf; - - sf = ddi_get_soft_state(sf_state, SF_MINOR2INST(getminor(dev))); - if (sf == NULL) { - return (ENXIO); - } - - if (!sf->sf_check_n_close) { /* if this flag is zero */ - cmn_err(CE_WARN, "sf%d: trying to close unopened instance", - SF_MINOR2INST(getminor(dev))); - return (ENODEV); - } else { - --(sf->sf_check_n_close); - } - return (0); -} - - -/* - * driver entry point for sf ioctl commands - */ -/* ARGSUSED */ -static int -sf_ioctl(dev_t dev, - int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_p) -{ - struct sf *sf; - struct sf_target *target; - uchar_t al_pa; - struct sf_al_map map; - int cnt, i; - int retval; /* return value */ - struct devctl_iocdata *dcp; - dev_info_t *cdip; - struct scsi_address ap; - scsi_hba_tran_t *tran; - - - sf = ddi_get_soft_state(sf_state, SF_MINOR2INST(getminor(dev))); - if (sf == NULL) { - return (ENXIO); - } - - /* handle all ioctls */ - switch (cmd) { - - /* - * We can use the generic implementation for these ioctls - */ - case DEVCTL_DEVICE_GETSTATE: - case DEVCTL_DEVICE_ONLINE: - case DEVCTL_DEVICE_OFFLINE: - case DEVCTL_BUS_GETSTATE: - return (ndi_devctl_ioctl(sf->sf_dip, cmd, arg, mode, 0)); - - /* - * return FC map - */ - case SFIOCGMAP: - if ((sf->sf_lilp_map->lilp_magic != FCAL_LILP_MAGIC && - sf->sf_lilp_map->lilp_magic != FCAL_BADLILP_MAGIC) || - sf->sf_state != SF_STATE_ONLINE) { - retval = ENOENT; - goto dun; - } - mutex_enter(&sf->sf_mutex); - if (sf->sf_lilp_map->lilp_magic == FCAL_BADLILP_MAGIC) { - int i, j = 0; - - /* Need to generate a fake lilp map */ - for (i = 0; i < sf_max_targets; i++) { - if (sf->sf_targets[i]) - sf->sf_lilp_map->lilp_alpalist[j++] = - sf->sf_targets[i]-> - sft_hard_address; - } - sf->sf_lilp_map->lilp_length = (uchar_t)j; - } - cnt = sf->sf_lilp_map->lilp_length; - map.sf_count = (short)cnt; - bcopy((caddr_t)&sf->sf_sochandle->fcal_n_wwn, - (caddr_t)&map.sf_hba_addr.sf_node_wwn, - sizeof (la_wwn_t)); - bcopy((caddr_t)&sf->sf_sochandle->fcal_p_wwn, - (caddr_t)&map.sf_hba_addr.sf_port_wwn, - sizeof (la_wwn_t)); - map.sf_hba_addr.sf_al_pa = sf->sf_al_pa; - map.sf_hba_addr.sf_hard_address = 0; - map.sf_hba_addr.sf_inq_dtype = DTYPE_UNKNOWN; - for (i = 0; i < cnt; i++) { - al_pa = sf->sf_lilp_map->lilp_alpalist[i]; - map.sf_addr_pair[i].sf_al_pa = al_pa; - if (al_pa == sf->sf_al_pa) { - (void) bcopy((caddr_t)&sf->sf_sochandle - ->fcal_n_wwn, (caddr_t)&map. - sf_addr_pair[i].sf_node_wwn, - sizeof (la_wwn_t)); - (void) bcopy((caddr_t)&sf->sf_sochandle - ->fcal_p_wwn, (caddr_t)&map. - sf_addr_pair[i].sf_port_wwn, - sizeof (la_wwn_t)); - map.sf_addr_pair[i].sf_hard_address = - al_pa; - map.sf_addr_pair[i].sf_inq_dtype = - DTYPE_PROCESSOR; - continue; - } - target = sf->sf_targets[sf_alpa_to_switch[ - al_pa]]; - if (target != NULL) { - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & - (SF_TARGET_OFFLINE | - SF_TARGET_BUSY))) { - bcopy((caddr_t)&target-> - sft_node_wwn, - (caddr_t)&map.sf_addr_pair - [i].sf_node_wwn, - sizeof (la_wwn_t)); - bcopy((caddr_t)&target-> - sft_port_wwn, - (caddr_t)&map.sf_addr_pair - [i].sf_port_wwn, - sizeof (la_wwn_t)); - map.sf_addr_pair[i]. - sf_hard_address - = target->sft_hard_address; - map.sf_addr_pair[i]. - sf_inq_dtype - = target->sft_device_type; - mutex_exit(&target->sft_mutex); - continue; - } - mutex_exit(&target->sft_mutex); - } - bzero((caddr_t)&map.sf_addr_pair[i]. - sf_node_wwn, sizeof (la_wwn_t)); - bzero((caddr_t)&map.sf_addr_pair[i]. - sf_port_wwn, sizeof (la_wwn_t)); - map.sf_addr_pair[i].sf_inq_dtype = - DTYPE_UNKNOWN; - } - mutex_exit(&sf->sf_mutex); - if (ddi_copyout((caddr_t)&map, (caddr_t)arg, - sizeof (struct sf_al_map), mode) != 0) { - retval = EFAULT; - goto dun; - } - break; - - /* - * handle device control ioctls - */ - case DEVCTL_DEVICE_RESET: - if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS) { - retval = EFAULT; - goto dun; - } - if ((ndi_dc_getname(dcp) == NULL) || - (ndi_dc_getaddr(dcp) == NULL)) { - ndi_dc_freehdl(dcp); - retval = EINVAL; - goto dun; - } - cdip = ndi_devi_find(sf->sf_dip, - ndi_dc_getname(dcp), ndi_dc_getaddr(dcp)); - ndi_dc_freehdl(dcp); - - if (cdip == NULL) { - retval = ENXIO; - goto dun; - } - - if ((target = sf_get_target_from_dip(sf, cdip)) == NULL) { - retval = ENXIO; - goto dun; - } - mutex_enter(&target->sft_mutex); - if (!(target->sft_state & SF_TARGET_INIT_DONE)) { - mutex_exit(&target->sft_mutex); - retval = ENXIO; - goto dun; - } - - /* This is ugly */ - tran = kmem_zalloc(scsi_hba_tran_size(), KM_SLEEP); - bcopy(target->sft_tran, tran, scsi_hba_tran_size()); - mutex_exit(&target->sft_mutex); - ap.a_hba_tran = tran; - ap.a_target = sf_alpa_to_switch[target->sft_al_pa]; - if (sf_reset(&ap, RESET_TARGET) == FALSE) { - retval = EIO; - } else { - retval = 0; - } - kmem_free(tran, scsi_hba_tran_size()); - goto dun; - - case DEVCTL_BUS_QUIESCE: - case DEVCTL_BUS_UNQUIESCE: - retval = ENOTSUP; - goto dun; - - case DEVCTL_BUS_RESET: - case DEVCTL_BUS_RESETALL: - sf_force_lip(sf); - break; - - default: - retval = ENOTTY; - goto dun; - } - - retval = 0; /* success */ - -dun: - return (retval); -} - - -/* - * get the target given a DIP - */ -static struct sf_target * -sf_get_target_from_dip(struct sf *sf, dev_info_t *dip) -{ - int i; - struct sf_target *target; - - - /* scan each hash queue for the DIP in question */ - for (i = 0; i < SF_NUM_HASH_QUEUES; i++) { - target = sf->sf_wwn_lists[i]; - while (target != NULL) { - if (target->sft_dip == dip) { - return (target); /* success: target found */ - } - target = target->sft_next; - } - } - return (NULL); /* failure: target not found */ -} - - -/* - * called by the transport to get an event cookie - */ -static int -sf_bus_get_eventcookie(dev_info_t *dip, dev_info_t *rdip, char *name, - ddi_eventcookie_t *event_cookiep) -{ - struct sf *sf; - - sf = ddi_get_soft_state(sf_state, ddi_get_instance(dip)); - if (sf == NULL) { - /* can't find instance for this device */ - return (DDI_FAILURE); - } - - return (ndi_event_retrieve_cookie(sf->sf_event_hdl, rdip, name, - event_cookiep, NDI_EVENT_NOPASS)); - -} - - -/* - * called by the transport to add an event callback - */ -static int -sf_bus_add_eventcall(dev_info_t *dip, dev_info_t *rdip, - ddi_eventcookie_t eventid, void (*callback)(dev_info_t *dip, - ddi_eventcookie_t event, void *arg, void *impl_data), void *arg, - ddi_callback_id_t *cb_id) -{ - struct sf *sf; - - sf = ddi_get_soft_state(sf_state, ddi_get_instance(dip)); - if (sf == NULL) { - /* can't find instance for this device */ - return (DDI_FAILURE); - } - - return (ndi_event_add_callback(sf->sf_event_hdl, rdip, - eventid, callback, arg, NDI_SLEEP, cb_id)); - -} - - -/* - * called by the transport to remove an event callback - */ -static int -sf_bus_remove_eventcall(dev_info_t *devi, ddi_callback_id_t cb_id) -{ - struct sf *sf; - - sf = ddi_get_soft_state(sf_state, ddi_get_instance(devi)); - if (sf == NULL) { - /* can't find instance for this device */ - return (DDI_FAILURE); - } - - return (ndi_event_remove_callback(sf->sf_event_hdl, cb_id)); -} - - -/* - * called by the transport to post an event - */ -static int -sf_bus_post_event(dev_info_t *dip, dev_info_t *rdip, - ddi_eventcookie_t eventid, void *impldata) -{ - ddi_eventcookie_t remove_cookie, cookie; - - /* is this a remove event ?? */ - struct sf *sf = ddi_get_soft_state(sf_state, ddi_get_instance(dip)); - remove_cookie = ndi_event_tag_to_cookie(sf->sf_event_hdl, - SF_EVENT_TAG_REMOVE); - - if (remove_cookie == eventid) { - struct sf_target *target; - - /* handle remove event */ - - if (sf == NULL) { - /* no sf instance for this device */ - return (NDI_FAILURE); - } - - /* get the target for this event */ - if ((target = sf_get_target_from_dip(sf, rdip)) != NULL) { - /* - * clear device info for this target and mark as - * not done - */ - mutex_enter(&target->sft_mutex); - target->sft_dip = NULL; - target->sft_state &= ~SF_TARGET_INIT_DONE; - mutex_exit(&target->sft_mutex); - return (NDI_SUCCESS); /* event handled */ - } - - /* no target for this event */ - return (NDI_FAILURE); - } - - /* an insertion event */ - if (ndi_busop_get_eventcookie(dip, rdip, FCAL_INSERT_EVENT, &cookie) - != NDI_SUCCESS) { - return (NDI_FAILURE); - } - - return (ndi_post_event(dip, rdip, cookie, impldata)); -} - - -/* - * the sf hotplug daemon, one thread per sf instance - */ -static void -sf_hp_daemon(void *arg) -{ - struct sf *sf = (struct sf *)arg; - struct sf_hp_elem *elem; - struct sf_target *target; - int tgt_id; - callb_cpr_t cprinfo; - - CALLB_CPR_INIT(&cprinfo, &sf->sf_hp_daemon_mutex, - callb_generic_cpr, "sf_hp_daemon"); - - mutex_enter(&sf->sf_hp_daemon_mutex); - - do { - while (sf->sf_hp_elem_head != NULL) { - - /* save ptr to head of list */ - elem = sf->sf_hp_elem_head; - - /* take element off of list */ - if (sf->sf_hp_elem_head == sf->sf_hp_elem_tail) { - /* element only one in list -- list now empty */ - sf->sf_hp_elem_head = NULL; - sf->sf_hp_elem_tail = NULL; - } else { - /* remove element from head of list */ - sf->sf_hp_elem_head = sf->sf_hp_elem_head->next; - } - - mutex_exit(&sf->sf_hp_daemon_mutex); - - switch (elem->what) { - case SF_ONLINE: - /* online this target */ - target = elem->target; - (void) ndi_devi_online(elem->dip, 0); - (void) ndi_event_retrieve_cookie( - sf->sf_event_hdl, - target->sft_dip, FCAL_INSERT_EVENT, - &sf_insert_eid, NDI_EVENT_NOPASS); - (void) ndi_event_run_callbacks(sf->sf_event_hdl, - target->sft_dip, sf_insert_eid, NULL); - break; - case SF_OFFLINE: - /* offline this target */ - target = elem->target; - tgt_id = sf_alpa_to_switch[target->sft_al_pa]; - /* don't do NDI_DEVI_REMOVE for now */ - if (ndi_devi_offline(elem->dip, 0) != - NDI_SUCCESS) { - SF_DEBUG(1, (sf, CE_WARN, "target %x, " - "device offline failed", tgt_id)); - } else { - SF_DEBUG(1, (sf, CE_NOTE, "target %x, " - "device offline succeeded\n", - tgt_id)); - } - break; - } - kmem_free(elem, sizeof (struct sf_hp_elem)); - mutex_enter(&sf->sf_hp_daemon_mutex); - } - - /* if exit is not already signaled */ - if (sf->sf_hp_exit == 0) { - /* wait to be signaled by work or exit */ - CALLB_CPR_SAFE_BEGIN(&cprinfo); - cv_wait(&sf->sf_hp_daemon_cv, &sf->sf_hp_daemon_mutex); - CALLB_CPR_SAFE_END(&cprinfo, &sf->sf_hp_daemon_mutex); - } - } while (sf->sf_hp_exit == 0); - - /* sf_hp_daemon_mutex is dropped by CALLB_CPR_EXIT */ - CALLB_CPR_EXIT(&cprinfo); - thread_exit(); /* no more hotplug thread */ - /* NOTREACHED */ -} diff --git a/usr/src/uts/sun/io/scsi/adapters/sf.conf b/usr/src/uts/sun/io/scsi/adapters/sf.conf deleted file mode 100644 index 946e77a6ad..0000000000 --- a/usr/src/uts/sun/io/scsi/adapters/sf.conf +++ /dev/null @@ -1,41 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (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 2004 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -#ident "%Z%%M% %I% %E% SMI" - -name="sf" parent="SUNW,socal" socal_port=0; -name="sf" parent="SUNW,socal" socal_port=1; - -# -# To generate the binding-set specific 'compatible' forms used to address -# legacy issues the 'scsi-binding-set' property must be defined. (do not remove) -# -scsi-binding-set="fcp"; - -# -# Force attach driver to support hotplug activity (do not remove the property) -# -ddi-forceattach=1; - diff --git a/usr/src/uts/sun/io/scsi/inc.flg b/usr/src/uts/sun/io/scsi/inc.flg index 4b1eb82868..6dcd7cc954 100644 --- a/usr/src/uts/sun/io/scsi/inc.flg +++ b/usr/src/uts/sun/io/scsi/inc.flg @@ -36,7 +36,6 @@ find_files "s.*" \ usr/src/uts/sparc/scsi \ usr/src/uts/sparc/sd \ usr/src/uts/sparc/ses \ - usr/src/uts/sparc/ssd \ usr/src/uts/sparc/st \ usr/src/uts/sun/io/dada \ usr/src/uts/sun/sys/dada \ diff --git a/usr/src/uts/sun/io/scsi/targets/ssd.conf b/usr/src/uts/sun/io/scsi/targets/ssd.conf deleted file mode 100644 index 5147bce78a..0000000000 --- a/usr/src/uts/sun/io/scsi/targets/ssd.conf +++ /dev/null @@ -1,37 +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 (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. -# - -name="ssd" parent="sf" target=0; -name="ssd" parent="fp" target=0; -# -# The following stub node is needed for pathological bottom-up -# devid resolution on a self-identifying transport. -# -name="ssd" class="scsi-self-identifying"; - -# -# Associate the driver with devid resolution. -# -ddi-devid-registrant=1; diff --git a/usr/src/uts/sun/io/socal.c b/usr/src/uts/sun/io/socal.c deleted file mode 100644 index ad94e101b7..0000000000 --- a/usr/src/uts/sun/io/socal.c +++ /dev/null @@ -1,5056 +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 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ -/* - * Copyright 2012 Garrett D'Amore <garrett@damore.org>. All rights reserved. - */ - -/* - * socal - Serial Optical Channel Arbitrated Loop host adapter driver. - */ - -#include <sys/types.h> -#include <sys/note.h> -#include <sys/devops.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/user.h> -#include <sys/buf.h> -#include <sys/ioctl.h> -#include <sys/uio.h> -#include <sys/fcntl.h> - -#include <sys/cmn_err.h> -#include <sys/stropts.h> -#include <sys/kmem.h> - -#include <sys/errno.h> -#include <sys/open.h> -#include <sys/varargs.h> -#include <sys/var.h> -#include <sys/thread.h> -#include <sys/debug.h> -#include <sys/cpu.h> -#include <sys/autoconf.h> -#include <sys/conf.h> -#include <sys/stat.h> - -#include <sys/file.h> -#include <sys/syslog.h> - -#include <sys/ddi.h> -#include <sys/sunddi.h> -#include <sys/ddi_impldefs.h> -#include <sys/ksynch.h> -#include <sys/ddidmareq.h> -#include <sys/dditypes.h> -#include <sys/ethernet.h> -#include <sys/socalreg.h> -#include <sys/socalmap.h> -#include <sys/fc4/fcal.h> -#include <sys/socal_cq_defs.h> -#include <sys/fc4/fcal_linkapp.h> -#include <sys/fc4/fcal_transport.h> -#include <sys/socalio.h> -#include <sys/socalvar.h> - -/* - * Local Macros - */ - -#ifdef DEBUG -#define SOCAL_DEBUG 1 -#else -#define SOCAL_DEBUG 0 -#endif -static uchar_t socal_xrambuf[0x40000]; -static int socal_core = SOCAL_TAKE_CORE; -#if SOCAL_DEBUG > 0 && !defined(lint) -static int soc_debug = SOCAL_DEBUG; -static int socal_read_stale_data = 0; -#define DEBUGF(level, args) \ - if (soc_debug >= (level)) cmn_err args; -#define SOCALDEBUG(level, args) \ - if (soc_debug >= level) args; -#else -#define DEBUGF(level, args) /* Nothing */ -#define SOCALDEBUG(level, args) /* Nothing */ -#endif - - -/* defines for properties */ -#define SOCAL_PORT_NO_PROP "socal_port" -#define SOCAL_ALT_PORT_NO_PROP "port#" - -/* for socal_force_reset() */ -#define RESET_PORT 1 -#define DONT_RESET_PORT 0 - -/* - * Driver Entry points. - */ -static int socal_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); -static int socal_bus_ctl(dev_info_t *dip, dev_info_t *rip, - ddi_ctl_enum_t op, void *a, void *v); -static int socal_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); -static int socal_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, - void *arg, void **result); -static unsigned int socal_intr(caddr_t arg); -static unsigned int socal_dummy_intr(caddr_t arg); -static int socal_open(dev_t *devp, int flag, int otyp, - cred_t *cred_p); -static int socal_close(dev_t dev, int flag, int otyp, - cred_t *cred_p); -static int socal_ioctl(dev_t dev, int cmd, intptr_t arg, - int mode, cred_t *cred_p, int *rval_p); - -/* - * FC_AL transport functions. - */ -static uint_t socal_transport(fcal_packet_t *, fcal_sleep_t, int); -static uint_t socal_transport_poll(fcal_packet_t *, uint_t, int); -static uint_t socal_lilp_map(void *, uint_t, uint32_t, uint_t); -static uint_t socal_force_lip(void *, uint_t, uint_t, uint_t); -static uint_t socal_force_offline(void *, uint_t, uint_t); -static uint_t socal_abort_cmd(void *, uint_t, fcal_packet_t *, uint_t); -static uint_t socal_doit(fcal_packet_t *, socal_port_t *, int, - void (*)(), int, int, uint_t *); -static uint_t socal_els(void *, uint_t, uint_t, uint_t, - void (*callback)(), void *, caddr_t, caddr_t *, uint_t); -static uint_t socal_bypass_dev(void *, uint_t, uint_t); -static void socal_force_reset(void *, uint_t, uint_t); -static void socal_add_ulp(void *, uint_t, uchar_t, void (*)(), - void (*)(), void (*)(), void *); -static void socal_remove_ulp(void *, uint_t, uchar_t, void *); -static void socal_take_core(void *); - -/* - * Driver internal functions. - */ -static void socal_intr_solicited(socal_state_t *, uint32_t srq); -static void socal_intr_unsolicited(socal_state_t *, uint32_t urq); -static void socal_lilp_map_done(fcal_packet_t *); -static void socal_force_lip_done(fcal_packet_t *); -static void socal_force_offline_done(fcal_packet_t *); -static void socal_abort_done(fcal_packet_t *); -static void socal_bypass_dev_done(fcal_packet_t *); -static fcal_packet_t *socal_packet_alloc(socal_state_t *, fcal_sleep_t); -static void socal_packet_free(fcal_packet_t *); -static void socal_disable(socal_state_t *socalp); -static void socal_init_transport_interface(socal_state_t *socalp); -static int socal_cqalloc_init(socal_state_t *socalp, uint32_t index); -static void socal_cqinit(socal_state_t *socalp, uint32_t index); -static int socal_start(socal_state_t *socalp); -static void socal_doreset(socal_state_t *socalp); -static int socal_dodetach(dev_info_t *dip); -static int socal_diag_request(socal_state_t *socalp, uint32_t port, - uint_t *diagcode, uint32_t cmd); -static void socal_download_ucode(socal_state_t *socalp); -static void socal_init_cq_desc(socal_state_t *socalp); -static void socal_init_wwn(socal_state_t *socalp); -static void socal_enable(socal_state_t *socalp); -static int socal_establish_pool(socal_state_t *socalp, uint32_t poolid); -static int socal_add_pool_buffer(socal_state_t *socalp, uint32_t poolid); -static int socal_issue_adisc(socal_state_t *socalp, uint32_t port, uint32_t - dest, la_els_adisc_t *adisc_pl, uint32_t polled); -static int socal_issue_lbf(socal_state_t *socalp, uint32_t port, - uchar_t *flb_pl, size_t length, uint32_t polled); -static int socal_issue_rls(socal_state_t *socalp, uint32_t port, uint32_t - dest, la_els_rls_reply_t *rls_pl, uint32_t polled); -static void socal_us_els(socal_state_t *, cqe_t *, caddr_t); -static fcal_packet_t *socal_els_alloc(socal_state_t *, uint32_t, uint32_t, - uint32_t, uint32_t, caddr_t *, uint32_t); -static fcal_packet_t *socal_lbf_alloc(socal_state_t *, uint32_t, - uint32_t, uint32_t, caddr_t *, uint32_t); -static void socal_els_free(socal_priv_cmd_t *); -static void socal_lbf_free(socal_priv_cmd_t *); -static int socal_getmap(socal_state_t *socalp, uint32_t port, caddr_t arg, - uint32_t polled, int); -static void socal_flush_overflowq(socal_state_t *, int, int); -static void socal_deferred_intr(void *); -static void socal_fix_harda(socal_state_t *socalp, int port); - -/* - * SOC+ Circular Queue Management routines. - */ -static int socal_cq_enque(socal_state_t *, socal_port_t *, cqe_t *, int, - fcal_sleep_t, fcal_packet_t *, int); - -/* - * Utility functions - */ -static void socal_disp_err(socal_state_t *, uint_t level, char *mid, char *msg); -static void socal_wcopy(uint_t *, uint_t *, int); - -/* - * Set this bit to enable 64-bit sus mode - */ -static int socal_64bitsbus = 1; - -/* - * Default soc dma limits - */ - -static ddi_dma_lim_t default_socallim = { - (ulong_t)0, (ulong_t)0xffffffff, (uint_t)0xffffffff, - DEFAULT_BURSTSIZE | BURST32 | BURST64, 1, (25*1024) -}; - -static struct ddi_dma_attr socal_dma_attr = { - DMA_ATTR_V0, /* version */ - (unsigned long long)0, /* addr_lo */ - (unsigned long long)0xffffffff, /* addr_hi */ - (unsigned long long)0xffffffff, /* count max */ - (unsigned long long)4, /* align */ - DEFAULT_BURSTSIZE | BURST32 | BURST64, /* burst size */ - 1, /* minxfer */ - (unsigned long long)0xffffffff, /* maxxfer */ - (unsigned long long)0xffffffff, /* seg */ - 1, /* sgllen */ - 4, /* granularity */ - 0 /* flags */ -}; - -static struct ddi_device_acc_attr socal_acc_attr = { - (ushort_t)DDI_DEVICE_ATTR_V0, /* version */ - (uchar_t)DDI_STRUCTURE_BE_ACC, /* endian flags */ - (uchar_t)DDI_STRICTORDER_ACC /* data order */ -}; - -static struct fcal_transport_ops socal_transport_ops = { - socal_transport, - socal_transport_poll, - socal_lilp_map, - socal_force_lip, - socal_abort_cmd, - socal_els, - socal_bypass_dev, - socal_force_reset, - socal_add_ulp, - socal_remove_ulp, - socal_take_core -}; - -/* - * Table used for setting the burst size in the soc+ config register - */ -static int socal_burst32_table[] = { - SOCAL_CR_BURST_4, - SOCAL_CR_BURST_4, - SOCAL_CR_BURST_4, - SOCAL_CR_BURST_4, - SOCAL_CR_BURST_16, - SOCAL_CR_BURST_32, - SOCAL_CR_BURST_64 -}; - -/* - * Table for setting the burst size for 64-bit sbus mode in soc+'s CR - */ -static int socal_burst64_table[] = { - (SOCAL_CR_BURST_8 << 8), - (SOCAL_CR_BURST_8 << 8), - (SOCAL_CR_BURST_8 << 8), - (SOCAL_CR_BURST_8 << 8), - (SOCAL_CR_BURST_8 << 8), - (SOCAL_CR_BURST_32 << 8), - (SOCAL_CR_BURST_64 << 8), - (SOCAL_CR_BURST_128 << 8) -}; - -/* - * Tables used to define the sizes of the Circular Queues - * - * To conserve DVMA/IOPB space, we make some of these queues small... - */ -static int socal_req_entries[] = { - SOCAL_SMALL_CQ_ENTRIES, /* Error (reset, lip) requests */ - SOCAL_MAX_CQ_ENTRIES, /* Most commands */ - 0, /* Not currently used */ - 0 /* Not currently used */ -}; - -static int socal_rsp_entries[] = { - SOCAL_MAX_CQ_ENTRIES, /* Solicited "SOC_OK" responses */ - SOCAL_SMALL_CQ_ENTRIES, /* Solicited error responses */ - 0, /* Unsolicited responses */ - 0 /* Not currently used */ -}; - -/* - * Bus ops vector - */ - -static struct bus_ops socal_bus_ops = { - BUSO_REV, /* rev */ - nullbusmap, /* int (*bus_map)() */ - 0, /* ddi_intrspec_t (*bus_get_intrspec)(); */ - 0, /* int (*bus_add_intrspec)(); */ - 0, /* void (*bus_remove_intrspec)(); */ - i_ddi_map_fault, /* int (*bus_map_fault)() */ - 0, /* int (*bus_dma_map)() */ - ddi_dma_allochdl, - ddi_dma_freehdl, - ddi_dma_bindhdl, - ddi_dma_unbindhdl, - ddi_dma_flush, - ddi_dma_win, - ddi_dma_mctl, /* int (*bus_dma_ctl)() */ - socal_bus_ctl, /* int (*bus_ctl)() */ - ddi_bus_prop_op, /* int (*bus_prop_op*)() */ -}; - -static struct cb_ops socal_cb_ops = { - socal_open, /* int (*cb_open)() */ - socal_close, /* int (*cb_close)() */ - nodev, /* int (*cb_strategy)() */ - nodev, /* int (*cb_print)() */ - nodev, /* int (*cb_dump)() */ - nodev, /* int (*cb_read)() */ - nodev, /* int (*cb_write)() */ - socal_ioctl, /* int (*cb_ioctl)() */ - nodev, /* int (*cb_devmap)() */ - nodev, /* int (*cb_mmap)() */ - nodev, /* int (*cb_segmap)() */ - nochpoll, /* int (*cb_chpoll)() */ - ddi_prop_op, /* int (*cb_prop_op)() */ - 0, /* struct streamtab *cb_str */ - D_MP|D_NEW|D_HOTPLUG, /* cb_flag */ - CB_REV, /* rev */ - nodev, /* int (*cb_aread)() */ - nodev /* int (*cb_awrite)() */ -}; - -/* - * Soc driver ops structure. - */ - -static struct dev_ops socal_ops = { - DEVO_REV, /* devo_rev, */ - 0, /* refcnt */ - socal_getinfo, /* get_dev_info */ - nulldev, /* identify */ - nulldev, /* probe */ - socal_attach, /* attach */ - socal_detach, /* detach */ - nodev, /* reset */ - &socal_cb_ops, /* driver operations */ - &socal_bus_ops, /* bus operations */ - NULL, /* power */ - ddi_quiesce_not_supported, /* quiesce */ -}; - -/* - * Driver private variables. - */ - -static void *socal_soft_state_p = NULL; -static ddi_dma_lim_t *socallim = NULL; - -static uchar_t socal_switch_to_alpa[] = { - 0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda, 0xd9, 0xd6, - 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce, 0xcd, 0xcc, 0xcb, 0xca, - 0xc9, 0xc7, 0xc6, 0xc5, 0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, - 0xb4, 0xb3, 0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, - 0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b, 0x98, 0x97, - 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81, 0x80, 0x7c, 0x7a, 0x79, - 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, - 0x6a, 0x69, 0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56, - 0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, - 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c, 0x3a, 0x39, 0x36, 0x35, - 0x34, 0x33, 0x32, 0x31, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, - 0x27, 0x26, 0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17, - 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00 -}; - -/* - * Firmware related externs - */ -extern uint32_t socal_ucode[]; -extern size_t socal_ucode_size; - -/* - * This is the loadable module wrapper: "module configuration section". - */ - -#include <sys/modctl.h> -extern struct mod_ops mod_driverops; - -/* - * Module linkage information for the kernel. - */ -#define SOCAL_NAME "SOC+ FC-AL Host Adapter Driver" -static char socal_version[] = "1.62 08/19/2008"; -static struct modldrv modldrv = { - &mod_driverops, /* Type of module. This one is a driver */ - SOCAL_NAME, - &socal_ops, /* driver ops */ -}; - -static struct modlinkage modlinkage = { - MODREV_1, (void *)&modldrv, NULL -}; - -/* - * This is the module initialization/completion routines - */ - -#if !defined(lint) -static char socal_initmsg[] = "socal _init: socal.c\t1.62\t08/19/2008\n"; -#endif - -int -_init(void) -{ - int stat; - - DEBUGF(4, (CE_CONT, socal_initmsg)); - - /* Allocate soft state. */ - stat = ddi_soft_state_init(&socal_soft_state_p, - sizeof (socal_state_t), SOCAL_INIT_ITEMS); - if (stat != 0) - return (stat); - - /* Install the module */ - stat = mod_install(&modlinkage); - if (stat != 0) - ddi_soft_state_fini(&socal_soft_state_p); - - DEBUGF(4, (CE_CONT, "socal: _init: return=%d\n", stat)); - return (stat); -} - -int -_fini(void) -{ - int stat; - - if ((stat = mod_remove(&modlinkage)) != 0) - return (stat); - - DEBUGF(4, (CE_CONT, "socal: _fini: \n")); - - ddi_soft_state_fini(&socal_soft_state_p); - - DEBUGF(4, (CE_CONT, "socal: _fini: return=%d\n", stat)); - return (stat); -} - -int -_info(struct modinfo *modinfop) -{ - return (mod_info(&modlinkage, modinfop)); -} - - -int -socal_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) -{ - int instance; - socal_state_t *socalp; - struct ether_addr ourmacaddr; - socal_port_t *porta, *portb; - char buf[MAXPATHLEN]; - char *cptr, *wwn; - int y; - int i, j; - int burstsize; - short s; - int loop_id; - - int rval; - - - instance = ddi_get_instance(dip); - - DEBUGF(4, (CE_CONT, "socal%d entering attach: cmd=%x\n", instance, - cmd)); - - if (cmd == DDI_RESUME) { - if ((socalp = ddi_get_driver_private(dip)) == NULL) - return (DDI_FAILURE); - - if (!socalp->socal_shutdown) { - /* our work is already done */ - return (DDI_SUCCESS); - } - if (socal_start(socalp) != FCAL_SUCCESS) { - return (DDI_FAILURE); - } - DEBUGF(4, (CE_CONT, "socal%d resumed\n", instance)); - return (DDI_SUCCESS); - } - - if (cmd != DDI_ATTACH) { - return (DDI_FAILURE); - } - - if (ddi_dev_is_sid(dip) != DDI_SUCCESS) { - cmn_err(CE_WARN, "socal%d probe: Not self-identifying", - instance); - return (DDI_FAILURE); - } - - /* If we are in a slave-slot, then we can't be used. */ - if (ddi_slaveonly(dip) == DDI_SUCCESS) { - cmn_err(CE_WARN, - "socal%d attach failed: device in slave-only slot", - instance); - return (DDI_FAILURE); - } - - if (ddi_intr_hilevel(dip, 0)) { - /* - * Interrupt number '0' is a high-level interrupt. - * At this point you either add a special interrupt - * handler that triggers a soft interrupt at a lower level, - * or - more simply and appropriately here - you just - * fail the attach. - */ - cmn_err(CE_WARN, - "socal%d attach failed: hilevel interrupt unsupported", - instance); - return (DDI_FAILURE); - } - - /* Allocate soft state. */ - if (ddi_soft_state_zalloc(socal_soft_state_p, instance) - != DDI_SUCCESS) { - cmn_err(CE_WARN, "socal%d attach failed: alloc soft state", - instance); - return (DDI_FAILURE); - } - DEBUGF(4, (CE_CONT, "socal%d attach: allocated soft state\n", - instance)); - - /* - * Initialize the state structure. - */ - socalp = ddi_get_soft_state(socal_soft_state_p, instance); - if (socalp == (socal_state_t *)NULL) { - cmn_err(CE_WARN, "socal%d attach failed: bad soft state", - instance); - return (DDI_FAILURE); - } - DEBUGF(4, (CE_CONT, "socal%d: attach: soc soft state ptr=0x%p\n", - instance, socalp)); - - socalp->dip = dip; - socallim = &default_socallim; - porta = &socalp->port_state[0]; - portb = &socalp->port_state[1]; - - /* Get the full path name for displaying error messages */ - cptr = ddi_pathname(dip, buf); - (void) strcpy(socalp->socal_name, cptr); - - porta->sp_unsol_cb = NULL; - portb->sp_unsol_cb = NULL; - porta->sp_port = 0; - portb->sp_port = 1; - porta->sp_board = socalp; - portb->sp_board = socalp; - - porta->sp_lilpmap_valid = 0; - portb->sp_lilpmap_valid = 0; - - /* - * If an hard loop-id property is present, then the port is going - * to be used in target-mode so set the target-mode flag. - */ - loop_id = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, - "port0-loop-id", 127); - if (loop_id >= 0 && loop_id <= 126) { - porta->sp_status |= PORT_TARGET_MODE; - porta->sp_hard_alpa = socal_switch_to_alpa[loop_id]; - } else porta->sp_hard_alpa = 0xfe; - - loop_id = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, - "port1-loop-id", 127); - if (loop_id >= 0 && loop_id <= 126) { - portb->sp_status |= PORT_TARGET_MODE; - portb->sp_hard_alpa = socal_switch_to_alpa[loop_id]; - } else portb->sp_hard_alpa = 0xfe; - - /* Get out Node wwn and calculate port wwns */ - rval = ddi_prop_op(DDI_DEV_T_ANY, dip, - PROP_LEN_AND_VAL_ALLOC, DDI_PROP_DONTPASS | - DDI_PROP_CANSLEEP, "wwn", (caddr_t)&wwn, &i); - - if ((rval != DDI_PROP_SUCCESS) || (i < FC_WWN_SIZE) || - (bcmp(wwn, "00000000", FC_WWN_SIZE) == 0)) { - (void) localetheraddr((struct ether_addr *)NULL, &ourmacaddr); - - bcopy((caddr_t)&ourmacaddr, (caddr_t)&s, sizeof (short)); - socalp->socal_n_wwn.w.wwn_hi = s; - bcopy((caddr_t)&ourmacaddr+2, - (caddr_t)&socalp->socal_n_wwn.w.wwn_lo, - sizeof (uint_t)); - socalp->socal_n_wwn.w.naa_id = NAA_ID_IEEE; - socalp->socal_n_wwn.w.nport_id = 0; - } else { - bcopy((caddr_t)wwn, (caddr_t)&socalp->socal_n_wwn, FC_WWN_SIZE); - } - - if (rval == DDI_SUCCESS) - kmem_free((void *)wwn, i); - - for (i = 0; i < FC_WWN_SIZE; i++) { - (void) sprintf(&socalp->socal_stats.node_wwn[i << 1], - "%02x", socalp->socal_n_wwn.raw_wwn[i]); - } - DEBUGF(4, (CE_CONT, "socal%d attach: node wwn: %s\n", - instance, socalp->socal_stats.node_wwn)); - - bcopy((caddr_t)&socalp->socal_n_wwn, (caddr_t)&porta->sp_p_wwn, - sizeof (la_wwn_t)); - bcopy((caddr_t)&socalp->socal_n_wwn, (caddr_t)&portb->sp_p_wwn, - sizeof (la_wwn_t)); - porta->sp_p_wwn.w.naa_id = NAA_ID_IEEE_EXTENDED; - portb->sp_p_wwn.w.naa_id = NAA_ID_IEEE_EXTENDED; - porta->sp_p_wwn.w.nport_id = instance*2; - portb->sp_p_wwn.w.nport_id = instance*2+1; - - for (i = 0; i < FC_WWN_SIZE; i++) { - (void) sprintf(&socalp->socal_stats.port_wwn[0][i << 1], - "%02x", porta->sp_p_wwn.raw_wwn[i]); - (void) sprintf(&socalp->socal_stats.port_wwn[1][i << 1], - "%02x", portb->sp_p_wwn.raw_wwn[i]); - } - DEBUGF(4, (CE_CONT, "socal%d attach: porta wwn: %s\n", - instance, socalp->socal_stats.port_wwn[0])); - DEBUGF(4, (CE_CONT, "socal%d attach: portb wwn: %s\n", - instance, socalp->socal_stats.port_wwn[1])); - - if ((porta->sp_transport = (fcal_transport_t *) - kmem_zalloc(sizeof (fcal_transport_t), KM_SLEEP)) == NULL) { - socal_disp_err(socalp, CE_WARN, "attach.4011", - "attach failed: unable to alloc xport struct"); - goto fail; - } - - if ((portb->sp_transport = (fcal_transport_t *) - kmem_zalloc(sizeof (fcal_transport_t), KM_SLEEP)) == NULL) { - socal_disp_err(socalp, CE_WARN, "attach.4012", - "attach failed: unable to alloc xport struct"); - goto fail; - } - DEBUGF(4, (CE_CONT, "socal%d attach: allocated transport structs\n", - instance)); - - /* - * Map the external ram and registers for SOC+. - * Note: Soc+ sbus host adapter provides 3 register definition - * but on-board Soc+'s may have only one register definition. - */ - if ((ddi_dev_nregs(dip, &i) == DDI_SUCCESS) && (i == 1)) { - /* Map XRAM */ - if (ddi_map_regs(dip, 0, &socalp->socal_xrp, 0, 0) - != DDI_SUCCESS) { - socalp->socal_xrp = NULL; - socal_disp_err(socalp, CE_WARN, "attach.4020", - "attach failed: unable to map XRAM"); - goto fail; - } - /* Map registers */ - socalp->socal_rp = (socal_reg_t *)(socalp->socal_xrp + - SOCAL_XRAM_SIZE); - } else { - /* Map EEPROM */ - if (ddi_map_regs(dip, 0, &socalp->socal_eeprom, 0, 0) != - DDI_SUCCESS) { - socalp->socal_eeprom = NULL; - socal_disp_err(socalp, CE_WARN, "attach.4010", - "attach failed: unable to map eeprom"); - goto fail; - } - DEBUGF(4, (CE_CONT, "socal%d attach: mapped eeprom 0x%p\n", - instance, socalp->socal_eeprom)); - /* Map XRAM */ - if (ddi_map_regs(dip, 1, &socalp->socal_xrp, 0, 0) != - DDI_SUCCESS) { - socalp->socal_xrp = NULL; - socal_disp_err(socalp, CE_WARN, "attach.4020", - "attach failed: unable to map XRAM"); - goto fail; - } - DEBUGF(4, (CE_CONT, "socal%d attach: mapped xram 0x%p\n", - instance, socalp->socal_xrp)); - /* Map registers */ - if (ddi_map_regs(dip, 2, (caddr_t *)&socalp->socal_rp, 0, 0) != - DDI_SUCCESS) { - socalp->socal_rp = NULL; - socal_disp_err(socalp, CE_WARN, "attach.4030", - "attach failed: unable to map registers"); - goto fail; - } - DEBUGF(4, (CE_CONT, "socal%d attach: mapped regs 0x%p\n", - instance, socalp->socal_rp)); - } - /* - * Check to see we really have a SOC+ Host Adapter card installed - */ - if (ddi_peek32(dip, (int32_t *)&socalp->socal_rp->socal_csr.w, - (int32_t *)NULL) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "attach.4040", - "attach failed: unable to access status register"); - goto fail; - } - /* now that we have our registers mapped make sure soc+ reset */ - socal_disable(socalp); - - /* try defacing a spot in XRAM */ - if (ddi_poke32(dip, (int32_t *)(socalp->socal_xrp + SOCAL_XRAM_UCODE), - 0xdefaced) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "attach.4050", - "attach failed: unable to write host adapter XRAM"); - goto fail; - } - - /* see if it stayed defaced */ - if (ddi_peek32(dip, (int32_t *)(socalp->socal_xrp + SOCAL_XRAM_UCODE), - (int32_t *)&y) - != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "attach.4051", - "attach failed: unable to access host adapter XRAM"); - goto fail; - } - -#ifdef DEBUG - for (i = 0; i < 4; i++) { - socalp->socal_rp->socal_cr.w &= - ~SOCAL_CR_EXTERNAL_RAM_BANK_MASK; - socalp->socal_rp->socal_cr.w |= i<<24; - cptr = (char *)(socal_xrambuf + (i*0x10000)); - bcopy((caddr_t)socalp->socal_xrp, (caddr_t)cptr, 0x10000); - } - socalp->socal_rp->socal_cr.w &= ~SOCAL_CR_EXTERNAL_RAM_BANK_MASK; -#endif - - DEBUGF(4, (CE_CONT, "socal%d attach: read xram\n", instance)); - - if (y != 0xdefaced) { - socal_disp_err(socalp, CE_WARN, "attach.4052", - "attach failed: read/write mismatch in XRAM"); - goto fail; - } - - /* Point to the SOC XRAM CQ Descriptor locations. */ - socalp->xram_reqp = (soc_cq_t *)(socalp->socal_xrp + - SOCAL_XRAM_REQ_DESC); - socalp->xram_rspp = (soc_cq_t *)(socalp->socal_xrp + - SOCAL_XRAM_RSP_DESC); - - if ((socalp->socal_ksp = kstat_create("socal", instance, "statistics", - "controller", KSTAT_TYPE_RAW, sizeof (struct socal_stats), - KSTAT_FLAG_VIRTUAL)) == NULL) { - socal_disp_err(socalp, CE_WARN, "attach.4053", - "unable to create kstats"); - } else { - socalp->socal_stats.version = 2; - (void) sprintf(socalp->socal_stats.drvr_name, - "%s: %s", SOCAL_NAME, socal_version); - socalp->socal_stats.pstats[0].port = 0; - socalp->socal_stats.pstats[1].port = 1; - socalp->socal_ksp->ks_data = (void *)&socalp->socal_stats; - kstat_install(socalp->socal_ksp); - } - - /* - * Install a dummy interrupt routine. - */ - if (ddi_add_intr(dip, - (uint_t)0, - &socalp->iblkc, - &socalp->idevc, - socal_dummy_intr, - (caddr_t)socalp) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "attach.4060", - "attach failed: unable to install interrupt handler"); - goto fail; - } - - ddi_set_driver_private(dip, socalp); - - /* initialize the interrupt mutex */ - mutex_init(&socalp->k_imr_mtx, NULL, MUTEX_DRIVER, - (void *)socalp->iblkc); - - mutex_init(&socalp->board_mtx, NULL, MUTEX_DRIVER, - (void *)socalp->iblkc); - mutex_init(&socalp->ioctl_mtx, NULL, MUTEX_DRIVER, - (void *)socalp->iblkc); - - /* initialize the abort mutex */ - mutex_init(&socalp->abort_mtx, NULL, MUTEX_DRIVER, - (void *)socalp->iblkc); - - cv_init(&socalp->board_cv, NULL, CV_DRIVER, NULL); - DEBUGF(4, (CE_CONT, - "socal%d: attach: inited imr mutex, board mutex, board cv\n", - instance)); - - /* init the port mutexes */ - mutex_init(&porta->sp_mtx, NULL, MUTEX_DRIVER, socalp->iblkc); - cv_init(&porta->sp_cv, NULL, CV_DRIVER, NULL); - mutex_init(&portb->sp_mtx, NULL, MUTEX_DRIVER, socalp->iblkc); - cv_init(&portb->sp_cv, NULL, CV_DRIVER, NULL); - DEBUGF(4, (CE_CONT, "socal%d: attach: inited port mutexes and cvs\n", - instance)); - - /* get local copy of service params */ - socal_wcopy((uint_t *)socalp->socal_xrp + SOCAL_XRAM_SERV_PARAMS, - (uint_t *)socalp->socal_service_params, SOCAL_SVC_LENGTH); - DEBUGF(4, (CE_CONT, "socal%d: attach: got service params\n", instance)); - /* - * Initailize the FCAL transport interface. - */ - socal_init_transport_interface(socalp); - DEBUGF(4, (CE_CONT, "socal%d: attach: initalized transport interface\n", - instance)); - - /* - * Allocate request and response queues and init their mutexs. - */ - for (i = 0; i < SOCAL_N_CQS; i++) { - if (socal_cqalloc_init(socalp, i) != FCAL_SUCCESS) { - goto fail; - } - } - DEBUGF(4, (CE_CONT, "socal%d: attach: allocated cqs\n", instance)); - - /* - * Adjust the burst size we'll use. - */ - burstsize = ddi_dma_burstsizes(socalp->request[0].skc_dhandle); - DEBUGF(4, (CE_CONT, "socal%d: attach: burstsize = 0x%x\n", - instance, burstsize)); - j = burstsize & BURSTSIZE_MASK; - for (i = 0; socal_burst32_table[i] != SOCAL_CR_BURST_64; i++) - if (!(j >>= 1)) break; - - socalp->socal_cfg = (socalp->socal_cfg & ~SOCAL_CR_SBUS_BURST_SIZE_MASK) - | socal_burst32_table[i]; - - if (socal_64bitsbus) { - if (ddi_dma_set_sbus64(socalp->request[0].skc_dhandle, - socal_dma_attr.dma_attr_burstsizes | BURST128) == - DDI_SUCCESS) { - DEBUGF(4, (CE_CONT, "socal%d: enabled 64 bit sbus\n", - instance)); - socalp->socal_cfg |= SOCAL_CR_SBUS_ENHANCED; - burstsize = ddi_dma_burstsizes(socalp->request[0]. - skc_dhandle); - DEBUGF(4, (CE_CONT, "socal%d: attach: 64bit burstsize = 0x%x\n", - instance, burstsize)); - j = burstsize & BURSTSIZE_MASK; - for (i = 0; socal_burst64_table[i] != - (SOCAL_CR_BURST_128 << 8); i++) - if (!(j >>= 1)) - break; - - socalp->socal_cfg = (socalp->socal_cfg & - ~SOCAL_CR_SBUS_BURST_SIZE_64BIT_MASK) | - socal_burst64_table[i]; - } - } - - ddi_remove_intr(dip, 0, socalp->iblkc); - socalp->iblkc = (void *)NULL; - /* - * Install the interrupt routine. - */ - if (ddi_add_intr(dip, - (uint_t)0, - &socalp->iblkc, - &socalp->idevc, - socal_intr, - (caddr_t)socalp) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "attach.4060", - "attach failed: unable to install interrupt handler"); - goto fail; - } - - DEBUGF(4, (CE_CONT, "socal%d: attach: set config reg %x\n", - instance, socalp->socal_cfg)); - - if (ddi_create_minor_node(dip, SOCAL_PORTA_NAME, S_IFCHR, - instance*N_SOCAL_NPORTS, SOCAL_NT_PORT, 0) != DDI_SUCCESS) - goto fail; - if (ddi_create_minor_node(dip, SOCAL_PORTB_NAME, S_IFCHR, - instance*N_SOCAL_NPORTS+1, SOCAL_NT_PORT, 0) != DDI_SUCCESS) - goto fail; - - if (socal_start(socalp) != FCAL_SUCCESS) - goto fail; - DEBUGF(4, (CE_CONT, "socal%d: attach: soc+ started\n", instance)); - - ddi_report_dev(dip); - - DEBUGF(2, (CE_CONT, "socal%d: attach O.K.\n\n", instance)); - - return (DDI_SUCCESS); - -fail: - DEBUGF(4, (CE_CONT, "socal%d: attach: DDI_FAILURE\n", instance)); - - /* Make sure soc reset */ - socal_disable(socalp); - - /* let detach do the dirty work */ - (void) socal_dodetach(dip); - - return (DDI_FAILURE); -} - -static int -socal_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) -{ - int resp; - socal_state_t *socalp; - int i; - - - switch (cmd) { - - case DDI_SUSPEND: - DEBUGF(4, (CE_CONT, "socal: suspend called\n")); - - if ((socalp = ddi_get_driver_private(dip)) == NULL) - return (DDI_FAILURE); - - /* - * If any of the ports are in target-mode, don't suspend - */ - for (i = 0; i < N_SOCAL_NPORTS; i++) { - if (socalp->port_state[i].sp_status & PORT_TARGET_MODE) - return (DDI_FAILURE); - } - - /* do not restart socal after reset */ - socal_force_reset((void *)socalp, 0, DONT_RESET_PORT); - - return (DDI_SUCCESS); - - case DDI_DETACH: - DEBUGF(4, (CE_CONT, "socal: detach called\n")); - resp = socal_dodetach(dip); - if (resp == DDI_SUCCESS) - ddi_set_driver_private(dip, NULL); - return (resp); - - default: - return (DDI_FAILURE); - } -} - -static int -socal_dodetach(dev_info_t *dip) -{ - - int instance = ddi_get_instance(dip); - int i; - socal_state_t *socalp; - socal_port_t *portp; - socal_unsol_cb_t *cb, *cbn = NULL; - - /* Get the soft state struct. */ - if ((socalp = ddi_get_soft_state(socal_soft_state_p, instance)) == 0) { - return (DDI_FAILURE); - } - - /* - * If somebody is still attached to us from above fail - * detach. - */ - mutex_enter(&socalp->board_mtx); - if (socalp->socal_busy > 0) { - mutex_exit(&socalp->board_mtx); - return (DDI_FAILURE); - } - /* mark socal_busy = -1 to disallow sftm attach */ - socalp->socal_busy = -1; - mutex_exit(&socalp->board_mtx); - - /* Make sure soc+ reset */ - mutex_enter(&socalp->k_imr_mtx); - socal_disable(socalp); - mutex_exit(&socalp->k_imr_mtx); - - /* remove soc+ interrupt */ - if (socalp->iblkc != (void *)NULL) { - ddi_remove_intr(dip, (uint_t)0, socalp->iblkc); - DEBUGF(2, (CE_CONT, - "socal%d: detach: Removed SOC+ interrupt from ddi\n", - instance)); - } - - for (i = 0; i < N_SOCAL_NPORTS; i++) { - portp = &socalp->port_state[i]; - mutex_destroy(&portp->sp_mtx); - cv_destroy(&portp->sp_cv); - mutex_destroy(&portp->sp_transport->fcal_mtx); - cv_destroy(&portp->sp_transport->fcal_cv); - kmem_free((void *)portp->sp_transport, - sizeof (fcal_transport_t)); - for (cb = portp->sp_unsol_cb; cb != (socal_unsol_cb_t *)NULL; - cb = cbn) { - cbn = cb->next; - kmem_free((void *)cb, sizeof (socal_unsol_cb_t)); - } - portp->sp_unsol_cb = (socal_unsol_cb_t *)NULL; - } - - /* - * Free request queues, if allocated - */ - for (i = 0; i < SOCAL_N_CQS; i++) { - /* Free the queues and destroy their mutexes. */ - mutex_destroy(&socalp->request[i].skc_mtx); - mutex_destroy(&socalp->response[i].skc_mtx); - cv_destroy(&socalp->request[i].skc_cv); - cv_destroy(&socalp->response[i].skc_cv); - - if (socalp->request[i].skc_dhandle) { - (void) ddi_dma_unbind_handle(socalp-> - request[i].skc_dhandle); - ddi_dma_free_handle(&socalp->request[i].skc_dhandle); - } - if (socalp->request[i].skc_cq_raw) { - ddi_dma_mem_free(&socalp->request[i].skc_acchandle); - socalp->request[i].skc_cq_raw = NULL; - socalp->request[i].skc_cq = NULL; - } - if (socalp->response[i].skc_dhandle) { - (void) ddi_dma_unbind_handle(socalp-> - response[i].skc_dhandle); - ddi_dma_free_handle(&socalp->response[i].skc_dhandle); - } - if (socalp->response[i].skc_cq_raw) { - ddi_dma_mem_free(&socalp->response[i].skc_acchandle); - socalp->response[i].skc_cq_raw = NULL; - socalp->response[i].skc_cq = NULL; - } - if (socalp->request[i].deferred_intr_timeoutid) { - (void) untimeout(socalp-> - request[i].deferred_intr_timeoutid); - } - if (socalp->response[i].deferred_intr_timeoutid) { - (void) untimeout(socalp-> - response[i].deferred_intr_timeoutid); - } - } - - mutex_destroy(&socalp->abort_mtx); - mutex_destroy(&socalp->board_mtx); - mutex_destroy(&socalp->ioctl_mtx); - cv_destroy(&socalp->board_cv); - - /* - * Free soc data buffer pool - */ - if (socalp->pool_dhandle) { - (void) ddi_dma_unbind_handle(socalp->pool_dhandle); - ddi_dma_free_handle(&socalp->pool_dhandle); - } - if (socalp->pool) { - ddi_dma_mem_free(&socalp->pool_acchandle); - } - - /* release register maps */ - /* Unmap EEPROM */ - if (socalp->socal_eeprom != NULL) { - ddi_unmap_regs(dip, 0, &socalp->socal_eeprom, 0, 0); - } - - /* Unmap XRAM */ - if (socalp->socal_xrp != NULL) { - ddi_unmap_regs(dip, 1, &socalp->socal_xrp, 0, 0); - } - - /* Unmap registers */ - if (socalp->socal_rp != NULL) { - ddi_unmap_regs(dip, 2, (caddr_t *)&socalp->socal_rp, 0, 0); - } - - if (socalp->socal_ksp != NULL) - kstat_delete(socalp->socal_ksp); - - mutex_destroy(&socalp->k_imr_mtx); - - ddi_remove_minor_node(dip, NULL); - - ddi_soft_state_free(socal_soft_state_p, instance); - - return (DDI_SUCCESS); -} - - -int -socal_bus_ctl(dev_info_t *dip, dev_info_t *rip, ddi_ctl_enum_t op, - void *a, void *v) -{ - int port; - - - switch (op) { - case DDI_CTLOPS_REPORTDEV: - port = ddi_getprop(DDI_DEV_T_ANY, rip, DDI_PROP_DONTPASS, - SOCAL_PORT_NO_PROP, -1); - if ((port < 0) || (port > 1)) { - port = ddi_getprop(DDI_DEV_T_ANY, rip, - DDI_PROP_DONTPASS, SOCAL_ALT_PORT_NO_PROP, -1); - } - /* log text identifying this driver (d) & its child (r) */ - cmn_err(CE_CONT, "?%s%d at %s%d: socal_port %d\n", - ddi_driver_name(rip), ddi_get_instance(rip), - ddi_driver_name(dip), ddi_get_instance(dip), - port); - break; - - case DDI_CTLOPS_INITCHILD: { - dev_info_t *child_dip = (dev_info_t *)a; - char name[MAXNAMELEN]; - socal_state_t *socalp; - - if ((socalp = ddi_get_driver_private(dip)) == NULL) - return (DDI_FAILURE); - - port = ddi_getprop(DDI_DEV_T_ANY, child_dip, - DDI_PROP_DONTPASS, SOCAL_PORT_NO_PROP, -1); - - if ((port < 0) || (port > 1)) { - port = ddi_getprop(DDI_DEV_T_ANY, child_dip, - DDI_PROP_DONTPASS, SOCAL_ALT_PORT_NO_PROP, -1); - if ((port < 0) || (port > 1)) { - return (DDI_NOT_WELL_FORMED); - } - } - mutex_enter(&socalp->board_mtx); - mutex_enter(&socalp->port_state[port].sp_mtx); - if (socalp->port_state[port].sp_status & - (PORT_CHILD_INIT | PORT_TARGET_MODE)) { - mutex_exit(&socalp->port_state[port].sp_mtx); - mutex_exit(&socalp->board_mtx); - return (DDI_FAILURE); - } - socalp->socal_busy++; - socalp->port_state[port].sp_status |= PORT_CHILD_INIT; - mutex_exit(&socalp->port_state[port].sp_mtx); - mutex_exit(&socalp->board_mtx); - ddi_set_parent_data(child_dip, - socalp->port_state[port].sp_transport); - (void) sprintf((char *)name, "%x,0", port); - ddi_set_name_addr(child_dip, name); - break; - } - - case DDI_CTLOPS_UNINITCHILD: { - dev_info_t *child_dip = (dev_info_t *)a; - socal_state_t *socalp; - - socalp = ddi_get_driver_private(dip); - port = ddi_getprop(DDI_DEV_T_ANY, child_dip, - DDI_PROP_DONTPASS, SOCAL_PORT_NO_PROP, -1); - - if ((port < 0) || (port > 1)) { - port = ddi_getprop(DDI_DEV_T_ANY, child_dip, - DDI_PROP_DONTPASS, SOCAL_ALT_PORT_NO_PROP, -1); - if ((port < 0) || (port > 1)) { - return (DDI_NOT_WELL_FORMED); - } - } - - ddi_set_parent_data(child_dip, NULL); - (void) ddi_set_name_addr(child_dip, NULL); - mutex_enter(&socalp->board_mtx); - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->socal_busy--; - socalp->port_state[port].sp_status &= ~PORT_CHILD_INIT; - mutex_exit(&socalp->port_state[port].sp_mtx); - mutex_exit(&socalp->board_mtx); - - break; - } - - case DDI_CTLOPS_IOMIN: { - int val; - - val = *((int *)v); - val = maxbit(val, socallim->dlim_minxfer); - /* - * The 'arg' value of nonzero indicates 'streaming' mode. - * If in streaming mode, pick the largest of our burstsizes - * available and say that that is our minimum value (modulo - * what minxfer is). - */ - if ((int)(uintptr_t)a) { - val = maxbit(val, - 1<<(ddi_fls(socallim->dlim_burstsizes)-1)); - } else { - val = maxbit(val, - 1<<(ddi_ffs(socallim->dlim_burstsizes)-1)); - } - - *((int *)v) = val; - return (ddi_ctlops(dip, rip, op, a, v)); - } - - /* - * These ops are not available on this nexus. - */ - - case DDI_CTLOPS_DMAPMAPC: - case DDI_CTLOPS_REGSIZE: - case DDI_CTLOPS_NREGS: - case DDI_CTLOPS_AFFINITY: - case DDI_CTLOPS_SIDDEV: - case DDI_CTLOPS_POKE: - case DDI_CTLOPS_PEEK: - return (DDI_FAILURE); - - case DDI_CTLOPS_SLAVEONLY: - case DDI_CTLOPS_REPORTINT: - default: - /* - * Remaining requests get passed up to our parent - */ - DEBUGF(2, (CE_CONT, "%s%d: op (%d) from %s%d\n", - ddi_get_name(dip), ddi_get_instance(dip), - op, ddi_get_name(rip), ddi_get_instance(rip))); - return (ddi_ctlops(dip, rip, op, a, v)); - } - - return (DDI_SUCCESS); -} - - -/*ARGSUSED*/ -/* - * int - * socal_getinfo() - Given the device number, return the devinfo - * pointer or the instance number. Note: this routine must be - * successful on DDI_INFO_DEVT2INSTANCE even before attach. - */ -int -socal_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, - void **result) -{ - int instance; - socal_state_t *socalp; - - instance = getminor((dev_t)arg) / 2; - - switch (cmd) { - case DDI_INFO_DEVT2DEVINFO: - socalp = ddi_get_soft_state(socal_soft_state_p, instance); - if (socalp) - *result = socalp->dip; - else - *result = NULL; - break; - - case DDI_INFO_DEVT2INSTANCE: - *result = (void *)(uintptr_t)instance; - break; - - default: - return (DDI_FAILURE); - } - - return (DDI_SUCCESS); -} - -/*ARGSUSED*/ -int -socal_open(dev_t *devp, int flag, int otyp, cred_t *cred_p) -{ - int instance = getminor(*devp) / 2; - socal_state_t *socalp = - ddi_get_soft_state(socal_soft_state_p, instance); - socal_port_t *port_statep; - int port; - - if (socalp == NULL) - return (ENXIO); - - port = getminor(*devp)%2; - port_statep = &socalp->port_state[port]; - - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status |= PORT_OPEN; - mutex_exit(&port_statep->sp_mtx); - DEBUGF(2, (CE_CONT, - "socal%d: open of port %d\n", instance, port)); - return (0); -} - -/*ARGSUSED*/ -int -socal_close(dev_t dev, int flag, int otyp, cred_t *cred_p) -{ - int instance = getminor(dev) / 2; - socal_state_t *socalp = - ddi_get_soft_state(socal_soft_state_p, instance); - socal_port_t *port_statep; - int port; - - port = getminor(dev)%2; - port_statep = &socalp->port_state[port]; - - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status &= ~PORT_OPEN; - mutex_exit(&port_statep->sp_mtx); - DEBUGF(2, (CE_CONT, - "socal%d: clsoe of port %d\n", instance, port)); - return (0); -} - -/*ARGSUSED*/ -int -socal_ioctl(dev_t dev, - int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_p) -{ - int instance = getminor(dev) / 2; - socal_state_t *socalp = - ddi_get_soft_state(socal_soft_state_p, instance); - int port; - socal_port_t *port_statep; - int i; - uint_t r; - int offset; - int retval = FCAL_SUCCESS; - la_els_adisc_t *adisc_pl; - la_els_rls_reply_t *rls_pl; - dev_info_t *dip; - char *buffer, tmp[10]; - struct socal_fm_version ver; -#ifdef _MULTI_DATAMODEL - struct socal_fm_version32 { - uint_t fcode_ver_len; - uint_t mcode_ver_len; - uint_t prom_ver_len; - caddr32_t fcode_ver; - caddr32_t mcode_ver; - caddr32_t prom_ver; - } ver32; - uint_t dm32 = 0; -#endif - - uchar_t *flb_pl; - flb_hdr_t *flb_hdr; - uint_t flb_size; - - if (socalp == NULL) - return (ENXIO); - - DEBUGF(4, (CE_CONT, "socal%d ioctl: got command %x\n", instance, cmd)); - port = getminor(dev)%2; - - switch (cmd) { - case FCIO_FCODE_MCODE_VERSION: -#ifdef _MULTI_DATAMODEL - switch (ddi_model_convert_from(mode & FMODELS)) { - case DDI_MODEL_ILP32: - dm32 = 1; - if (ddi_copyin((caddr_t)arg, - (caddr_t)&ver32, sizeof (ver32), - mode) == -1) - return (EFAULT); - ver.fcode_ver_len = - ver32.fcode_ver_len; - ver.mcode_ver_len = - ver32.mcode_ver_len; - ver.prom_ver_len = - ver32.prom_ver_len; - ver.fcode_ver = - (caddr_t)(uintptr_t)ver32.fcode_ver; - ver.mcode_ver = - (caddr_t)(uintptr_t)ver32.mcode_ver; - ver.prom_ver = - (caddr_t)(uintptr_t)ver32.prom_ver; - break; - case DDI_MODEL_NONE: - if (ddi_copyin((caddr_t)arg, - (caddr_t)&ver, sizeof (ver), - mode) == -1) - return (EFAULT); - } -#else /* _MULTI_DATAMODEL */ - if (ddi_copyin((caddr_t)arg, (caddr_t)&ver, - sizeof (ver), mode) == -1) - return (EFAULT); -#endif /* _MULTI_DATAMODEL */ - dip = socalp->dip; - if (ddi_prop_op(DDI_DEV_T_ANY, dip, - PROP_LEN_AND_VAL_ALLOC, DDI_PROP_DONTPASS | - DDI_PROP_CANSLEEP, "version", (caddr_t)&buffer, - &i) != DDI_PROP_SUCCESS) - return (EIO); - if (i < ver.fcode_ver_len) - ver.fcode_ver_len = i; - if (ddi_copyout((caddr_t)buffer, - (caddr_t)ver.fcode_ver, ver.fcode_ver_len, - mode) == -1) { - kmem_free((caddr_t)buffer, i); - return (EFAULT); - } - kmem_free((caddr_t)buffer, i); - if (socalp->socal_eeprom) { - for (i = 0; i < SOCAL_N_CQS; i++) { - mutex_enter( - &socalp->request[i].skc_mtx); - mutex_enter( - &socalp->response[i].skc_mtx); - } - i = socalp->socal_rp->socal_cr.w; - socalp->socal_rp->socal_cr.w &= - ~SOCAL_CR_EEPROM_BANK_MASK; - socalp->socal_rp->socal_cr.w |= 3 << 16; - if (ver.prom_ver_len > 10) - ver.prom_ver_len = 10; - bcopy((caddr_t)socalp->socal_eeprom + (unsigned) - 0xfff6, tmp, 10); - socalp->socal_rp->socal_cr.w = i; - for (i = SOCAL_N_CQS-1; i >= 0; i--) { - mutex_exit(&socalp->request[i].skc_mtx); - mutex_exit( - &socalp->response[i].skc_mtx); - } - if (ddi_copyout((caddr_t)tmp, - (caddr_t)ver.prom_ver, - ver.prom_ver_len, mode) == -1) - return (EFAULT); - } else { - ver.prom_ver_len = 0; - } - ver.mcode_ver_len = 0; -#ifdef _MULTI_DATAMODEL - if (dm32) { - ver32.fcode_ver_len = ver.fcode_ver_len; - ver32.mcode_ver_len = ver.mcode_ver_len; - ver32.prom_ver_len = ver.prom_ver_len; - ver32.fcode_ver = (caddr32_t)(uintptr_t) - ver.fcode_ver; - ver32.mcode_ver = (caddr32_t)(uintptr_t) - ver.mcode_ver; - ver32.prom_ver = (caddr32_t)(uintptr_t) - ver.prom_ver; - if (ddi_copyout((caddr_t)&ver32, - (caddr_t)arg, sizeof (ver32), - mode) == -1) - return (EFAULT); - } else -#endif /* _MULTI_DATAMODEL */ - if (ddi_copyout((caddr_t)&ver, (caddr_t)arg, - sizeof (struct socal_fm_version), mode) == -1) - return (EFAULT); - break; - case FCIO_LOADUCODE: - mutex_enter(&socalp->k_imr_mtx); - socal_disable(socalp); - mutex_exit(&socalp->k_imr_mtx); - if (copyin((caddr_t)arg, (caddr_t)socal_ucode, 0x10000) - == -1) - return (EFAULT); - /* restart socal after resetting */ - (void) socal_force_reset((void *)socalp, 0, - RESET_PORT); - break; - case FCIO_DUMPXRAM: - for (i = 0; i < SOCAL_N_CQS; i++) { - mutex_enter(&socalp->request[i].skc_mtx); - mutex_enter(&socalp->response[i].skc_mtx); - } - for (i = 0; i < 4; i++) { - offset = arg+(0x10000 * i); - socalp->socal_rp->socal_cr.w &= - ~SOCAL_CR_EXTERNAL_RAM_BANK_MASK; - socalp->socal_rp->socal_cr.w |= i<<24; - (void) copyout((caddr_t)socalp->socal_xrp, - (caddr_t)(uintptr_t)offset, 0x10000); - } - socalp->socal_rp->socal_cr.w &= - ~SOCAL_CR_EXTERNAL_RAM_BANK_MASK; - for (i = SOCAL_N_CQS-1; i >= 0; i--) { - mutex_exit(&socalp->request[i].skc_mtx); - mutex_exit(&socalp->response[i].skc_mtx); - } - break; -#ifdef DEBUG - case FCIO_DUMPXRAMBUF: - (void) copyout((caddr_t)socal_xrambuf, (caddr_t)arg, - 0x40000); - break; -#endif - case FCIO_GETMAP: - mutex_enter(&socalp->ioctl_mtx); - if (socal_getmap(socalp, port, (caddr_t)arg, 0, 0) == - -1) - retval = FCAL_ALLOC_FAILED; - mutex_exit(&socalp->ioctl_mtx); - break; - case FCIO_BYPASS_DEV: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_bypass_dev((void *)socalp, port, arg); - mutex_exit(&socalp->ioctl_mtx); - break; - case FCIO_FORCE_LIP: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_force_lip((void *)socalp, port, 0, - FCAL_FORCE_LIP); - mutex_exit(&socalp->ioctl_mtx); - break; - case FCIO_FORCE_OFFLINE: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_force_offline((void *)socalp, port, 0); - mutex_exit(&socalp->ioctl_mtx); - break; - case FCIO_ADISC_ELS: - { - if ((adisc_pl = - (la_els_adisc_t *)kmem_zalloc( - sizeof (la_els_adisc_t), - KM_NOSLEEP)) == NULL) - return (ENOMEM); - - if (copyin((caddr_t)arg, (caddr_t)adisc_pl, - sizeof (la_els_adisc_t)) == -1) { - kmem_free((void *)adisc_pl, - sizeof (la_els_adisc_t)); - return (EFAULT); - } - mutex_enter(&socalp->ioctl_mtx); - retval = socal_issue_adisc(socalp, port, - adisc_pl->nport_id, - adisc_pl, 0); - mutex_exit(&socalp->ioctl_mtx); - - if (retval == FCAL_SUCCESS) { - if (copyout((caddr_t)adisc_pl, (caddr_t)arg, - sizeof (la_els_adisc_t)) == -1) { - kmem_free((void *)adisc_pl, - sizeof (la_els_adisc_t)); - return (EFAULT); - } - } - - kmem_free((void *)adisc_pl, sizeof (la_els_adisc_t)); - break; - } - case FCIO_LINKSTATUS: - { - int dest; - if ((rls_pl = - (la_els_rls_reply_t *) - kmem_zalloc(sizeof (la_els_rls_reply_t), - KM_NOSLEEP)) == NULL) - return (ENOMEM); - - if (copyin((caddr_t)arg, (caddr_t)rls_pl, - sizeof (la_els_rls_reply_t)) == -1) { - kmem_free((void *)rls_pl, - sizeof (la_els_rls_reply_t)); - return (EFAULT); - } - dest = (rls_pl->mbz[0] << 16) + (rls_pl->mbz[1] << 8) + - rls_pl->mbz[2]; - mutex_enter(&socalp->ioctl_mtx); - retval = socal_issue_rls(socalp, port, dest, - rls_pl, 0); - mutex_exit(&socalp->ioctl_mtx); - - if (retval == FCAL_SUCCESS) { - if (copyout((caddr_t)rls_pl, (caddr_t)arg, - sizeof (la_els_rls_reply_t)) == -1) { - kmem_free((void *)rls_pl, - sizeof (la_els_rls_reply_t)); - return (EFAULT); - } - } - kmem_free((void *)rls_pl, sizeof (la_els_rls_reply_t)); - break; - } - case FCIO_LOOPBACK_INTERNAL: - /* - * If userland doesn't provide a location for a return - * value the driver will permanently offline the port, - * ignoring any checks for devices on the loop. - */ - mutex_enter(&socalp->ioctl_mtx); - if (arg == 0) { - port_statep = &socalp->port_state[port]; - mutex_enter(&port_statep->sp_mtx); - if (port_statep->sp_status & PORT_DISABLED) { - /* Already disabled */ - mutex_exit(&port_statep->sp_mtx); - mutex_exit(&socalp->ioctl_mtx); - return (EALREADY); - } - port_statep->sp_status |= PORT_DISABLED; - mutex_exit(&port_statep->sp_mtx); - } - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_INT_LOOP); - mutex_exit(&socalp->ioctl_mtx); - if (arg == 0) break; - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_LOOPBACK_MANUAL: - mutex_enter(&socalp->ioctl_mtx); - port_statep = &socalp->port_state[port]; - mutex_enter(&port_statep->sp_mtx); - if (port_statep->sp_status & PORT_DISABLED) { - mutex_exit(&port_statep->sp_mtx); - mutex_exit(&socalp->ioctl_mtx); - return (EBUSY); - } - mutex_exit(&port_statep->sp_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_EXT_LOOP); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_NO_LOOPBACK: - mutex_enter(&socalp->ioctl_mtx); - port_statep = &socalp->port_state[port]; - mutex_enter(&port_statep->sp_mtx); - /* Do not allow online if we're disabled */ - if (port_statep->sp_status & PORT_DISABLED) { - if (arg != 0) { - mutex_exit(&port_statep->sp_mtx); - mutex_exit(&socalp->ioctl_mtx); - /* - * It's permanently disabled -- Need to - * enable it first - */ - return (EBUSY); - } - /* This was a request to online. */ - port_statep->sp_status &= ~PORT_DISABLED; - } - mutex_exit(&port_statep->sp_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_REM_LOOP); - mutex_exit(&socalp->ioctl_mtx); - if (arg == 0) break; - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_NOP: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_NOP); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_XRAM: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_XRAM_TEST); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_SOC: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_SOC_TEST); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_HCB: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_HCB_TEST); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_SOCLB: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_SOCLB_TEST); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_SRDSLB: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_SRDSLB_TEST); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_EXTLB: - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - SOC_DIAG_EXTOE_TEST); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_DIAG_RAW: - if (copyin((caddr_t)arg, (caddr_t)&i, sizeof (uint_t)) - == -1) - return (EFAULT); - mutex_enter(&socalp->ioctl_mtx); - retval = socal_diag_request((void *)socalp, port, &r, - (uint_t)i); - mutex_exit(&socalp->ioctl_mtx); - if (copyout((caddr_t)&r, (caddr_t)arg, sizeof (uint_t)) - == -1) - return (EFAULT); - break; - case FCIO_LOOPBACK_FRAME: - if ((flb_hdr = (flb_hdr_t *)kmem_zalloc(sizeof (flb_hdr_t), - KM_NOSLEEP)) == NULL) - return (ENOMEM); - - if (copyin((caddr_t)arg, - (caddr_t)flb_hdr, sizeof (flb_hdr_t)) == -1) { - kmem_free((void *)flb_hdr, sizeof (flb_hdr_t)); - return (EFAULT); - } - - flb_size = flb_hdr->length; - - if ((flb_pl = - (uchar_t *)kmem_zalloc(flb_size, KM_NOSLEEP)) == NULL) - return (ENOMEM); - - if (copyin((caddr_t)(arg + sizeof (flb_hdr_t)), - (caddr_t)flb_pl, flb_size) == -1) { - kmem_free((void *)flb_pl, flb_size); - return (EFAULT); - } - mutex_enter(&socalp->ioctl_mtx); - retval = socal_issue_lbf(socalp, port, flb_pl, - flb_size, 1); - mutex_exit(&socalp->ioctl_mtx); - - if (retval == FCAL_SUCCESS) { - if (copyout((caddr_t)flb_pl, - (caddr_t)(arg + sizeof (flb_hdr_t) + - flb_hdr->max_length), flb_size) == -1) { - kmem_free((void *)flb_pl, flb_size); - kmem_free((void *)flb_hdr, sizeof (flb_hdr_t)); - return (EFAULT); - } - } - - kmem_free((void *)flb_pl, flb_size); - kmem_free((void *)flb_hdr, sizeof (flb_hdr_t)); - break; - default: - return (ENOTTY); - - } - switch (retval) { - case FCAL_SUCCESS: - return (0); - case FCAL_ALLOC_FAILED: - return (ENOMEM); - case FCAL_STATUS_DIAG_BUSY: - return (EALREADY); - case FCAL_STATUS_DIAG_INVALID: - return (EINVAL); - default: - return (EIO); - } - -} - -/* - * Function name : socal_disable() - * - * Return Values : none - * - * Description : Reset the soc+ - * - * Context : Can be called from different kernel process threads. - * Can be called by interrupt thread. - * - * Note: before calling this, the interface should be locked down - * so that it is guaranteed that no other threads are accessing - * the hardware. - */ -static void -socal_disable(socal_state_t *socalp) -{ -#if !defined(lint) - int i; -#endif - /* Don't touch the hardware if the registers aren't mapped */ - if (!socalp->socal_rp) - return; - - socalp->socal_rp->socal_imr = socalp->socal_k_imr = 0; - socalp->socal_rp->socal_csr.w = SOCAL_CSR_SOFT_RESET; -#if !defined(lint) - i = socalp->socal_rp->socal_csr.w; -#endif - DEBUGF(9, (CE_CONT, "csr.w = %x\n", i)); -} - -/* - * Function name : socal_init_transport_interface() - * - * Return Values : none - * - * Description : Fill up the fcal_tranpsort struct for ULPs - * - * - * Note: Only called during attach, so no protection - */ -static void -socal_init_transport_interface(socal_state_t *socalp) -{ - int i; - fcal_transport_t *xport; - - for (i = 0; i < N_SOCAL_NPORTS; i++) { - xport = socalp->port_state[i].sp_transport; - mutex_init(&xport->fcal_mtx, NULL, MUTEX_DRIVER, - (void *)(socalp->iblkc)); - - cv_init(&xport->fcal_cv, NULL, CV_DRIVER, NULL); - - xport->fcal_handle = (void *)socalp; - xport->fcal_dmalimp = socallim; - xport->fcal_iblock = socalp->iblkc; - xport->fcal_dmaattr = &socal_dma_attr; - xport->fcal_accattr = &socal_acc_attr; - xport->fcal_loginparms = socalp->socal_service_params; - bcopy((caddr_t)&socalp->socal_n_wwn, - (caddr_t)&xport->fcal_n_wwn, sizeof (la_wwn_t)); - bcopy((caddr_t)&socalp->port_state[i].sp_p_wwn, - (caddr_t)&xport->fcal_p_wwn, sizeof (la_wwn_t)); - xport->fcal_portno = i; - xport->fcal_cmdmax = SOCAL_MAX_XCHG; - xport->fcal_ops = &socal_transport_ops; - } -} - -/* - * static int - * socal_cqalloc_init() - Inialize the circular queue tables. - * Also, init the locks that are associated with the tables. - * - * Returns: FCAL_SUCCESS, if able to init properly. - * FCAL_FAILURE, if unable to init properly. - */ - -static int -socal_cqalloc_init(socal_state_t *socalp, uint32_t index) -{ - uint32_t cq_size; - size_t real_len; - uint_t ccount; - socal_kcq_t *cqp; - int req_bound = 0, rsp_bound = 0; - - /* - * Initialize the Request and Response Queue locks. - */ - - mutex_init(&socalp->request[index].skc_mtx, NULL, MUTEX_DRIVER, - (void *)socalp->iblkc); - mutex_init(&socalp->response[index].skc_mtx, NULL, MUTEX_DRIVER, - (void *)socalp->iblkc); - cv_init(&socalp->request[index].skc_cv, NULL, CV_DRIVER, NULL); - cv_init(&socalp->response[index].skc_cv, NULL, CV_DRIVER, NULL); - - /* Allocate DVMA resources for the Request Queue. */ - cq_size = socal_req_entries[index] * sizeof (cqe_t); - if (cq_size) { - cqp = &socalp->request[index]; - - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, - &cqp->skc_dhandle) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "driver.4020", - "!alloc of dma handle failed"); - goto fail; - } - - if (ddi_dma_mem_alloc(cqp->skc_dhandle, - cq_size + SOCAL_CQ_ALIGN, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&cqp->skc_cq_raw, &real_len, - &cqp->skc_acchandle) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "driver.4030", - "!alloc of dma space failed"); - goto fail; - } - - if (real_len < (cq_size + SOCAL_CQ_ALIGN)) { - socal_disp_err(socalp, CE_WARN, "driver.4035", - "!alloc of dma space failed"); - goto fail; - } - cqp->skc_cq = (cqe_t *)(((uintptr_t)cqp->skc_cq_raw + - (uintptr_t)SOCAL_CQ_ALIGN - 1) & - ((uintptr_t)(~(SOCAL_CQ_ALIGN-1)))); - - if (ddi_dma_addr_bind_handle(cqp->skc_dhandle, - (struct as *)NULL, (caddr_t)cqp->skc_cq, cq_size, - DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, - NULL, &cqp->skc_dcookie, &ccount) != DDI_DMA_MAPPED) { - socal_disp_err(socalp, CE_WARN, "driver.4040", - "!bind of dma handle failed"); - goto fail; - } - - req_bound = 1; - if (ccount != 1) { - socal_disp_err(socalp, CE_WARN, "driver.4045", - "!bind of dma handle failed"); - goto fail; - } - - } else { - socalp->request[index].skc_cq_raw = NULL; - socalp->request[index].skc_cq = (cqe_t *)NULL; - socalp->request[index].skc_dhandle = 0; - } - - /* Allocate DVMA resources for the response Queue. */ - cq_size = socal_rsp_entries[index] * sizeof (cqe_t); - if (cq_size) { - cqp = &socalp->response[index]; - - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, - &cqp->skc_dhandle) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "driver.4050", - "!alloc of dma handle failed"); - goto fail; - } - - if (ddi_dma_mem_alloc(cqp->skc_dhandle, - cq_size + SOCAL_CQ_ALIGN, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&cqp->skc_cq_raw, &real_len, - &cqp->skc_acchandle) != DDI_SUCCESS) { - socal_disp_err(socalp, CE_WARN, "driver.4060", - "!alloc of dma space failed"); - goto fail; - } - - if (real_len < (cq_size + SOCAL_CQ_ALIGN)) { - socal_disp_err(socalp, CE_WARN, "driver.4065", - "!alloc of dma space failed"); - goto fail; - } - - cqp->skc_cq = (cqe_t *)(((uintptr_t)cqp->skc_cq_raw + - (uintptr_t)SOCAL_CQ_ALIGN - 1) & - ((uintptr_t)(~(SOCAL_CQ_ALIGN-1)))); - - if (ddi_dma_addr_bind_handle(cqp->skc_dhandle, - (struct as *)NULL, (caddr_t)cqp->skc_cq, cq_size, - DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, - NULL, &cqp->skc_dcookie, &ccount) != DDI_DMA_MAPPED) { - socal_disp_err(socalp, CE_WARN, "driver.4070", - "!bind of dma handle failed"); - goto fail; - } - - rsp_bound = 1; - if (ccount != 1) { - socal_disp_err(socalp, CE_WARN, "driver.4075", - "!bind of dma handle failed"); - goto fail; - } - - } else { - socalp->response[index].skc_cq_raw = NULL; - socalp->response[index].skc_cq = (cqe_t *)NULL; - socalp->response[index].skc_dhandle = 0; - } - - /* - * Initialize the queue pointers - */ - socal_cqinit(socalp, index); - - return (FCAL_SUCCESS); -fail: - if (socalp->request[index].skc_dhandle) { - if (req_bound) - (void) ddi_dma_unbind_handle(socalp-> - request[index].skc_dhandle); - ddi_dma_free_handle(&socalp->request[index].skc_dhandle); - } - if (socalp->request[index].skc_cq_raw) - ddi_dma_mem_free(&socalp->request[index].skc_acchandle); - - if (socalp->response[index].skc_dhandle) { - if (rsp_bound) - (void) ddi_dma_unbind_handle(socalp-> - response[index].skc_dhandle); - ddi_dma_free_handle(&socalp->response[index].skc_dhandle); - } - if (socalp->response[index].skc_cq_raw) - ddi_dma_mem_free(&socalp->response[index].skc_acchandle); - - socalp->request[index].skc_dhandle = NULL; - socalp->response[index].skc_dhandle = NULL; - socalp->request[index].skc_cq_raw = NULL; - socalp->request[index].skc_cq = NULL; - socalp->response[index].skc_cq_raw = NULL; - socalp->response[index].skc_cq = NULL; - mutex_destroy(&socalp->request[index].skc_mtx); - mutex_destroy(&socalp->response[index].skc_mtx); - cv_destroy(&socalp->request[index].skc_cv); - cv_destroy(&socalp->response[index].skc_cv); - return (FCAL_FAILURE); - -} - -/* - * socal_cqinit() - initializes the driver's circular queue pointers, etc. - */ - -static void -socal_cqinit(socal_state_t *socalp, uint32_t index) -{ - socal_kcq_t *kcq_req = &socalp->request[index]; - socal_kcq_t *kcq_rsp = &socalp->response[index]; - - /* - * Initialize the Request and Response Queue pointers - */ - kcq_req->skc_seqno = 1; - kcq_rsp->skc_seqno = 1; - kcq_req->skc_in = 0; - kcq_rsp->skc_in = 0; - kcq_req->skc_out = 0; - kcq_rsp->skc_out = 0; - kcq_req->skc_last_index = socal_req_entries[index] - 1; - kcq_rsp->skc_last_index = socal_rsp_entries[index] - 1; - kcq_req->skc_full = 0; - kcq_rsp->deferred_intr_timeoutid = 0; - kcq_req->skc_socalp = socalp; - kcq_rsp->skc_socalp = socalp; - - kcq_req->skc_xram_cqdesc = - (socalp->xram_reqp + (index * sizeof (struct cq))/8); - kcq_rsp->skc_xram_cqdesc = - (socalp->xram_rspp + (index * sizeof (struct cq))/8); - - /* Clear out memory we have allocated */ - if (kcq_req->skc_cq != NULL) - bzero((caddr_t)kcq_req->skc_cq, - socal_req_entries[index] * sizeof (cqe_t)); - if (kcq_rsp->skc_cq != NULL) - bzero((caddr_t)kcq_rsp->skc_cq, - socal_rsp_entries[index] * sizeof (cqe_t)); -} - - -static int -socal_start(socal_state_t *socalp) -{ - uint_t r; - - if (!socalp) - return (FCAL_FAILURE); - - socal_download_ucode(socalp); - socal_init_cq_desc(socalp); - socal_init_wwn(socalp); - - mutex_enter(&socalp->port_state[0].sp_mtx); - socalp->port_state[0].sp_status - &= (PORT_OPEN|PORT_CHILD_INIT|PORT_DISABLED|PORT_TARGET_MODE); - socalp->port_state[0].sp_status |= PORT_OFFLINE; - mutex_exit(&socalp->port_state[0].sp_mtx); - - mutex_enter(&socalp->port_state[1].sp_mtx); - socalp->port_state[1].sp_status - &= (PORT_OPEN|PORT_CHILD_INIT|PORT_DISABLED|PORT_TARGET_MODE); - socalp->port_state[1].sp_status |= PORT_OFFLINE; - mutex_exit(&socalp->port_state[1].sp_mtx); - - socal_enable(socalp); - /* Make sure disabled ports stay disabled. */ - if (socalp->port_state[0].sp_status & PORT_DISABLED) - (void) socal_diag_request((void *)socalp, 0, &r, - SOC_DIAG_INT_LOOP); - if (socalp->port_state[1].sp_status & PORT_DISABLED) - (void) socal_diag_request((void *)socalp, 1, &r, - SOC_DIAG_INT_LOOP); - - mutex_enter(&socalp->k_imr_mtx); - socalp->socal_shutdown = 0; - mutex_exit(&socalp->k_imr_mtx); - - mutex_enter(&socalp->board_mtx); - if (socal_establish_pool(socalp, 1) != FCAL_SUCCESS) { - mutex_exit(&socalp->board_mtx); - return (FCAL_FAILURE); - } - if (socal_add_pool_buffer(socalp, 1) != FCAL_SUCCESS) { - mutex_exit(&socalp->board_mtx); - return (FCAL_FAILURE); - } - - mutex_exit(&socalp->board_mtx); - return (FCAL_SUCCESS); -} - -static void -socal_doreset(socal_state_t *socalp) -{ - int i; - socal_port_t *port_statep; - socal_unsol_cb_t *scbp; - - for (i = 0; i < SOCAL_N_CQS; i++) { - mutex_enter(&socalp->request[i].skc_mtx); - mutex_enter(&socalp->response[i].skc_mtx); - } - - mutex_enter(&socalp->k_imr_mtx); - socal_disable(socalp); - - if (socalp->pool_dhandle) { - (void) ddi_dma_unbind_handle(socalp->pool_dhandle); - ddi_dma_free_handle(&socalp->pool_dhandle); - } - - if (socalp->pool) - ddi_dma_mem_free(&socalp->pool_acchandle); - - socalp->pool_dhandle = NULL; - socalp->pool = NULL; - - for (i = 0; i < SOCAL_N_CQS; i++) - socal_cqinit(socalp, i); - - for (i = 0; i < N_SOCAL_NPORTS; i++) { - port_statep = &socalp->port_state[i]; - - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status &= ~ (PORT_STATUS_MASK | - PORT_LILP_PENDING | PORT_LIP_PENDING | - PORT_ABORT_PENDING | PORT_BYPASS_PENDING | - PORT_ELS_PENDING); - mutex_exit(&port_statep->sp_mtx); - } - - mutex_exit(&socalp->k_imr_mtx); - - for (i = SOCAL_N_CQS-1; i >= 0; i--) { - mutex_exit(&socalp->request[i].skc_mtx); - mutex_exit(&socalp->response[i].skc_mtx); - } - - for (i = 0; i < N_SOCAL_NPORTS; i++) { - for (scbp = socalp->port_state[i].sp_unsol_cb; scbp; - scbp = scbp->next) - (scbp->statec_cb)(scbp->arg, FCAL_STATE_RESET); - } - - for (i = 0; i < SOCAL_N_CQS; i++) { - mutex_enter(&socalp->request[i].skc_mtx); - mutex_enter(&socalp->response[i].skc_mtx); - } - - - for (i = 0; i < SOCAL_N_CQS; i++) { - socalp->request[i].skc_overflowh = NULL; - if (socalp->request[i].skc_full & SOCAL_SKC_SLEEP) - cv_broadcast(&socalp->request[i].skc_cv); - } - - for (i = SOCAL_N_CQS-1; i >= 0; i--) { - mutex_exit(&socalp->request[i].skc_mtx); - mutex_exit(&socalp->response[i].skc_mtx); - } - -} - - -/* - * Function name : socal_download_ucode () - * - * Return Values : - * - * Description : Copies firmware from code that has been linked into - * the socal module into the soc+'s XRAM. Prints the date - * string - * - */ -static void -socal_download_ucode(socal_state_t *socalp) -{ - uint_t fw_len = 0; - uint_t date_str[16]; - auto char buf[256]; - - fw_len = (uint_t)socal_ucode_size; - - /* Copy the firmware image */ - socal_wcopy((uint_t *)&socal_ucode, - (uint_t *)socalp->socal_xrp, fw_len); - - socal_fix_harda(socalp, 0); - socal_fix_harda(socalp, 1); - - /* Get the date string from the firmware image */ - socal_wcopy((uint_t *)(socalp->socal_xrp+SOCAL_XRAM_FW_DATE_STR), - date_str, sizeof (date_str)); - date_str[sizeof (date_str) / sizeof (uint_t) - 1] = 0; - - if (*(caddr_t)date_str != '\0') { - (void) sprintf(buf, - "!Downloading host adapter, fw date code: %s\n", - (caddr_t)date_str); - socal_disp_err(socalp, CE_CONT, "driver.1010", buf); - (void) strcpy(socalp->socal_stats.fw_revision, - (char *)date_str); - } else { - (void) sprintf(buf, - "!Downloading host adapter fw, " - "date code: <not available>\n"); - socal_disp_err(socalp, CE_CONT, "driver.3010", buf); - (void) strcpy(socalp->socal_stats.fw_revision, - "<Not Available>"); - } -} - -/* - * Function name : socal_disp_err() - * - * Return Values : none - * - * Description : displays an error message on the system console - * with the full device pathname displayed - */ -static void -socal_disp_err( - socal_state_t *socalp, - uint_t level, - char *mid, - char *msg) -{ - char c; - int instance; - - instance = ddi_get_instance(socalp->dip); - - c = *msg; - - if (c == '!') /* log only */ - cmn_err(level, - "!ID[SUNWssa.socal.%s] socal%d: %s", mid, instance, msg+1); - else if (c == '?') /* boot message - log && maybe console */ - cmn_err(level, - "?ID[SUNWssa.socal.%s] socal%d: %s", mid, instance, msg+1); - else if (c == '^') /* console only */ - cmn_err(level, "^socal%d: %s", instance, msg+1); - else { /* log and console */ - cmn_err(level, "^socal%d: %s", instance, msg); - cmn_err(level, "!ID[SUNWssa.socal.%s] socal%d: %s", mid, - instance, msg); - } -} - -/* - * Function name : socal_init_cq_desc() - * - * Return Values : none - * - * Description : Initializes the request and response queue - * descriptors in the SOC+'s XRAM - * - * Context : Should only be called during initialiation when - * the SOC+ is reset. - */ -static void -socal_init_cq_desc(socal_state_t *socalp) -{ - soc_cq_t que_desc[SOCAL_N_CQS]; - uint32_t i; - - /* - * Finish CQ table initialization and give the descriptor - * table to the soc+. Note that we don't use all of the queues - * provided by the hardware, but we make sure we initialize the - * quantities in the unused fields in the hardware to zeroes. - */ - - /* - * Do request queues - */ - for (i = 0; i < SOCAL_N_CQS; i++) { - if (socal_req_entries[i]) { - que_desc[i].cq_address = - (uint32_t)socalp->request[i]. - skc_dcookie.dmac_address; - que_desc[i].cq_last_index = socal_req_entries[i] - 1; - } else { - que_desc[i].cq_address = (uint32_t)0; - que_desc[i].cq_last_index = 0; - } - que_desc[i].cq_in = 0; - que_desc[i].cq_out = 0; - que_desc[i].cq_seqno = 1; /* required by SOC+ microcode */ - } - - /* copy to XRAM */ - socal_wcopy((uint_t *)que_desc, /* pointer to kernel copy */ - (uint_t *)socalp->xram_reqp, /* pointer to xram location */ - SOCAL_N_CQS * sizeof (soc_cq_t)); - - /* - * Do response queues - */ - for (i = 0; i < SOCAL_N_CQS; i++) { - if (socal_rsp_entries[i]) { - que_desc[i].cq_last_index = socal_rsp_entries[i] - 1; - que_desc[i].cq_address = - (uint32_t)socalp->response[i]. - skc_dcookie.dmac_address; - - } else { - que_desc[i].cq_address = 0; - que_desc[i].cq_last_index = 0; - } - } - - /* copy to XRAM */ - socal_wcopy((uint_t *)que_desc, /* pointer to kernel copy */ - (uint_t *)socalp->xram_rspp, /* pointer to xram location */ - SOCAL_N_CQS * sizeof (soc_cq_t)); -} - -static void -socal_init_wwn(socal_state_t *socalp) -{ - /* copy the node wwn to xram */ - socal_wcopy((uint_t *)&socalp->socal_n_wwn, - (uint_t *)(socalp->socal_xrp + - SOCAL_XRAM_NODE_WWN), sizeof (la_wwn_t)); - - /* copy port a's wwn to xram */ - socal_wcopy((uint_t *)&socalp->port_state[0].sp_p_wwn, - (uint_t *)(socalp->socal_xrp + SOCAL_XRAM_PORTA_WWN), - sizeof (la_wwn_t)); - - /* copy port b's wwn to xram */ - socal_wcopy((uint_t *)&socalp->port_state[1].sp_p_wwn, - (uint_t *)(socalp->socal_xrp + SOCAL_XRAM_PORTB_WWN), - sizeof (la_wwn_t)); - - /* - * need to avoid deadlock by assuring no other thread grabs both of - * these at once - */ - mutex_enter(&socalp->port_state[0].sp_transport->fcal_mtx); - mutex_enter(&socalp->port_state[1].sp_transport->fcal_mtx); - - socal_wcopy((uint_t *)(socalp->socal_xrp + SOCAL_XRAM_SERV_PARAMS), - (uint_t *)&socalp->socal_service_params, SOCAL_SVC_LENGTH); - mutex_exit(&socalp->port_state[1].sp_transport->fcal_mtx); - mutex_exit(&socalp->port_state[0].sp_transport->fcal_mtx); -} - -static void -socal_enable(socal_state_t *socalp) -{ - DEBUGF(2, (CE_CONT, "socal%d: enable:\n", - ddi_get_instance(socalp->dip))); - - socalp->socal_rp->socal_cr.w = socalp->socal_cfg; - socalp->socal_rp->socal_csr.w = SOCAL_CSR_SOCAL_TO_HOST; - - socalp->socal_k_imr = (uint32_t)SOCAL_CSR_SOCAL_TO_HOST | - SOCAL_CSR_SLV_ACC_ERR; - socalp->socal_rp->socal_imr = (uint32_t)socalp->socal_k_imr; -} - -/* - * static int - * socal_establish_pool() - this routine tells the SOC+ of a buffer pool - * to place LINK ctl application data as it arrives. - * - * Returns: - * FCAL_SUCCESS, upon establishing the pool. - * FCAL_FAILURE, if unable to establish the pool. - */ - -static int -socal_establish_pool(socal_state_t *socalp, uint32_t poolid) -{ - soc_pool_request_t *prq; - int result; - - if ((prq = - (soc_pool_request_t *)kmem_zalloc(sizeof (soc_pool_request_t), - KM_NOSLEEP)) == NULL) - return (FCAL_FAILURE); - /* - * Fill in the request structure. - */ - prq->spr_soc_hdr.sh_request_token = 1; - prq->spr_soc_hdr.sh_flags = SOC_FC_HEADER | SOC_UNSOLICITED | - SOC_NO_RESPONSE; - prq->spr_soc_hdr.sh_class = 0; - prq->spr_soc_hdr.sh_seg_cnt = 1; - prq->spr_soc_hdr.sh_byte_cnt = 0; - - prq->spr_pool_id = poolid; - prq->spr_header_mask = SOCPR_MASK_RCTL; - prq->spr_buf_size = SOCAL_POOL_SIZE; - prq->spr_n_entries = 0; - - prq->spr_fc_frame_hdr.r_ctl = R_CTL_ELS_REQ; - prq->spr_fc_frame_hdr.d_id = 0; - prq->spr_fc_frame_hdr.s_id = 0; - prq->spr_fc_frame_hdr.type = 0; - prq->spr_fc_frame_hdr.f_ctl = 0; - prq->spr_fc_frame_hdr.seq_id = 0; - prq->spr_fc_frame_hdr.df_ctl = 0; - prq->spr_fc_frame_hdr.seq_cnt = 0; - prq->spr_fc_frame_hdr.ox_id = 0; - prq->spr_fc_frame_hdr.rx_id = 0; - prq->spr_fc_frame_hdr.ro = 0; - - prq->spr_cqhdr.cq_hdr_count = 1; - prq->spr_cqhdr.cq_hdr_type = CQ_TYPE_ADD_POOL; - prq->spr_cqhdr.cq_hdr_flags = 0; - prq->spr_cqhdr.cq_hdr_seqno = 0; - - /* Enque the request. */ - result = socal_cq_enque(socalp, NULL, (cqe_t *)prq, CQ_REQUEST_1, - FCAL_NOSLEEP, NULL, 0); - kmem_free((void *)prq, sizeof (soc_pool_request_t)); - return (result); - -} - - -/* - * static int - * soc_add_pool_buffer() - this routine tells the SOC+ to add one buffer - * to an established pool of buffers - * - * Returns: - * DDI_SUCCESS, upon establishing the pool. - * DDI_FAILURE, if unable to establish the pool. - */ - -static int -socal_add_pool_buffer(socal_state_t *socalp, uint32_t poolid) -{ - soc_data_request_t *drq; - int result; - size_t real_len; - int bound = 0; - uint_t ccount; - - if ((drq = - (soc_data_request_t *)kmem_zalloc(sizeof (soc_data_request_t), - KM_NOSLEEP)) == NULL) - return (FCAL_FAILURE); - - /* Allocate DVMA resources for the buffer pool */ - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, &socalp->pool_dhandle) != DDI_SUCCESS) - goto fail; - - if (ddi_dma_mem_alloc(socalp->pool_dhandle, SOCAL_POOL_SIZE, - &socal_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&socalp->pool, &real_len, &socalp->pool_acchandle) - != DDI_SUCCESS) - goto fail; - - if (real_len < SOCAL_POOL_SIZE) - goto fail; - - if (ddi_dma_addr_bind_handle(socalp->pool_dhandle, (struct as *)NULL, - (caddr_t)socalp->pool, SOCAL_POOL_SIZE, - DDI_DMA_READ | DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, - NULL, &socalp->pool_dcookie, &ccount) != DDI_DMA_MAPPED) - goto fail; - - bound = 1; - if (ccount != 1) - goto fail; - - /* - * Fill in the request structure. - */ - drq->sdr_soc_hdr.sh_request_token = poolid; - drq->sdr_soc_hdr.sh_flags = SOC_UNSOLICITED | SOC_NO_RESPONSE; - drq->sdr_soc_hdr.sh_class = 0; - drq->sdr_soc_hdr.sh_seg_cnt = 1; - drq->sdr_soc_hdr.sh_byte_cnt = 0; - - drq->sdr_dataseg[0].fc_base = - (uint32_t)socalp->pool_dcookie.dmac_address; - drq->sdr_dataseg[0].fc_count = SOCAL_POOL_SIZE; - drq->sdr_dataseg[1].fc_base = 0; - drq->sdr_dataseg[1].fc_count = 0; - drq->sdr_dataseg[2].fc_base = 0; - drq->sdr_dataseg[2].fc_count = 0; - drq->sdr_dataseg[3].fc_base = 0; - drq->sdr_dataseg[3].fc_count = 0; - drq->sdr_dataseg[4].fc_base = 0; - drq->sdr_dataseg[4].fc_count = 0; - drq->sdr_dataseg[5].fc_base = 0; - drq->sdr_dataseg[5].fc_count = 0; - - drq->sdr_cqhdr.cq_hdr_count = 1; - drq->sdr_cqhdr.cq_hdr_type = CQ_TYPE_ADD_BUFFER; - drq->sdr_cqhdr.cq_hdr_flags = 0; - drq->sdr_cqhdr.cq_hdr_seqno = 0; - - /* Transport the request. */ - result = socal_cq_enque(socalp, NULL, (cqe_t *)drq, CQ_REQUEST_1, - FCAL_NOSLEEP, NULL, 0); - kmem_free((void *)drq, sizeof (soc_data_request_t)); - return (result); - -fail: - socal_disp_err(socalp, CE_WARN, "driver.4110", - "!Buffer pool DVMA alloc failed"); - if (socalp->pool_dhandle) { - if (bound) - (void) ddi_dma_unbind_handle(socalp->pool_dhandle); - ddi_dma_free_handle(&socalp->pool_dhandle); - } - if (socalp->pool) - ddi_dma_mem_free(&socalp->pool_acchandle); - socalp->pool_dhandle = NULL; - return (FCAL_FAILURE); -} - -static uint_t -socal_transport(fcal_packet_t *fcalpkt, fcal_sleep_t sleep, int req_q_no) -{ - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - socal_port_t *port_statep; -#if defined(DEBUG) && !defined(lint) - int instance = ddi_get_instance(socalp->dip); -#endif - int port; - soc_request_t *sp = (soc_request_t *)&fcalpkt->fcal_socal_request; - - if (sp->sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - port_statep = &socalp->port_state[port]; - - DEBUGF(4, (CE_CONT, "socal%d: transport: packet, sleep = %p, %d\n", - instance, fcalpkt, sleep)); - - fcalpkt->fcal_cmd_state = 0; - fcalpkt->fcal_pkt_flags &= ~(FCFLAG_COMPLETE | FCFLAG_ABORTING); - - return (socal_cq_enque(socalp, port_statep, (cqe_t *)sp, - req_q_no, sleep, fcalpkt, 0)); -} - -/* - * Function name : socal_cq_enque() - * - * Return Values : - * FCAL_TRANSPORT_SUCCESS, if able to que the entry. - * FCAL_TRANSPORT_QFULL, if queue full & sleep not set - * FCAL_TRANSPORT_UNAVAIL if this port down - * - * Description : Enqueues an entry into the solicited request - * queue - * - * Context : - */ - -/*ARGSUSED*/ -static int -socal_cq_enque(socal_state_t *socalp, socal_port_t *port_statep, cqe_t *cqe, - int rqix, fcal_sleep_t sleep, fcal_packet_t *to_queue, - int mtxheld) -{ -#if defined(DEBUG) && !defined(lint) - int instance = ddi_get_instance(socalp->dip); -#endif - socal_kcq_t *kcq; - cqe_t *sp; - uint_t bitmask, wmask; - uchar_t out; - uchar_t s_out; - longlong_t *p, *q; - - kcq = &socalp->request[rqix]; - - bitmask = SOCAL_CSR_1ST_H_TO_S << rqix; - wmask = SOCAL_CSR_SOCAL_TO_HOST | bitmask; - p = (longlong_t *)cqe; - - /* - * Since we're only reading we don't need a mutex. - */ - if (socalp->socal_shutdown) { - return (FCAL_TRANSPORT_UNAVAIL); - } - /* - * Get a token early. That way we won't sleep - * in id32_alloc() with a mutex held. - */ - if (to_queue) { - if ((to_queue->fcal_socal_request.sr_soc_hdr.sh_request_token = - SOCAL_ID_GET(to_queue, mtxheld ? FCAL_NOSLEEP : - sleep)) == 0) { - return (FCAL_TRANSPORT_QFULL); - } - } - /* - * Grab lock for request queue. - */ - - if (!mtxheld) - mutex_enter(&kcq->skc_mtx); - - /* - * Determine if the queue is full - */ - - do { - - if (kcq->skc_full) { - /* - * If soc's queue full, then we wait for an interrupt - * telling us we are not full. - */ - - if (to_queue) { - to_queue->fcal_pkt_next = NULL; - if (!kcq->skc_overflowh) { - DEBUGF(2, (CE_CONT, - "socal%d: cq_enque: request " - "que %d is full\n", - instance, rqix)); - kcq->skc_overflowh = to_queue; - socalp->socal_stats.qfulls++; - } else - kcq->skc_overflowt->fcal_pkt_next = to_queue; - kcq->skc_overflowt = to_queue; - - mutex_enter(&socalp->k_imr_mtx); - socalp->socal_rp->socal_imr = - (socalp->socal_k_imr |= bitmask); - mutex_exit(&socalp->k_imr_mtx); - to_queue->fcal_cmd_state |= FCAL_CMD_IN_TRANSPORT; - if (!mtxheld) - mutex_exit(&kcq->skc_mtx); - return (FCAL_TRANSPORT_SUCCESS); - } - - if (!mtxheld) - mutex_exit(&kcq->skc_mtx); - return (FCAL_TRANSPORT_QFULL); - } - - if (((kcq->skc_in + 1) & kcq->skc_last_index) - == (out = kcq->skc_out)) { - /* - * get SOC+'s copy of out to update our copy of out - */ - s_out = - SOCAL_REQUESTQ_INDEX(rqix, socalp->socal_rp->socal_reqp.w); - DEBUGF(2, (CE_CONT, - "socal%d: cq_enque: &XRAM cq_in: 0x%p s_out.out 0x%x\n", - instance, &kcq->skc_xram_cqdesc->cq_in, s_out)); - - kcq->skc_out = out = s_out; - /* if soc+'s que still full set flag */ - kcq->skc_full = ((((kcq->skc_in + 1) & - kcq->skc_last_index) == out)) ? SOCAL_SKC_FULL : 0; - } - - } while (kcq->skc_full); - - /* Now enque the entry. */ - sp = &(kcq->skc_cq[kcq->skc_in]); - cqe->cqe_hdr.cq_hdr_seqno = kcq->skc_seqno; - - /* Give the entry to the SOC. */ - q = (longlong_t *)sp; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q = *p; - (void) ddi_dma_sync(kcq->skc_dhandle, (int)((caddr_t)sp - - (caddr_t)kcq->skc_cq), sizeof (cqe_t), DDI_DMA_SYNC_FORDEV); - if (to_queue) - to_queue->fcal_cmd_state |= FCAL_CMD_IN_TRANSPORT; - - /* - * Update circular queue and ring SOC's doorbell. - */ - kcq->skc_in++; - if ((kcq->skc_in & kcq->skc_last_index) == 0) { - kcq->skc_in = 0; - kcq->skc_seqno++; - } - - socalp->socal_rp->socal_csr.w = wmask | (kcq->skc_in << 24); - /* Let lock go for request queue. */ - if (!mtxheld) - mutex_exit(&kcq->skc_mtx); - - return (FCAL_TRANSPORT_SUCCESS); -} - -static uint_t -socal_transport_poll(fcal_packet_t *fcalpkt, uint_t timeout, int req_q_no) -{ - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - register volatile socal_reg_t *socalreg = socalp->socal_rp; - uint_t csr; - socal_port_t *port_statep; - int port; - soc_request_t *sp = (soc_request_t *)&fcalpkt->fcal_socal_request; - uint32_t retval; - clock_t ticker, t; - - /* make the timeout meaningful */ - timeout = drv_usectohz(timeout); - if (sp->sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - port_statep = &socalp->port_state[port]; - - fcalpkt->fcal_cmd_state = 0; - fcalpkt->fcal_pkt_flags &= ~(FCFLAG_COMPLETE | FCFLAG_ABORTING); - - ticker = ddi_get_lbolt(); - - if ((retval = socal_cq_enque(socalp, port_statep, (cqe_t *)sp, - req_q_no, FCAL_NOSLEEP, fcalpkt, 0)) != FCAL_TRANSPORT_SUCCESS) { - return (retval); - } else { - while (!(fcalpkt->fcal_cmd_state & FCAL_CMD_COMPLETE)) { - drv_usecwait(SOCAL_NOINTR_POLL_DELAY_TIME); - t = ddi_get_lbolt(); - if ((ticker + timeout) < t) - return (FCAL_TRANSPORT_TIMEOUT); - csr = socalreg->socal_csr.w; - if ((SOCAL_INTR_CAUSE(socalp, csr)) & - SOCAL_CSR_RSP_QUE_0) { - socal_intr_solicited(socalp, 0); - } - } - } - return (FCAL_TRANSPORT_SUCCESS); -} - -static uint_t -socal_doit(fcal_packet_t *fcalpkt, socal_port_t *port_statep, int polled, - void (*func)(), int timo, int flag, uint_t *diagcode) -{ - clock_t lb; - uint32_t retval, status; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (polled) { - fcalpkt->fcal_pkt_comp = NULL; - status = socal_transport_poll(fcalpkt, timo, CQ_REQUEST_0); - } else { - fcalpkt->fcal_pkt_comp = func; - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status |= flag; - if ((status = socal_transport(fcalpkt, FCAL_NOSLEEP, - CQ_REQUEST_0)) == FCAL_TRANSPORT_SUCCESS) { - lb = ddi_get_lbolt(); - while (!(fcalpkt->fcal_cmd_state & FCAL_CMD_COMPLETE)) { - if ((retval = cv_timedwait(&port_statep->sp_cv, - &port_statep->sp_mtx, - lb+drv_usectohz(timo))) == -1) { - status = FCAL_TRANSPORT_TIMEOUT; - break; - } - } - } - port_statep->sp_status &= ~flag; - mutex_exit(&port_statep->sp_mtx); - } - - switch (status) { - case FCAL_TRANSPORT_SUCCESS: - status = fcalpkt->fcal_pkt_status; - if (diagcode) - *diagcode = fcalpkt->fcal_diag_status; - switch (status) { - case FCAL_STATUS_ABORT_FAILED: - if (flag == PORT_ABORT_PENDING) - retval = FCAL_ABORT_FAILED; - break; - case FCAL_STATUS_OK: - if (flag == PORT_ABORT_PENDING) - retval = FCAL_ABORT_FAILED; - else - retval = FCAL_SUCCESS; - break; - case FCAL_STATUS_OLD_PORT: - retval = FCAL_OLD_PORT; - break; - case FCAL_STATUS_ERR_OFFLINE: - retval = FCAL_OFFLINE; - break; - case FCAL_STATUS_ABORTED: - retval = FCAL_ABORTED; - port_statep->sp_board-> - socal_stats.pstats[port_statep - ->sp_port].abts_ok++; - break; - case FCAL_STATUS_BAD_XID: - retval = FCAL_BAD_ABORT; - break; - case FCAL_STATUS_BAD_DID: - retval = FCAL_BAD_PARAMS; - break; - case FCAL_STATUS_DIAG_BUSY: - case FCAL_STATUS_DIAG_INVALID: - retval = status; - break; - default: - retval = FCAL_LINK_ERROR; - } - break; - case FCAL_TRANSPORT_TIMEOUT: - if (flag == PORT_LIP_PENDING || - flag == PORT_LILP_PENDING) { - if (socal_core && - (socal_core & SOCAL_FAILED_LIP)) { - socal_core = 0; - socal_take_core(socalp); - } - socal_disp_err(socalp, CE_WARN, "link.6040", - "SOCAL:Forcing SOC+ reset as LIP timed out\n"); - /* restart socal after resetting */ - (void) socal_force_reset(port_statep->sp_board, - polled, RESET_PORT); - } - else - (void) socal_force_lip(port_statep->sp_board, - port_statep->sp_port, polled, - FCAL_FORCE_LIP); - retval = FCAL_TIMEOUT; - break; - case FCAL_TRANSPORT_FAILURE: - case FCAL_BAD_PACKET: - case FCAL_TRANSPORT_UNAVAIL: - case FCAL_TRANSPORT_QFULL: - retval = status; - break; - default: - retval = FCAL_LINK_ERROR; - } - socal_packet_free(fcalpkt); - return (retval); -} - -static uint_t -socal_lilp_map(void *ssp, uint_t port, uint32_t bufid, uint_t polled) -{ - fcal_packet_t *fcalpkt; - soc_data_request_t *sdr; - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep = &socalp->port_state[port]; - - if ((fcalpkt = - socal_packet_alloc(socalp, polled ? FCAL_NOSLEEP : FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - sdr = (soc_data_request_t *)&fcalpkt->fcal_socal_request; - if (port) - sdr->sdr_soc_hdr.sh_flags = SOC_PORT_B; - sdr->sdr_soc_hdr.sh_seg_cnt = 1; - sdr->sdr_soc_hdr.sh_byte_cnt = 132; - sdr->sdr_dataseg[0].fc_base = bufid; - sdr->sdr_dataseg[0].fc_count = 132; - sdr->sdr_cqhdr.cq_hdr_count = 1; - sdr->sdr_cqhdr.cq_hdr_type = CQ_TYPE_REPORT_MAP; - fcalpkt->fcal_pkt_cookie = (void *)socalp; - - return (socal_doit(fcalpkt, port_statep, polled, socal_lilp_map_done, - SOCAL_LILP_TIMEOUT, PORT_LILP_PENDING, NULL)); -} - -static uint_t -socal_force_lip(void *ssp, uint_t port, uint_t polled, uint_t lip_req) -{ - fcal_packet_t *fcalpkt; - soc_cmdonly_request_t *scr; - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep = &socalp->port_state[port]; - - - if (lip_req == FCAL_NO_LIP) { - mutex_enter(&port_statep->sp_mtx); - if ((port_statep->sp_status & PORT_ONLINE_LOOP) && - (port_statep->sp_unsol_cb->statec_cb != NULL)) { - mutex_exit(&port_statep->sp_mtx); - (*port_statep->sp_unsol_cb->statec_cb) - (port_statep->sp_unsol_cb->arg, - FCAL_STATUS_LOOP_ONLINE); - return (FCAL_SUCCESS); - - } else - mutex_exit(&port_statep->sp_mtx); - } - socalp->socal_stats.pstats[port].lips++; - if ((fcalpkt = - socal_packet_alloc(socalp, polled ? FCAL_NOSLEEP : FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - scr = (soc_cmdonly_request_t *)&fcalpkt->fcal_socal_request; - if (port) - scr->scr_soc_hdr.sh_flags = SOC_PORT_B; - scr->scr_cqhdr.cq_hdr_count = 1; - scr->scr_cqhdr.cq_hdr_type = CQ_TYPE_REQUEST_LIP; - - fcalpkt->fcal_pkt_cookie = (void *)socalp; - return (socal_doit(fcalpkt, port_statep, polled, socal_force_lip_done, - SOCAL_LIP_TIMEOUT, PORT_LIP_PENDING, NULL)); -} - -static uint_t -socal_abort_cmd(void *ssp, uint_t port, fcal_packet_t *fcalpkt, uint_t polled) -{ - fcal_packet_t *fcalpkt2, *fpkt; - soc_cmdonly_request_t *scr, *tscr; - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep = &socalp->port_state[port]; - socal_kcq_t *kcq; - - socalp->socal_stats.pstats[port].abts++; - kcq = &socalp->request[CQ_REQUEST_1]; - mutex_enter(&kcq->skc_mtx); - fcalpkt2 = kcq->skc_overflowh; - fpkt = NULL; - while (fcalpkt2 != NULL) { - if (fcalpkt2 == fcalpkt) { - if (fpkt == NULL) - kcq->skc_overflowh = fcalpkt->fcal_pkt_next; - else { - fpkt->fcal_pkt_next = fcalpkt->fcal_pkt_next; - if (kcq->skc_overflowt == fcalpkt) - kcq->skc_overflowt = fpkt; - } - mutex_exit(&kcq->skc_mtx); - socalp->socal_stats.pstats[port].abts_ok++; - SOCAL_ID_FREE(fcalpkt->fcal_socal_request. - sr_soc_hdr.sh_request_token); - return (FCAL_ABORTED); - } else { - fpkt = fcalpkt2; - fcalpkt2 = fcalpkt2->fcal_pkt_next; - } - } - mutex_exit(&kcq->skc_mtx); - if ((fcalpkt2 = - socal_packet_alloc(socalp, polled ? FCAL_NOSLEEP : FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - mutex_enter(&socalp->abort_mtx); - /* Too late? */ - if (fcalpkt->fcal_pkt_flags & FCFLAG_COMPLETE) { - socal_packet_free(fcalpkt2); - mutex_exit(&socalp->abort_mtx); - return (FCAL_ABORTED); - /* I lied. So shoot me. */ - } - /* Mark packet as being aborted and put it in the abort pending list. */ - fcalpkt->fcal_pkt_flags |= FCFLAG_ABORTING; - - scr = (soc_cmdonly_request_t *)&fcalpkt2->fcal_socal_request; - tscr = (soc_cmdonly_request_t *)&fcalpkt->fcal_socal_request; - scr->scr_soc_hdr.sh_byte_cnt = tscr->scr_soc_hdr.sh_request_token; - scr->scr_cqhdr.cq_hdr_count = 1; - scr->scr_cqhdr.cq_hdr_type = CQ_TYPE_REQUEST_ABORT; - if (port) - scr->scr_soc_hdr.sh_flags = SOC_PORT_B; - fcalpkt2->fcal_pkt_cookie = (void *)socalp; - mutex_exit(&socalp->abort_mtx); - - return (socal_doit(fcalpkt2, port_statep, polled, socal_abort_done, - SOCAL_ABORT_TIMEOUT, PORT_ABORT_PENDING, NULL)); -} - -/*ARGSUSED*/ -static uint_t -socal_els(void *ssp, uint_t port, uint_t elscode, uint_t dest, - void (*callback)(), void *arg, caddr_t reqpl, caddr_t *rsppl, - uint_t sleep) -{ - return (FCAL_TRANSPORT_FAILURE); -} - -static uint_t -socal_bypass_dev(void *ssp, uint_t port, uint_t dest) -{ - fcal_packet_t *fcalpkt; - soc_cmdonly_request_t *scr; - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep = &socalp->port_state[port]; - - if ((fcalpkt = - socal_packet_alloc(socalp, FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - scr = (soc_cmdonly_request_t *)&fcalpkt->fcal_socal_request; - if (port) - scr->scr_soc_hdr.sh_flags = SOC_PORT_B; - scr->scr_soc_hdr.sh_byte_cnt = dest; - scr->scr_cqhdr.cq_hdr_count = 1; - scr->scr_cqhdr.cq_hdr_type = CQ_TYPE_BYPASS_DEV; - return (socal_doit(fcalpkt, port_statep, 0, socal_bypass_dev_done, - SOCAL_BYPASS_TIMEOUT, PORT_BYPASS_PENDING, NULL)); -} - - -/*ARGSUSED*/ -static void -socal_force_reset(void *ssp, uint_t port, uint_t restart) -{ - socal_state_t *socalp = (socal_state_t *)ssp; - - mutex_enter(&socalp->k_imr_mtx); - if (socalp->socal_shutdown) { - mutex_exit(&socalp->k_imr_mtx); - return; - } else { - socalp->socal_shutdown = 1; - mutex_exit(&socalp->k_imr_mtx); - } - socalp->socal_stats.resets++; - socal_doreset(socalp); - if (restart) { - if (socal_start(socalp) != FCAL_SUCCESS) { - cmn_err(CE_WARN, "socal: start failed.\n"); - } - } -} - - -static void -socal_add_ulp(void *ssp, uint_t port, uchar_t type, - void (*ulp_statec_callback)(), void (*ulp_els_callback)(), - void (*ulp_data_callback)(), void *arg) -{ - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep = &socalp->port_state[port]; - socal_unsol_cb_t *cbentry; - - mutex_enter(&port_statep->sp_mtx); - for (cbentry = port_statep->sp_unsol_cb; cbentry; - cbentry = cbentry->next) { - if (cbentry->type == type) { - cbentry->statec_cb = ulp_statec_callback; - cbentry->els_cb = ulp_els_callback; - cbentry->data_cb = ulp_data_callback; - cbentry->arg = arg; - mutex_exit(&port_statep->sp_mtx); - return; - } - } - mutex_exit(&port_statep->sp_mtx); - if ((cbentry = - (socal_unsol_cb_t *)kmem_zalloc(sizeof (socal_unsol_cb_t), - KM_SLEEP)) == (socal_unsol_cb_t *)NULL) { - return; - } - mutex_enter(&port_statep->sp_mtx); - cbentry->statec_cb = ulp_statec_callback; - cbentry->els_cb = ulp_els_callback; - cbentry->data_cb = ulp_data_callback; - cbentry->arg = arg; - cbentry->type = type; - - cbentry->next = port_statep->sp_unsol_cb; - port_statep->sp_unsol_cb = cbentry; - mutex_exit(&port_statep->sp_mtx); -} - - -/* - * remove a ULP with matching type and arg - */ -static void -socal_remove_ulp(void *ssp, uint_t port, uchar_t type, void *arg) -{ - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep; - socal_unsol_cb_t *cbentry; - socal_unsol_cb_t *p_cbentry; - - - ASSERT(ssp != NULL); - port_statep = &socalp->port_state[port]; - ASSERT(port_statep != NULL); - - /* scan the list of unsolicited callback entries */ - mutex_enter(&port_statep->sp_mtx); - p_cbentry = NULL; - for (cbentry = port_statep->sp_unsol_cb; - cbentry != NULL; - p_cbentry = cbentry, cbentry = cbentry->next) { - if ((cbentry->type != type) || (cbentry->arg != arg)) { - continue; /* this entry doesn't match */ - } - /* found entry to remove */ - if (port_statep->sp_unsol_cb == cbentry) { - /* remove first entry in list */ - port_statep->sp_unsol_cb = cbentry->next; - } else { - /* remove other entry in list */ - if (p_cbentry) - p_cbentry->next = cbentry->next; - } - kmem_free((void *)cbentry, sizeof (socal_unsol_cb_t)); - DEBUGF(2, (CE_CONT, "socal port %d ULP removed\n", port)); - break; - } - mutex_exit(&port_statep->sp_mtx); -} - - -/* - * static unsigned int - * socal_intr() - this is the interrupt routine for the SOC. Process all - * possible incoming interrupts from the soc device. - */ - -static unsigned int -socal_intr(caddr_t arg) -{ - socal_state_t *socalp = (socal_state_t *)arg; - register volatile socal_reg_t *socalreg = socalp->socal_rp; - unsigned csr; - int cause = 0; -#if !defined(lint) - int instance = ddi_get_instance(socalp->dip); -#endif - int i, j, request; - char full; - struct fcal_packet *fpkt, *nfpkt; - - csr = socalreg->socal_csr.w; - cause = (int)SOCAL_INTR_CAUSE(socalp, csr); - - DEBUGF(2, (CE_CONT, - "socal%d: intr: csr: 0x%x cause: 0x%x\n", - instance, csr, cause)); - - if (!cause) { - socalp->socal_on_intr = 0; - return (DDI_INTR_UNCLAIMED); - } - - socalp->socal_on_intr = 1; - - while (cause) { - - /* - * Process the unsolicited messages first in case there are some - * high priority async events that we should act on. - * - */ - - if (cause & SOCAL_CSR_RSP_QUE_1) { - socal_intr_unsolicited(socalp, 1); - DEBUGF(4, (CE_CONT, "socal%d intr: did unsolicited\n", instance)); - } - - if (cause & SOCAL_CSR_RSP_QUE_0) { - socal_intr_solicited(socalp, 0); - DEBUGF(4, (CE_CONT, "socal%d intr: did solicited\n", instance)); - } - - /* - * for use with token-only response queues in the future - * if (cause & SOCAL_CSR_RSP_QUE_0) { - * socal_intr_solicited(socalp, 0); - * } - */ - - - /* - * Process any request interrupts - * We only allow request interrupts when the request - * queue is full and we are waiting so we can enque - * another command. - */ - if ((request = (cause & SOCAL_CSR_HOST_TO_SOCAL)) != 0) { - socalp->socal_stats.reqq_intrs++; - for (i = SOCAL_CSR_1ST_H_TO_S, j = 0; j < SOCAL_N_CQS; - j++, i <<= 1) { - if (request & i) { - socal_kcq_t *kcq = &socalp->request[j]; - - if (kcq->skc_full) { - mutex_enter(&kcq->skc_mtx); - full = kcq->skc_full; - kcq->skc_full = 0; - while ((fpkt = kcq->skc_overflowh) != NULL) { - nfpkt = fpkt->fcal_pkt_next; - fpkt->fcal_pkt_next = NULL; - kcq->skc_overflowh = nfpkt; - if (socal_cq_enque(socalp, (socal_port_t *) - fpkt->fcal_pkt_cookie, - (cqe_t *)&fpkt->fcal_socal_request, - j, FCAL_NOSLEEP, NULL, 1) != - FCAL_TRANSPORT_SUCCESS) { - break; - } - } - if (!kcq->skc_overflowh) { - if (full & SOCAL_SKC_SLEEP) - cv_broadcast(&kcq->skc_cv); - - /* Disable this queue's intrs */ - DEBUGF(2, (CE_CONT, - "socal%d: req que %d overflow cleared\n", - instance, j)); - mutex_enter(&socalp->k_imr_mtx); - socalp->socal_rp->socal_imr = - (socalp->socal_k_imr &= ~i); - mutex_exit(&socalp->k_imr_mtx); - } - mutex_exit(&kcq->skc_mtx); - } - } - } - } - csr = socalreg->socal_csr.w; - cause = (int)SOCAL_INTR_CAUSE(socalp, csr); - DEBUGF(4, (CE_CONT, "socal%d intr: did request queues\n", instance)); - - } - - socalp->socal_on_intr = 0; - return (DDI_INTR_CLAIMED); -} - -static void -socal_intr_solicited(socal_state_t *socalp, uint32_t srq) -{ - socal_kcq_t *kcq; - volatile socal_kcq_t *kcqv; - soc_response_t *srp; - cqe_t *cqe; - uint_t status, i; - fcal_packet_t *fcalpkt = NULL; - soc_header_t *shp; - register volatile socal_reg_t *socalreg = socalp->socal_rp; - caddr_t src, dst; - uchar_t index_in; - cq_hdr_t *cq_hdr; - char val; - int port; - -#if defined(DEBUG) && !defined(lint) - int instance = ddi_get_instance(socalp->dip); -#endif - auto char buf[80]; - - kcq = &socalp->response[srq]; - kcqv = (volatile socal_kcq_t *)kcq; - DEBUGF(4, (CE_CONT, "socal%d intr_sol: entered \n", instance)); - - /* - * Grab lock for request queue. - */ - mutex_enter(&kcq->skc_mtx); - - /* - * Process as many response queue entries as we can. - */ - cqe = &(kcq->skc_cq[kcqv->skc_out]); - - index_in = SOCAL_RESPONSEQ_INDEX(srq, socalreg->socal_rspp.w); - - if (index_in == kcqv->skc_out) { - socalreg->socal_csr.w = ((kcqv->skc_out << 24) | - (SOCAL_CSR_SOCAL_TO_HOST & ~SOCAL_CSR_RSP_QUE_0)); - - /* make sure the write completed */ - i = socalreg->socal_csr.w; - - index_in = SOCAL_RESPONSEQ_INDEX(srq, socalreg->socal_rspp.w); - } - - kcqv->skc_in = index_in; - - while (kcqv->skc_out != index_in) { - /* Find out where the newest entry lives in the queue */ - (void) ddi_dma_sync(kcq->skc_dhandle, 0, 0, - DDI_DMA_SYNC_FORKERNEL); - - srp = (soc_response_t *)cqe; - port = srp->sr_soc_hdr.sh_flags & SOC_PORT_B; - shp = &srp->sr_soc_hdr; - cq_hdr = &srp->sr_cqhdr; - /* - * It turns out that on faster CPU's we have a problem where - * the soc interrupts us before the response has been DMA'ed - * in. This should not happen but does !!. So to workaround - * the problem for now, check the sequence # of the response. - * If it does not match with what we have, we must be - * reading stale data - */ - if (cq_hdr->cq_hdr_seqno != kcqv->skc_seqno) { -#if defined(DEBUG) && !defined(lint) - socal_read_stale_data++; -#endif - if (kcq->deferred_intr_timeoutid) { - mutex_exit(&kcq->skc_mtx); - return; - } else { - kcq->skc_saved_out = kcqv->skc_out; - kcq->skc_saved_seqno = kcqv->skc_seqno; - kcq->deferred_intr_timeoutid = timeout( - socal_deferred_intr, (caddr_t)kcq, - drv_usectohz(10000)); - mutex_exit(&kcq->skc_mtx); - return; - } - } - - fcalpkt = (fcal_packet_t *) - SOCAL_ID_LOOKUP(shp->sh_request_token); - - if ((socal_core & SOCAL_TAKE_CORE) && ddi_peek8(socalp->dip, - (char *)fcalpkt, &val) != DDI_SUCCESS) { - cmn_err(CE_WARN, "bad token = %p\n", (void *)fcalpkt); - mutex_exit(&kcq->skc_mtx); - socal_take_core(socalp); - } - - if ((fcalpkt == (fcal_packet_t *)NULL) || - (fcalpkt->fcal_magic != FCALP_MAGIC)) { - (void) sprintf(buf, "!invalid FC packet; \n\ - in, out, seqno = 0x%x, 0x%x, 0x%x\n", - kcqv->skc_in, kcqv->skc_out, kcqv->skc_seqno); - socal_disp_err(socalp, CE_WARN, "link.4060", buf); - DEBUGF(4, (CE_CONT, - "\tsoc CR: 0x%x SAE: 0x%x CSR: 0x%x IMR: 0x%x\n", - socalreg->socal_cr.w, - socalreg->socal_sae.w, - socalreg->socal_csr.w, - socalreg->socal_imr)); - /* - * Update response queue ptrs and soc registers. - */ - kcqv->skc_out++; - if ((kcqv->skc_out & kcq->skc_last_index) == 0) { - kcqv->skc_out = 0; - kcqv->skc_seqno++; - } - - } else { - - DEBUGF(2, (CE_CONT, "packet 0x%p complete\n", - fcalpkt)); - status = srp->sr_soc_status; - fcalpkt->fcal_pkt_status = status; - DEBUGF(2, (CE_CONT, "SOC status: 0x%x\n", status)); - /* - * map soc status codes to - * transport status codes - */ - - ASSERT((fcalpkt->fcal_cmd_state & FCAL_CMD_COMPLETE) - == 0); - mutex_enter(&socalp->abort_mtx); - fcalpkt->fcal_pkt_flags |= FCFLAG_COMPLETE; - mutex_exit(&socalp->abort_mtx); - - /* - * Copy the response frame header (if there is one) - * so that the upper levels can use it. Note that, - * for now, we'll copy the header only if there was - * some sort of non-OK status, to save the PIO reads - * required to get the header from the host adapter's - * xRAM. - */ - if (((status != FCAL_STATUS_OK) || - (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags - & SOC_RESP_HEADER)) && - (srp->sr_soc_hdr.sh_flags & SOC_FC_HEADER)) { - src = (caddr_t)&srp->sr_fc_frame_hdr; - dst = (caddr_t)&fcalpkt->fcal_resp_hdr; - bcopy(src, dst, sizeof (fc_frame_header_t)); - fcalpkt->fcal_pkt_flags |= FCFLAG_RESP_HEADER; - i = srp->sr_soc_hdr.sh_flags & SOC_PORT_B ? - 1 : 0; - if ((status != FCAL_STATUS_OK) && - (status <= FCAL_STATUS_MAX_STATUS)) { - socalp->socal_stats.pstats[i]. - resp_status[status]++; - } else { - socalp->socal_stats.pstats[i]. - resp_status[FCAL_STATUS_ERROR]++; - } - } else if (status == FCAL_STATUS_OK) { - fcalpkt->fcal_socal_request. - sr_soc_hdr.sh_byte_cnt = - shp->sh_byte_cnt; - } - fcalpkt->fcal_diag_status = - (uint32_t)srp->sr_dataseg.fc_base; - fcalpkt->fcal_ncmds = srp->sr_ncmds; - - /* - * Update response queue ptrs and soc registers. - */ - kcqv->skc_out++; - if ((kcqv->skc_out & kcq->skc_last_index) == 0) { - kcqv->skc_out = 0; - kcqv->skc_seqno++; - } - - /* For incmplt DMA offline loop by loopback */ - if (fcalpkt->fcal_pkt_status == - FCAL_STATUS_INCOMPLETE_DMA_ERR) { - socal_port_t *port_statep; - uint_t r; - - /* - * Give up the mutex to avoid a deadlock - * with the loopback routine. - */ - mutex_exit(&kcq->skc_mtx); - - port_statep = &socalp->port_state[port]; - mutex_enter(&port_statep->sp_mtx); - if (port_statep->sp_status & - PORT_DISABLED) { - /* Already disabled */ - mutex_exit(&port_statep->sp_mtx); - } else { - port_statep->sp_status |= - PORT_DISABLED; - mutex_exit(&port_statep->sp_mtx); - (void) socal_diag_request( - (void *)socalp, port, - &r, SOC_DIAG_INT_LOOP); - } - /* reacquire mutex */ - mutex_enter(&kcq->skc_mtx); - } - - /* - * Complete the packet *ONLY* if it not being aborted - * or the abort has already completed. Otherwise it is - * not safe to free the ID. - */ - mutex_enter(&socalp->abort_mtx); - if (!(fcalpkt->fcal_pkt_flags & FCFLAG_ABORTING)) { - /* - * Call the completion routine - */ - SOCAL_ID_FREE(shp->sh_request_token); - if (fcalpkt->fcal_pkt_comp != NULL) { - fcalpkt->fcal_cmd_state |= - FCAL_CMD_COMPLETE; - - /* - * Give up the mutex to avoid a - * deadlock with the callback routine. - */ - mutex_exit(&socalp->abort_mtx); - mutex_exit(&kcq->skc_mtx); - - /* callback */ - (*fcalpkt->fcal_pkt_comp)(fcalpkt); - - /* reacquire mutex */ - mutex_enter(&kcq->skc_mtx); - } else { - fcalpkt->fcal_cmd_state |= - FCAL_CMD_COMPLETE; - mutex_exit(&socalp->abort_mtx); - } - } else { - mutex_exit(&socalp->abort_mtx); - } - } - - - if (kcq->skc_cq == NULL) - /* - * This action averts a potential PANIC scenario - * where the SUSPEND code flow grabbed the kcq->skc_mtx - * when we let it go, to call our completion routine, - * and "initialized" the response queue. We exit our - * processing loop here, thereby averting a PANIC due - * to a NULL de-reference from the response queue. - * - * Note that this is an interim measure that needs - * to be revisited when this driver is next revised - * for enhanced performance. - */ - break; - - /* - * We need to re-read the input and output pointers in - * case a polling routine should process some entries - * from the response queue while we're doing a callback - * routine with the response queue mutex dropped. - */ - cqe = &(kcq->skc_cq[kcqv->skc_out]); - index_in = SOCAL_RESPONSEQ_INDEX(srq, socalreg->socal_rspp.w); - - /* - * Mess around with the hardware if we think we've run out - * of entries in the queue, just to make sure we've read - * all entries that are available. - */ - - socalreg->socal_csr.w = ((kcqv->skc_out << 24) | - (SOCAL_CSR_SOCAL_TO_HOST & ~SOCAL_CSR_RSP_QUE_0)); - - /* Make sure the csr write has completed */ - i = socalreg->socal_csr.w; - DEBUGF(9, (CE_CONT, "csr.w = %x\n", i)); - - /* - * Update our idea of where the host adapter has placed - * the most recent entry in the response queue and resync - * the response queue - */ - index_in = SOCAL_RESPONSEQ_INDEX(srq, socalreg->socal_rspp.w); - - kcqv->skc_in = index_in; - } - - /* Drop lock for request queue. */ - mutex_exit(&kcq->skc_mtx); -} - -/* - * Function name : socal_intr_unsolicited() - * - * Return Values : none - * - * Description : Processes entries in the unsolicited response - * queue - * - * The SOC+ will give us an unsolicited response - * whenever its status changes: OFFLINE, ONLINE, - * or in response to a packet arriving from an originator. - * - * When message requests come in they will be placed in our - * buffer queue or in the next "inline" packet by the SOC hardware. - * - * Context : Unsolicited interrupts must be masked - */ - -static void -socal_intr_unsolicited(socal_state_t *socalp, uint32_t urq) -{ - socal_kcq_t *kcq; - volatile socal_kcq_t *kcqv; - soc_response_t *srp; - volatile cqe_t *cqe; - int port; - register uchar_t t_index, t_seqno; - register volatile socal_reg_t *socalreg = socalp->socal_rp; - volatile cqe_t *cqe_cont = NULL; - uint_t i; - int hdr_count; - int status; - ushort_t flags; - auto char buf[256]; - socal_port_t *port_statep; -#if defined(DEBUG) && !defined(lint) - int instance = ddi_get_instance(socalp->dip); -#endif - uchar_t index_in; - socal_unsol_cb_t *cblist; - - kcq = &socalp->response[urq]; - kcqv = (volatile socal_kcq_t *)kcq; - - /* - * Grab lock for response queue. - */ - mutex_enter(&kcq->skc_mtx); - - cqe = (volatile cqe_t *)&(kcq->skc_cq[kcqv->skc_out]); - - index_in = SOCAL_RESPONSEQ_INDEX(urq, socalreg->socal_rspp.w); - - kcqv->skc_in = index_in; - - while (kcqv->skc_out != index_in) { - (void) ddi_dma_sync(kcq->skc_dhandle, 0, 0, - DDI_DMA_SYNC_FORKERNEL); - - /* Check for continuation entries */ - if ((hdr_count = cqe->cqe_hdr.cq_hdr_count) != 1) { - - t_seqno = kcqv->skc_seqno; - t_index = kcqv->skc_out + hdr_count; - - i = index_in; - if (kcqv->skc_out > index_in) - i += kcq->skc_last_index + 1; - - /* - * If we think the continuation entries haven't yet - * arrived, try once more before giving up - */ - if (i < t_index) { - - socalreg->socal_csr.w = - ((kcqv->skc_out << 24) | - (SOCAL_CSR_SOCAL_TO_HOST & ~SOCAL_CSR_RSP_QUE_1)); - - /* Make sure the csr write has completed */ - i = socalreg->socal_csr.w; - - /* - * Update our idea of where the host adapter has placed - * the most recent entry in the response queue - */ - i = index_in = SOCAL_RESPONSEQ_INDEX(urq, - socalreg->socal_rspp.w); - if (kcqv->skc_out > index_in) - i += kcq->skc_last_index + 1; - - /* - * Exit if the continuation entries haven't yet - * arrived - */ - if (i < t_index) - break; - } - - if (t_index > kcq->skc_last_index) { - t_seqno++; - t_index &= kcq->skc_last_index; - } - - cqe_cont = (volatile cqe_t *) - &(kcq->skc_cq[t_index ? t_index - 1 : - kcq->skc_last_index]); - - - /* A cq_hdr_count > 2 is illegal; throw away the response */ - - /* - * XXX - should probably throw out as many entries as the - * hdr_cout tells us there are - */ - if (hdr_count != 2) { - socal_disp_err(socalp, CE_WARN, "driver.4030", - "!too many continuation entries"); - DEBUGF(4, (CE_CONT, - "socal%d: soc+ unsolicited entry count = %d\n", - instance, cqe->cqe_hdr.cq_hdr_count)); - - if ((++t_index & kcq->skc_last_index) == 0) { - t_index = 0; - t_seqno++; - } - kcqv->skc_out = t_index; - kcqv->skc_seqno = t_seqno; - - cqe = &(kcq->skc_cq[kcqv->skc_out]); - cqe_cont = NULL; - continue; - } - } - - /* - * Update unsolicited response queue ptrs - */ - kcqv->skc_out++; - if ((kcqv->skc_out & kcq->skc_last_index) == 0) { - kcqv->skc_out = 0; - kcqv->skc_seqno++; - } - - if (cqe_cont != NULL) { - kcqv->skc_out++; - if ((kcqv->skc_out & kcq->skc_last_index) == 0) { - kcqv->skc_out = 0; - kcqv->skc_seqno++; - } - } - - if (index_in == kcqv->skc_out) { - socalreg->socal_csr.w = ((kcqv->skc_out << 24) | - (SOCAL_CSR_SOCAL_TO_HOST & ~SOCAL_CSR_RSP_QUE_1)); - - /* Make sure the csr write has completed */ - i = socalreg->socal_csr.w; - } - - srp = (soc_response_t *)cqe; - flags = srp->sr_soc_hdr.sh_flags; - port = flags & SOC_PORT_B; - port_statep = &socalp->port_state[port]; - - /* - * XXX need to deal buffer pool entries here - */ - switch (flags & ~SOC_PORT_B) { - case SOC_UNSOLICITED | SOC_FC_HEADER: - - srp = (soc_response_t *)cqe; - - switch (srp->sr_fc_frame_hdr.r_ctl & R_CTL_ROUTING) { - case R_CTL_EXTENDED_SVC: - /* - * Extended Link Services frame received - */ - socalp->socal_stats.pstats[port].els_rcvd++; - socal_us_els(socalp, (cqe_t *)cqe, (caddr_t)cqe_cont); - - /* do callbacks to any interested ULPs */ - mutex_enter(&port_statep->sp_mtx); - for (cblist = port_statep->sp_unsol_cb; cblist; - cblist = cblist->next) { - if (cblist->els_cb) { - mutex_exit(&port_statep->sp_mtx); - mutex_exit(&kcq->skc_mtx); - cblist->els_cb(cblist->arg, - (cqe_t *)cqe, - (caddr_t)cqe_cont); - mutex_enter(&kcq->skc_mtx); - mutex_enter(&port_statep->sp_mtx); - } - } - mutex_exit(&port_statep->sp_mtx); - break; - case R_CTL_BASIC_SVC: - (void) sprintf(buf, - "!unsupported Link Service command: 0x%x", - srp->sr_fc_frame_hdr.type); - socal_disp_err(socalp, CE_WARN, "link.4020", buf); - break; - case R_CTL_DEVICE_DATA: - switch (srp->sr_fc_frame_hdr.type) { - default: - mutex_enter(&port_statep->sp_mtx); - status = 1; - for (cblist = port_statep->sp_unsol_cb; cblist; - cblist = cblist->next) { - if (cblist->data_cb && - (cblist->type == - srp->sr_fc_frame_hdr.type)) { - mutex_exit(&port_statep->sp_mtx); - mutex_exit(&kcq->skc_mtx); - cblist->data_cb(cblist->arg, - (cqe_t *)cqe, (caddr_t)cqe_cont); - mutex_enter(&kcq->skc_mtx); - mutex_enter(&port_statep->sp_mtx); - status = 0; - } - } - mutex_exit(&port_statep->sp_mtx); - - if (status == 0) - break; - - (void) sprintf(buf, - "!unknown FC-4 command: 0x%x", - srp->sr_fc_frame_hdr.type); - socal_disp_err(socalp, CE_WARN, - "link.4030", buf); - break; - } - break; - default: - (void) sprintf(buf, "!unsupported FC frame R_CTL: 0x%x", - srp->sr_fc_frame_hdr.r_ctl); - socal_disp_err(socalp, CE_WARN, "link.4040", buf); - break; - } - break; - - case SOC_STATUS: { - - /* - * Note that only the lsbyte of the status has - * interesting information... - */ - status = srp->sr_soc_status; - - switch (status) { - - case FCAL_STATUS_ONLINE: - (void) sprintf(buf, - "!port %d: Fibre Channel is ONLINE\n", port); - socal_disp_err(socalp, CE_CONT, "link.6010", - buf); - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status &= ~PORT_STATUS_MASK; - port_statep->sp_status |= PORT_ONLINE; - mutex_exit(&port_statep->sp_mtx); - socalp->socal_stats.pstats[port].onlines++; - DEBUGF(4, (CE_CONT, - "socal%d intr_unsol: ONLINE intr\n", - instance)); - break; - - case FCAL_STATUS_LOOP_ONLINE: - (void) sprintf(buf, - "!port %d: Fibre Channel Loop is ONLINE\n", - port); - socal_disp_err(socalp, CE_CONT, "link.6010", - buf); - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status &= ~PORT_STATUS_MASK; - port_statep->sp_status |= PORT_ONLINE_LOOP; - mutex_exit(&port_statep->sp_mtx); - socalp->socal_stats.pstats[port].online_loops++; - DEBUGF(4, (CE_CONT, - "socal%d intr_unsol: ONLINE-LOOP intr\n", - instance)); - break; - - case FCAL_STATUS_ERR_OFFLINE: - /* - * SOC and Responder will both flush - * all active commands. - * So I don't have to do anything - * until it comes back online. - */ - (void) sprintf(buf, - "!port %d: Fibre Channel is OFFLINE\n", port); - socal_disp_err(socalp, CE_CONT, "link.5010", - buf); - - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_status &= ~PORT_STATUS_MASK; - port_statep->sp_status |= PORT_OFFLINE; - port_statep->sp_lilpmap_valid = 0; - mutex_exit(&port_statep->sp_mtx); - socalp->socal_stats.pstats[port].offlines++; - DEBUGF(4, (CE_CONT, - "socal%d intr_unsol: OFFLINE intr\n", - instance)); - - break; - default: - (void) sprintf(buf, "!unknown status: 0x%x\n", - status); - socal_disp_err(socalp, CE_WARN, "link.3020", - buf); - } - mutex_exit(&kcq->skc_mtx); - mutex_enter(&port_statep->sp_mtx); - for (cblist = port_statep->sp_unsol_cb; cblist; - cblist = cblist->next) { - if (cblist->statec_cb) { - mutex_exit(&port_statep->sp_mtx); - (*cblist->statec_cb)(cblist->arg, - status); - mutex_enter(&port_statep->sp_mtx); - } - } - mutex_exit(&port_statep->sp_mtx); - if (status == FCAL_STATUS_ERR_OFFLINE) { - socal_flush_overflowq(socalp, port, - CQ_REQUEST_0); - socal_flush_overflowq(socalp, port, - CQ_REQUEST_1); - } - mutex_enter(&kcq->skc_mtx); - break; - } - default: - (void) sprintf(buf, "!unexpected state: flags: 0x%x\n", - flags); - socal_disp_err(socalp, CE_WARN, "link.4050", buf); - DEBUGF(4, (CE_CONT, - "\tsoc CR: 0x%x SAE: 0x%x CSR: 0x%x IMR: 0x%x\n", - socalp->socal_rp->socal_cr.w, - socalp->socal_rp->socal_sae.w, - socalp->socal_rp->socal_csr.w, - socalp->socal_rp->socal_imr)); - } - - - if (kcq->skc_cq == NULL) - /* - * This action averts a potential PANIC scenario - * where the SUSPEND code flow grabbed the kcq->skc_mtx - * when we let it go, to call our completion routine, - * and "initialized" the response queue. We exit our - * processing loop here, thereby averting a PANIC due - * to a NULL de-reference from the response queue. - * - * Note that this is an interim measure that needs - * to be revisited when this driver is next revised - * for enhanced performance. - */ - break; - - /* - * We need to re-read the input and output pointers in - * case a polling routine should process some entries - * from the response queue while we're doing a callback - * routine with the response queue mutex dropped. - */ - cqe = &(kcq->skc_cq[kcqv->skc_out]); - index_in = SOCAL_RESPONSEQ_INDEX(urq, socalreg->socal_rspp.w); - cqe_cont = NULL; - - /* - * Mess around with the hardware if we think we've run out - * of entries in the queue, just to make sure we've read - * all entries that are available. - */ - if (index_in == kcqv->skc_out) { - - socalreg->socal_csr.w = - ((kcqv->skc_out << 24) | - (SOCAL_CSR_SOCAL_TO_HOST & ~SOCAL_CSR_RSP_QUE_1)); - - /* Make sure the csr write has completed */ - i = socalreg->socal_csr.w; - - /* - * Update our idea of where the host adapter has placed - * the most recent entry in the response queue - */ - index_in = - SOCAL_RESPONSEQ_INDEX(urq, socalreg->socal_rspp.w); - } - - socalp->socal_stats.pstats[port].unsol_resps++; - - kcqv->skc_in = index_in; - - } - - /* Release lock for response queue. */ - mutex_exit(&kcq->skc_mtx); -} - -/* - * socal_us_els() - This function handles unsolicited extended link - * service responses received from the soc. - */ -static void -socal_us_els(socal_state_t *socalp, cqe_t *cqe, caddr_t payload) -{ - soc_response_t *srp = (soc_response_t *)cqe; - els_payload_t *els = (els_payload_t *)payload; - int i; - char *bp; - auto char buf[256]; - - /* - * There should be a CQE continuation entry for all - * extended link services - */ - if ((els == NULL) || ((i = srp->sr_soc_hdr.sh_byte_cnt) == 0)) { - socal_disp_err(socalp, CE_WARN, "link.4010", - "!incomplete continuation entry"); - return; - } - - /* Quietly impose a maximum byte count */ - if (i > SOC_CQE_PAYLOAD) - i = SOC_CQE_PAYLOAD; - i -= sizeof (union els_cmd_u); - - /* - * Decode the LS_Command code - */ - switch (els->els_cmd.c.ls_command) { - case LA_ELS_DISPLAY: - els->els_data[i] = '\0'; /* terminate the string */ - for (bp = (char *)&(els->els_data[0]); *bp; bp++) { - /* squash newlines */ - if (*bp == '\n') *bp = ' '; - } - (void) sprintf(buf, "!message: %s\n", els->els_data); - socal_disp_err(socalp, CE_CONT, "link.1010", buf); - break; - - default: - DEBUGF(3, (CE_CONT, "!unknown LS_Command, %x\n", - els->els_cmd.i)); - break; - } - -} - -/*ARGSUSED*/ -static fcal_packet_t * -socal_packet_alloc(socal_state_t *socalp, fcal_sleep_t sleep) -{ - int flag; - fcal_packet_t *pkt; - - if (sleep == FCAL_SLEEP) - flag = KM_SLEEP; - else - flag = KM_NOSLEEP; - - pkt = (fcal_packet_t *)kmem_zalloc(sizeof (fcal_packet_t), flag); - - if (pkt != (fcal_packet_t *)NULL) - pkt->fcal_magic = FCALP_MAGIC; - - return (pkt); -} - -static void -socal_packet_free(fcal_packet_t *fcalpkt) -{ - kmem_free((void *)fcalpkt, sizeof (fcal_packet_t)); -} - -static void -socal_lilp_map_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_LILP_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_force_lip_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_LIP_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_adisc_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_ADISC_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_lbf_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_LBF_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_rls_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_RLS_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_force_offline_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_OFFLINE_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_abort_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - soc_header_t *shp = - (soc_header_t *)&fcalpkt->fcal_socal_request.sr_soc_hdr; - fcal_packet_t *target = (fcal_packet_t *) - SOCAL_ID_LOOKUP(shp->sh_request_token); - - mutex_enter(&socalp->abort_mtx); - ASSERT(target->fcal_pkt_flags & FCFLAG_ABORTING); - if (!(target->fcal_pkt_flags & FCFLAG_COMPLETE)) { - SOCAL_ID_FREE(shp->sh_request_token); - } - mutex_exit(&socalp->abort_mtx); - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_ABORT_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -static void -socal_bypass_dev_done(fcal_packet_t *fcalpkt) -{ - uint32_t port; - socal_state_t *socalp = (socal_state_t *)fcalpkt->fcal_pkt_cookie; - if (fcalpkt->fcal_socal_request.sr_soc_hdr.sh_flags & SOC_PORT_B) - port = 1; - else - port = 0; - mutex_enter(&socalp->port_state[port].sp_mtx); - socalp->port_state[port].sp_status &= ~PORT_BYPASS_PENDING; - cv_broadcast(&socalp->port_state[port].sp_cv); - mutex_exit(&socalp->port_state[port].sp_mtx); -} - -/*ARGSUSED*/ -static unsigned int -socal_dummy_intr(caddr_t arg) -{ - return (DDI_INTR_UNCLAIMED); -} - -static int -socal_diag_request(socal_state_t *socalp, uint32_t port, uint_t *diagcode, - uint32_t cmd) -{ - fcal_packet_t *fcalpkt; - soc_diag_request_t *sdr; - socal_port_t *port_statep = &socalp->port_state[port]; - struct fcal_lilp_map map; - - /* Grabbing the state mutex is totally unnecessary.... */ - if (!(port_statep->sp_status & PORT_DISABLED)) { - if (socal_getmap(socalp, port, (caddr_t)&map, 0, FKIOCTL) - != -1) { - if (map.lilp_length != 1 && ((port_statep->sp_status & - PORT_ONLINE_LOOP) && cmd != SOC_DIAG_REM_LOOP)) - return (FCAL_TRANSPORT_UNAVAIL); - } - } - if ((fcalpkt = socal_packet_alloc(socalp, FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - sdr = (soc_diag_request_t *)&fcalpkt->fcal_socal_request; - if (port) - sdr->sdr_soc_hdr.sh_flags = SOC_PORT_B; - sdr->sdr_diag_cmd = cmd; - sdr->sdr_cqhdr.cq_hdr_count = 1; - sdr->sdr_cqhdr.cq_hdr_type = CQ_TYPE_DIAGNOSTIC; - fcalpkt->fcal_pkt_cookie = (void *)socalp; - return (socal_doit(fcalpkt, port_statep, 1, NULL, - SOCAL_DIAG_TIMEOUT, 0, diagcode)); -} - -static uint_t -socal_force_offline(void *ssp, uint_t port, uint_t polled) -{ - fcal_packet_t *fcalpkt; - soc_cmdonly_request_t *scr; - socal_state_t *socalp = (socal_state_t *)ssp; - socal_port_t *port_statep = &socalp->port_state[port]; - - if ((fcalpkt = - socal_packet_alloc(socalp, polled ? FCAL_NOSLEEP : FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - scr = (soc_cmdonly_request_t *)&fcalpkt->fcal_socal_request; - if (port) - scr->scr_soc_hdr.sh_flags = SOC_PORT_B; - scr->scr_cqhdr.cq_hdr_count = 1; - scr->scr_cqhdr.cq_hdr_type = CQ_TYPE_OFFLINE; - fcalpkt->fcal_pkt_cookie = (void *)socalp; - return (socal_doit(fcalpkt, port_statep, 0, socal_force_offline_done, - SOCAL_OFFLINE_TIMEOUT, PORT_OFFLINE_PENDING, NULL)); -} - -static int -socal_issue_adisc(socal_state_t *socalp, uint32_t port, uint32_t dest, - la_els_adisc_t *payload, uint32_t polled) -{ - int retval; - la_els_adisc_t *buf; - fcal_packet_t *fcalpkt; - socal_port_t *port_statep; - socal_priv_cmd_t *privp; - - port_statep = &socalp->port_state[port]; - - if ((fcalpkt = - socal_els_alloc(socalp, port, dest, sizeof (la_els_adisc_t), - sizeof (la_els_adisc_t), (caddr_t *)&privp, polled)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - privp = (socal_priv_cmd_t *)fcalpkt->fcal_pkt_private; - buf = (la_els_adisc_t *)privp->cmd; - buf->ls_code = LA_ELS_ADISC; - buf->mbz[0] = 0; - buf->mbz[1] = 0; - buf->mbz[2] = 0; - buf->hard_address = 0; - bcopy((caddr_t)&port_statep->sp_p_wwn, - (caddr_t)&buf->port_wwn, sizeof (buf->port_wwn)); - bcopy((caddr_t)&socalp->socal_n_wwn, - (caddr_t)&buf->node_wwn, sizeof (buf->node_wwn)); - buf->nport_id = fcalpkt->fcal_socal_request.sr_fc_frame_hdr.s_id; - (void) ddi_dma_sync(privp->cmd_handle, 0, 0, DDI_DMA_SYNC_FORDEV); - - retval = socal_doit(fcalpkt, port_statep, 0, socal_adisc_done, - SOCAL_ADISC_TIMEOUT, PORT_ADISC_PENDING, NULL); - if (retval == FCAL_SUCCESS) { - (void) ddi_dma_sync(privp->rsp_handle, 0, 0, - DDI_DMA_SYNC_FORKERNEL); - bcopy(privp->rsp, (caddr_t)payload, sizeof (la_els_adisc_t)); - } - privp->fapktp = NULL; - socal_els_free(privp); - return (retval); -} - -static int -socal_issue_lbf(socal_state_t *socalp, uint32_t port, - uchar_t *payload, size_t length, uint32_t polled) -{ - int retval; - fcal_packet_t *fcalpkt; - socal_port_t *port_statep; - socal_priv_cmd_t *privp; - - port_statep = &socalp->port_state[port]; - - if ((fcalpkt = socal_lbf_alloc(socalp, port, length, length, - (caddr_t *)&privp, polled)) == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - privp = (socal_priv_cmd_t *)fcalpkt->fcal_pkt_private; - bcopy((caddr_t)payload, privp->cmd, length); - (void) ddi_dma_sync(privp->cmd_handle, 0, 0, DDI_DMA_SYNC_FORDEV); - - retval = socal_doit(fcalpkt, port_statep, polled, socal_lbf_done, - SOCAL_LBF_TIMEOUT, PORT_LBF_PENDING, NULL); - - if (retval == FCAL_SUCCESS) { - (void) ddi_dma_sync(privp->rsp_handle, 0, 0, - DDI_DMA_SYNC_FORKERNEL); - bcopy(privp->rsp, (caddr_t)payload, length); - } - privp->fapktp = NULL; - socal_lbf_free(privp); - return (retval); -} - -static int -socal_issue_rls(socal_state_t *socalp, uint32_t port, uint32_t dest, - la_els_rls_reply_t *payload, uint32_t polled) -{ - int retval; - la_els_rls_t *buf; - fcal_packet_t *fcalpkt; - socal_port_t *port_statep; - socal_priv_cmd_t *privp; - uint32_t arg; - - port_statep = &socalp->port_state[port]; - - if (dest == socal_getmap(socalp, port, NULL, 0, 0)) { - /* load up the the struct with the local lesb */ - struct la_els_rjt *rsp = (struct la_els_rjt *)payload; - - rsp->ls_code = LA_ELS_RJT; - rsp->mbz[0] = 0; - rsp->mbz[1] = 0; - rsp->mbz[2] = 0; - rsp->reason_code = RJT_UNSUPPORTED; - rsp->reserved = 0; - rsp->explanation = 0; - rsp->vendor = 0; - return (FCAL_SUCCESS); - } - - if ((fcalpkt = - socal_els_alloc(socalp, port, dest, sizeof (la_els_rls_t), - sizeof (la_els_rls_reply_t), (caddr_t *)&privp, polled)) - == (fcal_packet_t *)NULL) - return (FCAL_ALLOC_FAILED); - - privp = (socal_priv_cmd_t *)fcalpkt->fcal_pkt_private; - - if (payload->link_failure & 0xff000000) - arg = payload->link_failure; - else - arg = dest; - - buf = (la_els_rls_t *)privp->cmd; - buf->ls_code = LA_ELS_RLS; - buf->mbz[0] = 0; - buf->mbz[1] = 0; - buf->mbz[2] = 0; - buf->reserved = 0; - buf->nport_id[0] = (arg >> 16) & 0xff; - buf->nport_id[1] = (arg >> 8) & 0xff; - buf->nport_id[2] = arg & 0xff; - (void) ddi_dma_sync(privp->cmd_handle, 0, 0, DDI_DMA_SYNC_FORDEV); - - retval = socal_doit(fcalpkt, port_statep, 0, socal_rls_done, - SOCAL_RLS_TIMEOUT, PORT_RLS_PENDING, NULL); - if (retval == FCAL_SUCCESS) { - (void) ddi_dma_sync(privp->rsp_handle, 0, 0, - DDI_DMA_SYNC_FORKERNEL); - bcopy(privp->rsp, (caddr_t)payload, - sizeof (la_els_rls_reply_t)); - } - privp->fapktp = NULL; - socal_els_free(privp); - return (retval); -} - -fcal_packet_t * -socal_els_alloc(socal_state_t *socalp, uint32_t port, uint32_t dest, - uint32_t cmd_size, uint32_t rsp_size, caddr_t *rprivp, uint32_t polled) -{ - struct fcal_packet *fcalpkt; - ddi_dma_cookie_t ccookie; - ddi_dma_cookie_t rcookie; - socal_priv_cmd_t *privp; - ddi_dma_handle_t chandle = NULL; - ddi_dma_handle_t rhandle = NULL; - ddi_acc_handle_t cacchandle; - ddi_acc_handle_t racchandle; - soc_request_t *srp; - fc_frame_header_t *fhp; - uint_t ccount, cmd_bound = 0, rsp_bound = 0; - size_t real_len; - caddr_t cmd; - caddr_t rsp; - uint32_t ouralpa; - - if ((fcalpkt = - socal_packet_alloc(socalp, polled ? FCAL_NOSLEEP : FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (NULL); - - if ((privp = - (socal_priv_cmd_t *)kmem_zalloc(sizeof (socal_priv_cmd_t), - polled ? KM_NOSLEEP : KM_SLEEP)) == (socal_priv_cmd_t *)NULL) { - goto fail; - } - - rprivp = (caddr_t *)&privp; - - fcalpkt->fcal_pkt_private = (caddr_t)privp; - privp->fapktp = (void *)fcalpkt; - - if ((ouralpa = socal_getmap(socalp, port, NULL, 0, 0)) == -1) - goto fail; - - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, &chandle) != DDI_SUCCESS) - goto fail; - privp->cmd_handle = chandle; - - if (ddi_dma_mem_alloc(chandle, cmd_size, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&cmd, &real_len, &cacchandle) != DDI_SUCCESS) - goto fail; - privp->cmd = cmd; - privp->cmd_acchandle = cacchandle; - - if (real_len < cmd_size) - goto fail; - - if (ddi_dma_addr_bind_handle(chandle, (struct as *)NULL, - (caddr_t)cmd, cmd_size, - DDI_DMA_WRITE | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &ccookie, &ccount) - != DDI_DMA_MAPPED) - goto fail; - cmd_bound = 1; - if (ccount != 1) - goto fail; - - if (rsp_size) { - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, &rhandle) != DDI_SUCCESS) - goto fail; - - privp->rsp_handle = rhandle; - if (ddi_dma_mem_alloc(rhandle, rsp_size, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - &rsp, &real_len, &racchandle) != DDI_SUCCESS) - goto fail; - privp->rsp = rsp; - privp->rsp_acchandle = racchandle; - if (real_len < rsp_size) - goto fail; - - if (ddi_dma_addr_bind_handle(rhandle, (struct as *)NULL, - rsp, rsp_size, - DDI_DMA_READ | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &rcookie, &ccount) - != DDI_DMA_MAPPED) - goto fail; - - rsp_bound = 1; - if (ccount != 1) - goto fail; - } - - srp = (soc_request_t *)&fcalpkt->fcal_socal_request; - srp->sr_soc_hdr.sh_flags = SOC_FC_HEADER; - if (port) - srp->sr_soc_hdr.sh_flags |= SOC_PORT_B; - srp->sr_soc_hdr.sh_class = 3; - srp->sr_soc_hdr.sh_byte_cnt = cmd_size; - srp->sr_dataseg[0].fc_base = (uint32_t)ccookie.dmac_address; - srp->sr_dataseg[0].fc_count = cmd_size; - if (rsp_size == 0) { - srp->sr_soc_hdr.sh_seg_cnt = 1; - } else { - srp->sr_soc_hdr.sh_seg_cnt = 2; - srp->sr_dataseg[1].fc_base = (uint32_t)rcookie.dmac_address; - srp->sr_dataseg[1].fc_count = rsp_size; - } - srp->sr_cqhdr.cq_hdr_count = 1; - /* this will potentially be overwritten by the calling function */ - srp->sr_cqhdr.cq_hdr_type = CQ_TYPE_SIMPLE; - - fcalpkt->fcal_pkt_cookie = (void *)socalp; - - /* Fill in the Fabric Channel Header */ - fhp = &srp->sr_fc_frame_hdr; - fhp->r_ctl = R_CTL_ELS_REQ; - fhp->d_id = dest; - fhp->s_id = ouralpa; - fhp->type = TYPE_EXTENDED_LS; - fhp->f_ctl = F_CTL_SEQ_INITIATIVE | F_CTL_FIRST_SEQ; - fhp->seq_id = 0; - fhp->df_ctl = 0; - fhp->seq_cnt = 0; - fhp->ox_id = 0xffff; - fhp->rx_id = 0xffff; - fhp->ro = 0; - return (fcalpkt); -fail: - socal_packet_free(fcalpkt); - if (privp) { - if (privp->cmd_handle) { - if (cmd_bound) - (void) ddi_dma_unbind_handle(privp->cmd_handle); - ddi_dma_free_handle(&privp->cmd_handle); - } - if (privp->cmd) - ddi_dma_mem_free(&privp->cmd_acchandle); - if (privp->rsp_handle) { - if (rsp_bound) - (void) ddi_dma_unbind_handle(privp->rsp_handle); - ddi_dma_free_handle(&privp->rsp_handle); - } - if (privp->rsp) - ddi_dma_mem_free(&privp->rsp_acchandle); - - kmem_free(privp, sizeof (*privp)); - } - return (NULL); -} - -fcal_packet_t * -socal_lbf_alloc(socal_state_t *socalp, uint32_t port, - uint32_t cmd_size, uint32_t rsp_size, caddr_t *rprivp, - uint32_t polled) -{ - struct fcal_packet *fcalpkt; - ddi_dma_cookie_t ccookie; - ddi_dma_cookie_t rcookie; - socal_priv_cmd_t *privp; - ddi_dma_handle_t chandle = NULL; - ddi_dma_handle_t rhandle = NULL; - ddi_acc_handle_t cacchandle; - ddi_acc_handle_t racchandle; - soc_request_t *srp; - fc_frame_header_t *fhp; - uint_t ccount, cmd_bound = 0, rsp_bound = 0; - size_t real_len; - caddr_t cmd; - caddr_t rsp; - - if ((fcalpkt = - socal_packet_alloc(socalp, polled ? FCAL_NOSLEEP : FCAL_SLEEP)) - == (fcal_packet_t *)NULL) - return (NULL); - - if ((privp = - (socal_priv_cmd_t *)kmem_zalloc(sizeof (socal_priv_cmd_t), - polled ? KM_NOSLEEP : KM_SLEEP)) == (socal_priv_cmd_t *)NULL) { - goto fail; - } - - rprivp = (caddr_t *)&privp; - - fcalpkt->fcal_pkt_private = (caddr_t)privp; - privp->fapktp = (void *)fcalpkt; - - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, &chandle) != DDI_SUCCESS) - goto fail; - privp->cmd_handle = chandle; - - if (ddi_dma_mem_alloc(chandle, cmd_size, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&cmd, &real_len, &cacchandle) != DDI_SUCCESS) - goto fail; - privp->cmd = cmd; - privp->cmd_acchandle = cacchandle; - - if (real_len < cmd_size) - goto fail; - - if (ddi_dma_addr_bind_handle(chandle, (struct as *)NULL, - (caddr_t)cmd, cmd_size, - DDI_DMA_WRITE | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &ccookie, &ccount) - != DDI_DMA_MAPPED) - goto fail; - cmd_bound = 1; - if (ccount != 1) - goto fail; - - if (rsp_size) { - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, &rhandle) != DDI_SUCCESS) - goto fail; - - privp->rsp_handle = rhandle; - if (ddi_dma_mem_alloc(rhandle, rsp_size, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - &rsp, &real_len, &racchandle) != DDI_SUCCESS) - goto fail; - - privp->rsp = rsp; - privp->rsp_acchandle = racchandle; - if (real_len < rsp_size) - goto fail; - - if (ddi_dma_addr_bind_handle(rhandle, (struct as *)NULL, - rsp, rsp_size, - DDI_DMA_READ | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &rcookie, &ccount) - != DDI_DMA_MAPPED) - goto fail; - - rsp_bound = 1; - if (ccount != 1) - goto fail; - } - - srp = (soc_request_t *)&fcalpkt->fcal_socal_request; - srp->sr_soc_hdr.sh_flags = SOC_FC_HEADER; - if (port) - srp->sr_soc_hdr.sh_flags |= SOC_PORT_B; - srp->sr_soc_hdr.sh_class = 3; - srp->sr_soc_hdr.sh_byte_cnt = cmd_size; - srp->sr_dataseg[0].fc_base = (uint32_t)ccookie.dmac_address; - srp->sr_dataseg[0].fc_count = cmd_size; - if (rsp_size == 0) { - srp->sr_soc_hdr.sh_seg_cnt = 1; - } else { - srp->sr_soc_hdr.sh_seg_cnt = 2; - srp->sr_dataseg[1].fc_base = (uint32_t)rcookie.dmac_address; - srp->sr_dataseg[1].fc_count = rsp_size; - } - srp->sr_cqhdr.cq_hdr_count = 1; - /* this will potentially be overwritten by the calling function */ - srp->sr_cqhdr.cq_hdr_type = CQ_TYPE_SIMPLE; - - fcalpkt->fcal_pkt_cookie = (void *)socalp; - - /* Fill in the Fabric Channel Header */ - fhp = &srp->sr_fc_frame_hdr; - fhp->r_ctl = R_CTL_SOLICITED_DATA; - fhp->d_id = socalp->port_state[port].sp_src_id; - fhp->s_id = socalp->port_state[port].sp_src_id; - fhp->type = TYPE_SCSI_FCP; - fhp->f_ctl = F_CTL_SEQ_INITIATIVE | F_CTL_FIRST_SEQ | F_CTL_LAST_SEQ; - fhp->seq_id = 0; - fhp->df_ctl = 0; - fhp->seq_cnt = 0; - fhp->ox_id = 0xffff; - fhp->rx_id = 0xffff; - fhp->ro = 0; - return (fcalpkt); -fail: - socal_packet_free(fcalpkt); - if (privp) { - if (privp->cmd_handle) { - if (cmd_bound) - (void) ddi_dma_unbind_handle(privp->cmd_handle); - ddi_dma_free_handle(&privp->cmd_handle); - } - if (privp->cmd) - ddi_dma_mem_free(&privp->cmd_acchandle); - if (privp->rsp_handle) { - if (rsp_bound) - (void) ddi_dma_unbind_handle(privp->rsp_handle); - ddi_dma_free_handle(&privp->rsp_handle); - } - if (privp->rsp) - ddi_dma_mem_free(&privp->rsp_acchandle); - - kmem_free(privp, sizeof (*privp)); - } - return (NULL); -} - -void -socal_els_free(socal_priv_cmd_t *privp) -{ - fcal_packet_t *fcalpkt; - - if (privp) - fcalpkt = (fcal_packet_t *)privp->fapktp; - else - return; - - (void) ddi_dma_unbind_handle(privp->cmd_handle); - ddi_dma_free_handle(&privp->cmd_handle); - ddi_dma_mem_free(&privp->cmd_acchandle); - - if (privp->rsp_handle) { - (void) ddi_dma_unbind_handle(privp->rsp_handle); - ddi_dma_free_handle(&privp->rsp_handle); - } - if (privp->rsp) - ddi_dma_mem_free(&privp->rsp_acchandle); - - kmem_free(privp, sizeof (*privp)); - if (fcalpkt != NULL) - socal_packet_free(fcalpkt); -} - -void -socal_lbf_free(socal_priv_cmd_t *privp) -{ - fcal_packet_t *fcalpkt; - - if (privp) - fcalpkt = (fcal_packet_t *)privp->fapktp; - else - return; - - (void) ddi_dma_unbind_handle(privp->cmd_handle); - ddi_dma_free_handle(&privp->cmd_handle); - ddi_dma_mem_free(&privp->cmd_acchandle); - - if (privp->rsp_handle) { - (void) ddi_dma_unbind_handle(privp->rsp_handle); - ddi_dma_free_handle(&privp->rsp_handle); - } - - if (privp->rsp) - ddi_dma_mem_free(&privp->rsp_acchandle); - - kmem_free(privp, sizeof (*privp)); - if (fcalpkt != NULL) - socal_packet_free(fcalpkt); -} - -static int -socal_getmap(socal_state_t *socalp, uint32_t port, caddr_t arg, - uint32_t polled, int flags) -{ - ddi_dma_cookie_t dcookie; - ddi_dma_handle_t dhandle = NULL; - ddi_acc_handle_t acchandle; - size_t real_len, i; - uint_t ccount; - fcal_lilp_map_t *buf = NULL; - int retval, bound = 0; - socal_port_t *port_statep; - - port_statep = &socalp->port_state[port]; - - if (port_statep->sp_lilpmap_valid) { - - buf = &port_statep->sp_lilpmap; /* give from cache */ - - if (arg) { - if (ddi_copyout(buf, (caddr_t)arg, - sizeof (struct lilpmap), flags) == -1) - return (-1); - } - - return (buf->lilp_myalpa); - } - - if (ddi_dma_alloc_handle(socalp->dip, &socal_dma_attr, - DDI_DMA_DONTWAIT, NULL, &dhandle) != DDI_SUCCESS) - goto getmap_fail; - - i = sizeof (struct fcal_lilp_map); - - if (ddi_dma_mem_alloc(dhandle, i, &socal_acc_attr, - DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, - (caddr_t *)&buf, &real_len, &acchandle) != DDI_SUCCESS) - goto getmap_fail; - - if (real_len < i) - goto getmap_fail; - - if (ddi_dma_addr_bind_handle(dhandle, (struct as *)NULL, - (caddr_t)buf, i, DDI_DMA_READ | DDI_DMA_CONSISTENT, - DDI_DMA_DONTWAIT, NULL, &dcookie, &ccount) != DDI_DMA_MAPPED) - goto getmap_fail; - - bound = 1; - if (ccount != 1) - goto getmap_fail; - - retval = socal_lilp_map((void *)socalp, port, - (uint32_t)dcookie.dmac_address, polled); - - (void) ddi_dma_sync(dhandle, 0, 0, DDI_DMA_SYNC_FORKERNEL); - - if (retval == FCAL_SUCCESS) { - bcopy(buf, &port_statep->sp_lilpmap, sizeof (fcal_lilp_map_t)); - - mutex_enter(&port_statep->sp_mtx); - port_statep->sp_src_id = buf->lilp_myalpa; - port_statep->sp_lilpmap_valid = 1; /* cached */ - mutex_exit(&port_statep->sp_mtx); - - if (arg) { - if (ddi_copyout(buf, (caddr_t)arg, - sizeof (struct lilpmap), flags) == -1) - goto getmap_fail; - } - - retval = buf->lilp_myalpa; - } - else - retval = -1; - - (void) ddi_dma_unbind_handle(dhandle); - ddi_dma_mem_free(&acchandle); - ddi_dma_free_handle(&dhandle); - return (retval); - -getmap_fail: - if (dhandle) { - if (bound) - (void) ddi_dma_unbind_handle(dhandle); - ddi_dma_free_handle(&dhandle); - } - if (buf) - ddi_dma_mem_free(&acchandle); - return (-1); -} - -static void -socal_wcopy(uint_t *h_src, uint_t *h_dest, int len) -{ - int i; - - len /= 4; - for (i = 0; i < len; i++) { - *h_dest++ = *h_src++; - } -} - -static void -socal_flush_overflowq(socal_state_t *socalp, int port, int q_no) -{ - socal_kcq_t *kcq; - fcal_packet_t *fpkt1, *fpkt2, *head = NULL, *tmp; - - kcq = &socalp->request[q_no]; - mutex_enter(&kcq->skc_mtx); - fpkt2 = kcq->skc_overflowh; - fpkt1 = NULL; - while (fpkt2 != NULL) { - if ((((soc_request_t *)&fpkt2->fcal_socal_request) - ->sr_soc_hdr.sh_flags & SOC_PORT_B) == port) { - if (fpkt1 == NULL) - kcq->skc_overflowh = fpkt2->fcal_pkt_next; - else { - fpkt1->fcal_pkt_next = fpkt2->fcal_pkt_next; - if (kcq->skc_overflowt == fpkt2) - kcq->skc_overflowt = fpkt1; - } - tmp = fpkt2->fcal_pkt_next; - fpkt2->fcal_pkt_next = head; - head = fpkt2; - fpkt2 = tmp; - SOCAL_ID_FREE(head->fcal_socal_request. - sr_soc_hdr.sh_request_token); - } else { - fpkt1 = fpkt2; - fpkt2 = fpkt2->fcal_pkt_next; - } - } - mutex_exit(&kcq->skc_mtx); - fpkt2 = head; - while (fpkt2 != NULL) { - fpkt2->fcal_pkt_status = FCAL_STATUS_ERR_OFFLINE; - fpkt2->fcal_cmd_state |= FCAL_CMD_COMPLETE; - fpkt2->fcal_pkt_flags |= FCFLAG_COMPLETE; - tmp = fpkt2->fcal_pkt_next; - if (fpkt2->fcal_pkt_comp != NULL) - (*fpkt2->fcal_pkt_comp)(fpkt2); - fpkt2 = tmp; - } -} - -static void -socal_deferred_intr(void *arg) -{ - socal_kcq_t *kcq = (socal_kcq_t *)arg; - socal_state_t *socalp = kcq->skc_socalp; - - ASSERT((socalp != NULL)); - - mutex_enter(&kcq->skc_mtx); - - if ((kcq->skc_out != kcq->skc_saved_out) || - (kcq->skc_seqno != kcq->skc_saved_seqno)) { - kcq->deferred_intr_timeoutid = 0; - mutex_exit(&kcq->skc_mtx); - return; - } - - if (socalp->socal_on_intr) { - mutex_exit(&kcq->skc_mtx); - kcq->deferred_intr_timeoutid = timeout(socal_deferred_intr, - (caddr_t)kcq, drv_usectohz(10000)); - return; - } - - kcq->deferred_intr_timeoutid = 0; - mutex_exit(&kcq->skc_mtx); - socal_intr_solicited(socalp, 0); -} - -static void -socal_take_core(void *arg) -{ - socal_state_t *socalp = (socal_state_t *)arg; - int i, instance; - - socal_disable(socalp); - for (i = 0; i < SOCAL_N_CQS; i++) { - mutex_enter(&socalp->request[i].skc_mtx); - mutex_enter(&socalp->response[i].skc_mtx); - } - for (i = 0; i < 4; i++) { - socalp->socal_rp->socal_cr.w &= - ~SOCAL_CR_EXTERNAL_RAM_BANK_MASK; - socalp->socal_rp->socal_cr.w |= i<<24; - (void) bcopy((caddr_t)socalp->socal_xrp, - (caddr_t)&socal_xrambuf[i*0x10000], 0x10000); - } - for (i = 3; i >= 0; i--) { - mutex_exit(&socalp->request[i].skc_mtx); - mutex_exit(&socalp->response[i].skc_mtx); - } - instance = ddi_get_instance(socalp->dip); - cmn_err(CE_PANIC, - "socal take core (socal instance %d)", instance); -} - -/* - * Preset AL_PA in hardware, if is told. - */ -static void -socal_fix_harda(socal_state_t *socalp, int port) -{ - socal_port_t *portp = &socalp->port_state[port]; - uint_t *xrp = (uint_t *)socalp->socal_xrp; - uint_t accum, harda; - - harda = portp->sp_hard_alpa; - accum = xrp[SOCAL_XRAM_PORTA_HRDA/4]; - if (port == 0) { - accum &= 0x00FFFFFF; - accum |= ((harda & 0xFF) << 24); - } else { - accum &= 0xFF00FFFF; - accum |= ((harda & 0xFF) << 16); - } - xrp[SOCAL_XRAM_PORTA_HRDA/4] = accum; -} - -/* - * Target-Mode attach function - */ -fcal_transport_t * -socal_sftm_attach(dev_t dev, int loop_id) -{ - int instance = getminor(dev) / 2; - int port = getminor(dev) % 2; - int hard_alpa; - char *name; - socal_state_t *socalp; - - /* - * If the device is not a "socal" device, return - */ - if ((name = ddi_major_to_name(getmajor(dev))) == NULL || - strcmp(name, "socal") != 0) - return (NULL); - - /* - * If no soft state structure, return - */ - socalp = ddi_get_soft_state(socal_soft_state_p, instance); - if (socalp == NULL) - return (NULL); - - /* - * If the port is already attached, return - */ - if (socalp->port_state[port].sp_status & PORT_CHILD_INIT) - return (NULL); - - if (loop_id < 0 || loop_id > 126) - return (NULL); - - /* if this instance is detaching, don't attach */ - mutex_enter(&socalp->board_mtx); - mutex_enter(&socalp->port_state[port].sp_mtx); - if (socalp->socal_busy < 0) { - mutex_exit(&socalp->port_state[port].sp_mtx); - mutex_exit(&socalp->board_mtx); - return (NULL); - } - socalp->socal_busy++; - socalp->port_state[port].sp_status |= PORT_CHILD_INIT; - mutex_exit(&socalp->port_state[port].sp_mtx); - mutex_exit(&socalp->board_mtx); - - /* - * Since we keep the Hard Loop-id in two config files, warn the - * user if they don't match. - */ - hard_alpa = socal_switch_to_alpa[loop_id]; - if (hard_alpa != socalp->port_state[port].sp_hard_alpa) { - socalp->port_state[port].sp_hard_alpa = hard_alpa; - cmn_err(CE_WARN, "socal%d: Hard Loop-id mismatch - " - "using Loop-id %d", - instance, loop_id); - } - - return (socalp->port_state[port].sp_transport); -} - - -/* - * Target-Mode detach function - */ -int -socal_sftm_detach(socal_state_t *socalp, int port) -{ - mutex_enter(&socalp->board_mtx); - socalp->socal_busy--; - socalp->port_state[port].sp_status &= ~PORT_CHILD_INIT; - mutex_exit(&socalp->board_mtx); - - return (0); -} diff --git a/usr/src/uts/sun/io/socal_ucode.c b/usr/src/uts/sun/io/socal_ucode.c deleted file mode 100644 index b4bd1cf390..0000000000 --- a/usr/src/uts/sun/io/socal_ucode.c +++ /dev/null @@ -1,16420 +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 2005 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> - -/* This file was once generated automatically... */ - -uint32_t socal_ucode[] = { - 0xa106a000u, - 0xf011f091u, - 0x0u, - 0x9e0eu, - 0xad7cacc0u, - 0xf05d00ffu, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x20060000u, - 0xc8000800u, - 0x1000002u, - 0x2710u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x80000800u, - 0xc0000800u, - 0x1007fffu, - 0x10000u, - 0x80000000u, - 0x800u, - 0x1000000u, - 0x10000u, - 0x12468u, - 0x0u, - 0x3af1fcd9u, - 0x40282329u, - 0x54687520u, - 0x4d617920u, - 0x20332031u, - 0x383a3530u, - 0x3a333320u, - 0x32303031u, - 0xa000000u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x1u, - 0x0u, - 0x0u, - 0xfefe0800u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0xc405000u, - 0x46000a00u, - 0x4001a100u, - 0xa00000abu, - 0x1cdc030u, - 0xf0914701u, - 0xaf01aefeu, - 0xc0f5100u, - 0xc031c533u, - 0xca35cf37u, - 0x403334cu, - 0xad08ac0au, - 0xf05dc031u, - 0x9f74e1f3u, - 0xf0910c00u, - 0x57004000u, - 0xa100a056u, - 0xc020f091u, - 0x1268c171u, - 0xc030f091u, - 0x100a4000u, - 0xa102a0fcu, - 0xc0d0f091u, - 0xad79ac18u, - 0xf05df091u, - 0xad7eac1eu, - 0xf05df091u, - 0xad79acdcu, - 0xf05df091u, - 0xad2aac54u, - 0xf05df091u, - 0xad5aac50u, - 0xf05df091u, - 0xad5dacd2u, - 0xf05df091u, - 0xad5fac00u, - 0xf05df091u, - 0x67804000u, - 0xc075700u, - 0x4000a100u, - 0xa0500000u, - 0x101c030u, - 0xf0911006u, - 0xad07ac84u, - 0xc05cf091u, - 0x8038e10fu, - 0xf091ad07u, - 0xac9cf05du, - 0xf0910c04u, - 0x57004000u, - 0xa19fa028u, - 0xc020f091u, - 0xdf71c030u, - 0xf091e193u, - 0xf0910000u, - 0x132c030u, - 0xf091ad7fu, - 0xac24f05du, - 0xf0914000u, - 0xa107b00eu, - 0xc020f239u, - 0xf053f091u, - 0xad06ac98u, - 0xf01d4000u, - 0x7f00000u, - 0x7e00000u, - 0x76800000u, - 0x76700000u, - 0x9300000u, - 0x9200000u, - 0x12900000u, - 0x12800000u, - 0x29a00000u, - 0x29900000u, - 0x5a700000u, - 0x2a300000u, - 0x0u, - 0x0u, - 0x7c00000u, - 0x7d00000u, - 0x47700000u, - 0x47600000u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7cc00020u, - 0x7800000u, - 0xf0d16780u, - 0x0u, - 0xad07ac86u, - 0xc02cf091u, - 0xc171c03cu, - 0xf091f0d1u, - 0xf0910000u, - 0xad07ac9au, - 0xc02cf091u, - 0xc171c03cu, - 0xf091ad7cu, - 0xacc0f05du, - 0xfef0d1u, - 0xf091f0d1u, - 0x67800000u, - 0x0u, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0x21106u, - 0xad7cacc0u, - 0x80a8f19du, - 0x26f0d1u, - 0xf091f091u, - 0xf091f0d1u, - 0xf091c031u, - 0xc5332e00u, - 0x2e042e08u, - 0x2e0c2e10u, - 0x2e142e18u, - 0x2e1c2e20u, - 0x2e242e28u, - 0x2e2c2e30u, - 0x2e342e38u, - 0xf0d12e3cu, - 0x2a0ce028u, - 0xf091f0a8u, - 0xf091ad08u, - 0xac8a96b1u, - 0xf19dcf33u, - 0xf19d2918u, - 0xf631c1a6u, - 0xf091c021u, - 0xf11df031u, - 0x2a08e920u, - 0xf091f9e0u, - 0xf09196b1u, - 0xf19dcf33u, - 0xf19dad12u, - 0xac10f05du, - 0xf0910017u, - 0x1a6c438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf0912a0cu, - 0x8171e191u, - 0x10f8da1u, - 0xc173e189u, - 0xad09acb0u, - 0xf01df091u, - 0x4000a1a2u, - 0xa0aec020u, - 0xf091c021u, - 0xe109ad7cu, - 0xacc0f05du, - 0x10014u, - 0x14a0200u, - 0x301c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091d188u, - 0xf09184a1u, - 0xe113f091u, - 0x1301c2u, - 0xc438f091u, - 0xd4b8f091u, - 0xf0d1f091u, - 0xad09acb0u, - 0x280801f0u, - 0x80a80120u, - 0x84b0f11du, - 0x18084b0u, - 0xf11d01c0u, - 0x84b0f11du, - 0xf0910014u, - 0x14a0200u, - 0x316c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0910000u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa8702301u, - 0xe0110b01u, - 0x0u, - 0x4400a9a1u, - 0xa8302300u, - 0xb000001u, - 0xc1d8f091u, - 0x2606c328u, - 0xf0910600u, - 0x708df77u, - 0xe1fdf091u, - 0x2204211cu, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf0912804u, - 0x15884b0u, - 0xe1910013u, - 0x146c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0912a0cu, - 0xf8da0u, - 0x8da98daau, - 0x8173e129u, - 0x2a08e028u, - 0xf091f0a8u, - 0xf0919224u, - 0xe11396b1u, - 0xe187cf33u, - 0xe1138030u, - 0xad08ac30u, - 0xf01df091u, - 0xad08accau, - 0xf01df091u, - 0x2891873au, - 0xe1852918u, - 0x291af631u, - 0xca38f091u, - 0xcd38f091u, - 0xc171ad0du, - 0xac78f19du, - 0xf0912808u, - 0x1f084a8u, - 0x2c08931u, - 0xad0aac16u, - 0xf19df091u, - 0x1c088b0u, - 0xe11d01c1u, - 0x88b0e117u, - 0xf0910014u, - 0x14a0200u, - 0x315c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0910014u, - 0x14a0200u, - 0x314c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0912a08u, - 0x2a8c96b1u, - 0xe18dcf33u, - 0xe189f091u, - 0xad0cac5eu, - 0xf01d2808u, - 0x10584b0u, - 0xad0fac06u, - 0xf11d0701u, - 0x18184b0u, - 0xad0cac7au, - 0xf11df091u, - 0x281101e0u, - 0x88a80120u, - 0x8931e117u, - 0xf0910014u, - 0x14a0200u, - 0x30ac438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091ad3bu, - 0xac3af05du, - 0xf091a1a1u, - 0xa0e0ea87u, - 0x4000a1a1u, - 0xa0d0d081u, - 0xc020f091u, - 0xad0aace4u, - 0xc021f11du, - 0xf631b076u, - 0x112u, - 0xd081ad0au, - 0xacd8290du, - 0xd160f091u, - 0xc131f19du, - 0xf091280eu, - 0xe180f091u, - 0x8130f19du, - 0xf0912918u, - 0xd420f091u, - 0xc131f19du, - 0xf0912814u, - 0xe300f091u, - 0x8130f19du, - 0xf091f137u, - 0xca38f091u, - 0xcd38f091u, - 0xad0bacf0u, - 0xf01df091u, - 0xad0aac7cu, - 0xb076f131u, - 0xf01df091u, - 0xad7aac30u, - 0xf05df091u, - 0xca38f091u, - 0xcd38f091u, - 0xc021e197u, - 0xf6310014u, - 0x14a0200u, - 0x318c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091b276u, - 0x21402043u, - 0xf091c031u, - 0x2000340u, - 0xb076d181u, - 0xc730f091u, - 0xea850121u, - 0x101d096u, - 0xf0912804u, - 0xcd16f091u, - 0x2a8c010fu, - 0x80a80106u, - 0x84b0e131u, - 0x4030105u, - 0x84b0e129u, - 0x4020107u, - 0x84b0e121u, - 0x401f137u, - 0xad7aac96u, - 0xf05df091u, - 0x14014au, - 0x2000306u, - 0xc438f091u, - 0xd4b8f091u, - 0xf0d1f091u, - 0xb276f4a3u, - 0xca28f091u, - 0x2d1a2208u, - 0x21182003u, - 0xf091ad4eu, - 0xacf6f05du, - 0xf091c136u, - 0xf931e121u, - 0xf0911468u, - 0xf137ad7au, - 0xac96f05du, - 0xf0910014u, - 0x14a126cu, - 0xc438f091u, - 0xd4b8f091u, - 0xf0d1f091u, - 0xcea8f091u, - 0xc171ceb8u, - 0xf091ad39u, - 0xac8af05du, - 0xf091ad0cu, - 0xac12c021u, - 0xf11df091u, - 0xad3bac3au, - 0xf05df091u, - 0x4000a1a1u, - 0xa0e0ea87u, - 0x4000a1a1u, - 0xa0d0d081u, - 0xc020f091u, - 0xc036f091u, - 0xc030f937u, - 0xad12ac10u, - 0xf05df091u, - 0xad3aac74u, - 0xf05df091u, - 0x1270001eu, - 0x17ec438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091c031u, - 0xc533ca35u, - 0x600073cu, - 0xb278f623u, - 0x8d4f091u, - 0x28080122u, - 0x84b0ad0cu, - 0xac4ef19du, - 0xf091001au, - 0x1aac438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf091001bu, - 0x1c2c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0910017u, - 0x154c438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf0912918u, - 0x4302a700u, - 0xa6000604u, - 0x7000400u, - 0x580c086u, - 0xf0911148u, - 0x8038e12bu, - 0x12080a8u, - 0xea850120u, - 0x10080b0u, - 0xe19df091u, - 0xc1a6f091u, - 0xc021e193u, - 0xf091c8a6u, - 0xf0912958u, - 0xc131ad0du, - 0xac28f11du, - 0xf091df77u, - 0xe111de87u, - 0xad0cac8au, - 0xf19d1043u, - 0x8170f01du, - 0x5348ad7au, - 0xac30f05du, - 0xf091c021u, - 0xad0dac5cu, - 0xf11df631u, - 0xb2762140u, - 0x2043f091u, - 0x2804cd16u, - 0xf0918170u, - 0x10380a8u, - 0x2a8c1448u, - 0xad4eacf6u, - 0xf05df091u, - 0xc136f931u, - 0xad0dac52u, - 0xf19df091u, - 0xea850121u, - 0x101d096u, - 0xf091cea8u, - 0xf091c171u, - 0xceb8f091u, - 0xe005f091u, - 0xf137b276u, - 0xf4a32208u, - 0x21182003u, - 0xf0910018u, - 0x14ac438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf091f137u, - 0xad7aac96u, - 0xf05df091u, - 0x1301c2u, - 0xc438f091u, - 0xd4b8f091u, - 0xe707f091u, - 0xe07bf091u, - 0xad12ac9au, - 0xf01df091u, - 0xf137ad0fu, - 0xac06037cu, - 0x8da9f19du, - 0xc139f11du, - 0xf091c086u, - 0xf0918038u, - 0xf11d0702u, - 0xc1a6f091u, - 0xc021e10bu, - 0xc439ad0eu, - 0xacccf11du, - 0xf4312888u, - 0x3048db2u, - 0xe1090302u, - 0x8db2f19du, - 0x7096477u, - 0x650066f0u, - 0x22082118u, - 0xb276f4a3u, - 0x2007f091u, - 0xe607f091u, - 0xf01df091u, - 0x4100a312u, - 0xa210f053u, - 0xf0912804u, - 0xcd16f091u, - 0xe086f091u, - 0x843af19du, - 0x70ac4bdu, - 0xe10fad0eu, - 0xac50e326u, - 0xf091f3a6u, - 0xf091f01du, - 0xad39ac8au, - 0xf05df091u, - 0xc021e189u, - 0xad0fac06u, - 0xf01d070bu, - 0xad3aac74u, - 0xf05df091u, - 0x1270001eu, - 0x17ec438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091b068u, - 0x110u, - 0xd8a7ca28u, - 0xf6391074u, - 0xc1b6f091u, - 0xb2760000u, - 0x108d483u, - 0x107c08d4u, - 0xf091c031u, - 0xce36f091u, - 0x2a1ccd17u, - 0xc81de297u, - 0xf0910014u, - 0x14a0200u, - 0x310c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091d325u, - 0xe169ca25u, - 0x500e10bu, - 0x408d315u, - 0xe205f091u, - 0x146e2daau, - 0xe226f091u, - 0xf2a6f091u, - 0xcd07c80du, - 0x2eac0011u, - 0x166f337u, - 0x2e322d34u, - 0xc328f091u, - 0x200031cu, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106aad29u, - 0xac0ef05du, - 0x2d281270u, - 0x1e017eu, - 0xc438f091u, - 0xd4b8f091u, - 0xf0d1f091u, - 0xad0fac06u, - 0xcf44f091u, - 0x10184b0u, - 0xf11d070au, - 0xc924f091u, - 0xd9a4f091u, - 0x2a8c96b1u, - 0xf19dcf33u, - 0xf19df091u, - 0x2804cd16u, - 0xf091cd24u, - 0xf0912958u, - 0xc531ad0fu, - 0xac32f11du, - 0xf0919b36u, - 0x4000a1a2u, - 0xa0aec020u, - 0xf091c021u, - 0xe109ad7cu, - 0xacc0f05du, - 0x40014u, - 0x14a0200u, - 0x311c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091ad12u, - 0xac10f05du, - 0xf0912808u, - 0x1f084a8u, - 0x2c08931u, - 0xad0facd2u, - 0xf19df091u, - 0xe086f091u, - 0x843ae18bu, - 0xf091ad0fu, - 0xac06f01du, - 0xf091ad0fu, - 0xacba010fu, - 0x88a80015u, - 0x1e4f11du, - 0x9f720015u, - 0x1eaf11du, - 0x9f720014u, - 0x1dcf11du, - 0x9f720014u, - 0x1e4f11du, - 0x9f720014u, - 0x1ecf11du, - 0x9f720014u, - 0x1f4f11du, - 0x9f720014u, - 0x1f4f11du, - 0x9f720016u, - 0x174f11du, - 0xf0910014u, - 0x14a0200u, - 0x308c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf091c438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf091ad0fu, - 0xac062808u, - 0x1f084a8u, - 0xe1898338u, - 0xe135f091u, - 0xf01d0180u, - 0x84b0e12bu, - 0x18184b0u, - 0xe1250182u, - 0x84b0e11fu, - 0x18484b0u, - 0xe1190185u, - 0x84b0e113u, - 0x12284b0u, - 0xe10d0123u, - 0x84b0e107u, - 0xf091f01du, - 0xf091e086u, - 0xf0910048u, - 0x8128e11fu, - 0xf0910019u, - 0x108c438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf091843au, - 0xf19d0703u, - 0x1052808u, - 0x84b0ad10u, - 0xac76f19du, - 0xf0912891u, - 0x873af11du, - 0xf0910016u, - 0x178c438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf091ff44u, - 0xf0910204u, - 0x81b2e10bu, - 0x20581b2u, - 0x81b2e197u, - 0xf0912808u, - 0x10784b0u, - 0xe13b0501u, - 0x20481b2u, - 0xe1b30502u, - 0xf01d0202u, - 0x81b2e19fu, - 0xf091b276u, - 0x51430000u, - 0x160d483u, - 0x2a1cf0a2u, - 0xf091e022u, - 0xf091c713u, - 0xc219e00fu, - 0x5000203u, - 0x81b2e185u, - 0x5000501u, - 0x2a1c2e34u, - 0xb278f623u, - 0x8d4f091u, - 0xad11ac7au, - 0xf05df091u, - 0xe1950014u, - 0x14a0200u, - 0x310c438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0911074u, - 0x12762e2cu, - 0x2daae7b8u, - 0xf091c328u, - 0xf0910200u, - 0x31cc101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x2d280011u, - 0x1662d32u, - 0xad29ac0eu, - 0xca28f091u, - 0xf05d2d34u, - 0x28080123u, - 0x84b0ad11u, - 0xac56f19du, - 0x1270001fu, - 0x148c438u, - 0xf091d4b8u, - 0xf091e707u, - 0xf091e07bu, - 0xf091ad12u, - 0xac9af01du, - 0xf0910021u, - 0x12cc438u, - 0xf091d4b8u, - 0xf091f0d1u, - 0xf0918922u, - 0xe18d0104u, - 0xc1c8f091u, - 0x80a0c1d8u, - 0xf091f0d1u, - 0xf091c1c4u, - 0xf0918290u, - 0x9f70ad12u, - 0xac0cf41du, - 0x1038691u, - 0xb274f323u, - 0x9234cb45u, - 0xd6832d2au, - 0x8c4f091u, - 0x2e2c2eb0u, - 0x2a34cd17u, - 0xc81dad11u, - 0xacd8f41du, - 0xf091e187u, - 0xcf27f11du, - 0xf0912eb0u, - 0x2aacdd07u, - 0xd80dc031u, - 0x2080300u, - 0x2ab0cd17u, - 0xc81de405u, - 0x29b2146au, - 0x101u, - 0xf0d1c021u, - 0x2ab0c713u, - 0xc2192e34u, - 0xad12ac0cu, - 0x292a9f70u, - 0xf41d9f71u, - 0xad11ac96u, - 0xf19df223u, - 0xdfa4f091u, - 0xf433c523u, - 0xf11d0106u, - 0xb274f323u, - 0xad11ac96u, - 0xf01df091u, - 0xf0d1c031u, - 0x2916c446u, - 0xf0911148u, - 0x8138e10fu, - 0x1fd80a8u, - 0xc456f091u, - 0x2916cbb6u, - 0xf0912811u, - 0x8338e187u, - 0xf091f0d1u, - 0xf0918538u, - 0xe111f335u, - 0xc523e10bu, - 0x843be187u, - 0x295addb4u, - 0xf0912916u, - 0xc171cb36u, - 0xf091c406u, - 0xf0918020u, - 0xe1910200u, - 0x312b276u, - 0xd5832208u, - 0x21182003u, - 0xf091f0d1u, - 0xf0910002u, - 0x3010000u, - 0x0u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa8702301u, - 0xe0110b01u, - 0x0u, - 0x4400a9a1u, - 0xa8302300u, - 0xb00c1c8u, - 0xf0910102u, - 0x80a0c1d8u, - 0xf0912604u, - 0xcc28f091u, - 0xdca8f091u, - 0xc173c079u, - 0xcc38f091u, - 0xdcb8f091u, - 0xad12acfcu, - 0xf99d8030u, - 0x110c0207u, - 0x85298541u, - 0x4000a112u, - 0xa0ded081u, - 0xc020f091u, - 0xbc68f01du, - 0xf0911346u, - 0x13461346u, - 0x12ee12eeu, - 0x134612eeu, - 0x1346c428u, - 0xf091bc68u, - 0xc4a8f091u, - 0xf01df091u, - 0x111f100du, - 0x8238e10fu, - 0xf0916304u, - 0xf091ad13u, - 0xac46f01du, - 0xf091103au, - 0x22002104u, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf0912900u, - 0x29022803u, - 0x8038e117u, - 0xf0910000u, - 0x114ad47u, - 0xac2af05du, - 0xf091ad13u, - 0xac52f01du, - 0xf0910000u, - 0x10cad47u, - 0xac2af05du, - 0xf091ca28u, - 0xf091c021u, - 0xad13acc2u, - 0xf11df631u, - 0xc446f091u, - 0x10480a0u, - 0xc456f091u, - 0xc1c8f091u, - 0x8238ad13u, - 0xac8af19du, - 0xf091c4a8u, - 0xf091b468u, - 0x42000023u, - 0x106c2b4u, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605f0d1u, - 0xf091ad28u, - 0xacf4f05du, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605f0d1u, - 0xf091c328u, - 0xf0912204u, - 0x211c3468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0xf139c03eu, - 0xf091ffafu, - 0x4200a54eu, - 0xa40203c4u, - 0xe4a8f091u, - 0xad14acc8u, - 0xf05dcf37u, - 0xea852301u, - 0x2300f0afu, - 0xc02ef091u, - 0xf831ad13u, - 0xacc2f01du, - 0xf091c328u, - 0xf0912204u, - 0x211c3468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0x28040103u, - 0x84a88030u, - 0x4000a112u, - 0xa06ed081u, - 0xc000f091u, - 0x103c03eu, - 0xf09180b0u, - 0xad13acc2u, - 0xf11df091u, - 0x280801c2u, - 0x8490ad13u, - 0xacc2f11du, - 0x1c38490u, - 0xf11df139u, - 0xc03ef091u, - 0xffaf4200u, - 0xa54ea402u, - 0x3c2e4a8u, - 0xf091ad14u, - 0xacc8f05du, - 0xcf37ea85u, - 0x23012300u, - 0xf0afc02eu, - 0xf091f831u, - 0xad13acc2u, - 0xf01df091u, - 0x2e9c2844u, - 0x784a8u, - 0x3084a0u, - 0xb52d04u, - 0x9501d5u, - 0x2000302u, - 0xe031f091u, - 0x2000303u, - 0xe029f091u, - 0x2000304u, - 0xe009f091u, - 0x2000305u, - 0xf091b276u, - 0x6000712u, - 0xd7832208u, - 0x21182003u, - 0xf091ad15u, - 0xac94f01du, - 0xf091b276u, - 0x6000712u, - 0xd7832208u, - 0x21182003u, - 0xf0918030u, - 0x285cc141u, - 0x4000a115u, - 0xa03ad081u, - 0xc020f091u, - 0xbc68f01du, - 0xf0911594u, - 0x157a157au, - 0x157a157au, - 0x157a157au, - 0x157a1594u, - 0x157a1594u, - 0x157a157au, - 0x157a157au, - 0x157a1594u, - 0x1594157au, - 0x157a1594u, - 0x1594157au, - 0x157a157au, - 0x157a1594u, - 0x15941594u, - 0x15941594u, - 0x1594f139u, - 0xc03ef091u, - 0xffafc031u, - 0xad7bac6eu, - 0xf05db476u, - 0xf0afc02eu, - 0xf091f831u, - 0xc126f239u, - 0xcaa6f091u, - 0xad4eac0au, - 0xf05df091u, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xf0d1f091u, - 0x8932e00fu, - 0x3012a1cu, - 0xc921e187u, - 0xf091daa6u, - 0xf091d03eu, - 0xf091ffafu, - 0xc126f239u, - 0xad4eac0au, - 0xf05d106au, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xf0afd02eu, - 0xf091ca28u, - 0xf639c086u, - 0xf0918638u, - 0xe19bf091u, - 0xcaa6f091u, - 0xc111cab6u, - 0xf091c021u, - 0xe18bf091u, - 0xad24ac2cu, - 0xf05df091u, - 0xf0d1f091u, - 0xf0d1f091u, - 0xc2200u, - 0x3148c328u, - 0xf0910200u, - 0x31cc101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf091ca28u, - 0xf6392a04u, - 0x2a80b276u, - 0xf22308d4u, - 0xf091e9b6u, - 0xf091fa36u, - 0xf091c1a6u, - 0xf039c180u, - 0xf0910103u, - 0x80b0ad17u, - 0xac0cf11du, - 0xf091f139u, - 0xc03ef091u, - 0xffafcd06u, - 0xf0910103u, - 0x84a88030u, - 0x4000a112u, - 0xa06ed081u, - 0xc000f091u, - 0x1248a100u, - 0xa0000600u, - 0x701ad4au, - 0xacfcf05du, - 0x3c0ea85u, - 0x23012300u, - 0xf0afc02eu, - 0xf091f831u, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xad24ac2cu, - 0xf05df091u, - 0xf0d1f091u, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xc031cfb8u, - 0xf0910200u, - 0x314ad43u, - 0xac40f05du, - 0xf091f0d1u, - 0xf091ad28u, - 0xacf4f05du, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605cea8u, - 0xf091c021u, - 0xe18bf091u, - 0xad7cacc0u, - 0xf05d0023u, - 0xdf71ceb8u, - 0xf0912303u, - 0xad08ac0au, - 0xf05dc031u, - 0xc1a6f239u, - 0x8c4f091u, - 0x2e00c23du, - 0xad28ac50u, - 0xf19d104eu, - 0x2c06c128u, - 0xf0910200u, - 0x342c521u, - 0x2d44b276u, - 0x112u, - 0xd4832224u, - 0x21182002u, - 0xf091c6c6u, - 0xf0910110u, - 0x80a0c6d6u, - 0xf091ad28u, - 0xac1ef01du, - 0x36c086u, - 0xf09101efu, - 0x80a80140u, - 0x80a0c096u, - 0xf091c1a6u, - 0xf091c021u, - 0xe191f031u, - 0xcd06f091u, - 0x81700103u, - 0x80a8e007u, - 0xf091c180u, - 0xf0910103u, - 0x80b0ad18u, - 0xacc0f11du, - 0xf091f139u, - 0xc03ef091u, - 0xffafcd06u, - 0xf0910103u, - 0x84a88030u, - 0x4000a112u, - 0xa06ed081u, - 0xc000f091u, - 0x1248a100u, - 0xa0000600u, - 0x701ad4au, - 0xacfcf05du, - 0x3c0ea85u, - 0x23012300u, - 0xf0afc02eu, - 0xf091f831u, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xad24ac2cu, - 0xf05df091u, - 0xf0d1f091u, - 0x280801f0u, - 0x80a80180u, - 0x84b0ad19u, - 0xac5af11du, - 0xf091ad28u, - 0xacf4f05du, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605f0d1u, - 0xf091c1a6u, - 0xf039c180u, - 0xf0910103u, - 0x80b0ad19u, - 0xacacf11du, - 0xf091f139u, - 0xc03ef091u, - 0xffafcd06u, - 0xf0910103u, - 0x84a88030u, - 0x4000a112u, - 0xa06ed081u, - 0xc000f091u, - 0x1248a100u, - 0xa0000600u, - 0x701ad4au, - 0xacfcf05du, - 0x3c0ea85u, - 0x23012300u, - 0xf0afc02eu, - 0xf091f831u, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xad27ac68u, - 0xf01df091u, - 0x2c00ad1au, - 0xac82c004u, - 0xf0910108u, - 0x8490f091u, - 0x8030d4c6u, - 0xf091d526u, - 0xf091cd21u, - 0xf11d166au, - 0xc17700ffu, - 0xcf29c177u, - 0xf11df091u, - 0xc288f091u, - 0x8038e10bu, - 0x6042800u, - 0x9b30e111u, - 0xf091c008u, - 0xf0918020u, - 0xad1aac72u, - 0xf19df091u, - 0xffc038u, - 0xf091d0b8u, - 0xf091c0a4u, - 0xf09102ffu, - 0x3f0c529u, - 0xe105f091u, - 0x10fd2d8u, - 0xf091c1a4u, - 0xf0910208u, - 0x300cc13u, - 0xe285f091u, - 0x106acdb8u, - 0xf0910c44u, - 0x10000104u, - 0x280084b0u, - 0xe10d0103u, - 0x84b0e117u, - 0xf091f0d1u, - 0xf091c288u, - 0xf09101feu, - 0x80a8c298u, - 0xf091e06fu, - 0xf091c148u, - 0xf091e5a6u, - 0xf091f666u, - 0xf091ad4eu, - 0xac12f01du, - 0xf091103au, - 0xd328f091u, - 0xc1110223u, - 0x3e4c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x28d30203u, - 0x8d2b8932u, - 0xc111c3b8u, - 0xf0910200u, - 0x340c911u, - 0xe405f091u, - 0x106a1049u, - 0x23032200u, - 0x3148c328u, - 0xf0910200u, - 0x31cc101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf091ca28u, - 0xf6398030u, - 0x28400212u, - 0x8892e28fu, - 0xc141c4a8u, - 0xf091ad1bu, - 0xacc2f01du, - 0xf0914000u, - 0xa11ba03cu, - 0xd081c020u, - 0xf091bc68u, - 0xc4a8f091u, - 0xf01df091u, - 0x1bc21bc2u, - 0x1bc21b62u, - 0x1bc21bc2u, - 0x1bc21bc2u, - 0x1bc21bc2u, - 0x1bc21bc2u, - 0x1bc21bc2u, - 0x1bc21bc2u, - 0x1bc21bc2u, - 0x1bc24000u, - 0xa1a2a00cu, - 0xb2702204u, - 0x21302003u, - 0xf091c328u, - 0xf0910200u, - 0x350c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x22042120u, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf091b270u, - 0x130u, - 0xd4832204u, - 0x21202003u, - 0xf0914100u, - 0xa302a280u, - 0x4200a5a2u, - 0xa40cad19u, - 0xacf0f05du, - 0x2800c4a8u, - 0xf091ea85u, - 0x23012300u, - 0x103ad328u, - 0xf091c111u, - 0x22303e4u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106a28d3u, - 0x2038d2bu, - 0x8932c111u, - 0xc3b8f091u, - 0xca28f639u, - 0x2303ad1eu, - 0xac0cf05du, - 0xf091cea8u, - 0xf0912d22u, - 0x20110u, - 0xc5332e3cu, - 0x1ad2du, - 0xacacf05du, - 0x100280bu, - 0x22003148u, - 0xc328f091u, - 0x200031cu, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106a3468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0x120u, - 0x2010300u, - 0x2e3cca28u, - 0xf091c03eu, - 0xf091ffafu, - 0xad1dac08u, - 0xf05df091u, - 0xf0afc02eu, - 0xf091f631u, - 0xc6c6f091u, - 0x11084a8u, - 0xe10bf091u, - 0xad7aac96u, - 0xf05df137u, - 0xf0d1f091u, - 0x23035140u, - 0x2000340u, - 0xcd15e205u, - 0x164d164bu, - 0x2200314eu, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf091b270u, - 0x2200314eu, - 0x2003f091u, - 0xc915e223u, - 0xf091e11fu, - 0xf091d181u, - 0x2000340u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106aad1cu, - 0xac80f01du, - 0xf091f0d1u, - 0xf091ad1du, - 0xac08f05du, - 0xf0912811u, - 0x10884a8u, - 0xe10bf091u, - 0xad24ac2cu, - 0xf05df091u, - 0xf0d1f091u, - 0xca38f091u, - 0xf631ad1eu, - 0xac0cf05du, - 0xf0910001u, - 0x1100200u, - 0x3002e3cu, - 0x283d0120u, - 0x80b0e109u, - 0xf091cea8u, - 0xf0912d22u, - 0x1ad2du, - 0xacacf05du, - 0x101ea85u, - 0x23012300u, - 0xca28f639u, - 0x28118038u, - 0xc086f091u, - 0xe1890110u, - 0x1efe005u, - 0x80a880a0u, - 0xc096f091u, - 0xf137c03eu, - 0xf091ffafu, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xcd06f091u, - 0x10384a8u, - 0x80304000u, - 0xa112a06eu, - 0xd081c000u, - 0xf0910103u, - 0x80b0ad1du, - 0xacdaf11du, - 0xf091cd06u, - 0xf0910103u, - 0x84a88030u, - 0x4000a112u, - 0xa06ed081u, - 0xc000f091u, - 0x1248a100u, - 0xa000ca35u, - 0x6000701u, - 0xad4aacfcu, - 0xf05d03c0u, - 0xea852301u, - 0x2300f0afu, - 0xc02ef091u, - 0xf6312811u, - 0x11084a8u, - 0xe187f091u, - 0xf0d1f091u, - 0xe086f091u, - 0x813ae18bu, - 0x3fead7au, - 0xac96f01du, - 0xf137892bu, - 0xe096f091u, - 0xf0d1f091u, - 0xad08ac0au, - 0xf05dc031u, - 0xc031c533u, - 0x2e00c128u, - 0xf0910200u, - 0x382c521u, - 0x2d44ed06u, - 0xf0918172u, - 0x30389aau, - 0xe185f091u, - 0x81722c86u, - 0x2012c87u, - 0xc3a8f091u, - 0xd7a8f091u, - 0x6000713u, - 0xc813e409u, - 0xf0911268u, - 0x6000700u, - 0xc0312e08u, - 0xca352e8cu, - 0xb278f623u, - 0x8c4f091u, - 0x2e102e94u, - 0xb2760000u, - 0x112d483u, - 0x22242118u, - 0x2002f091u, - 0xf337f0d1u, - 0x2d76b468u, - 0x4200103au, - 0xd328f091u, - 0xc1110223u, - 0x3e4c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x28d30203u, - 0x8d2b8932u, - 0xc111c3b8u, - 0xf091ca28u, - 0xf639de26u, - 0xf091c061u, - 0xc061c403u, - 0xde36f091u, - 0xad1fac08u, - 0xc1c8f091u, - 0x8238f19du, - 0x230106u, - 0xc2b4f091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xf0d1f091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xad23ac08u, - 0xf05d1076u, - 0xf0d1f091u, - 0xca28f639u, - 0xc1a6f039u, - 0xff40f091u, - 0x20389b2u, - 0xe10bf091u, - 0xad21ac2cu, - 0xf01df091u, - 0xc320f091u, - 0x5c68c3a0u, - 0xf0915e68u, - 0x21042080u, - 0x1f0e50du, - 0x101f80a8u, - 0xe187f091u, - 0xe075f091u, - 0x29c0103au, - 0xd328f091u, - 0xc1110223u, - 0x3e4c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x28d30203u, - 0x8d2b8932u, - 0xc111c3b8u, - 0xf0910200u, - 0x340c911u, - 0xe4051049u, - 0x104b2303u, - 0x22003148u, - 0xc328f091u, - 0x200031cu, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106a3468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0x28400202u, - 0x8911e185u, - 0x8030114eu, - 0x2128892u, - 0xad20ac08u, - 0xf29dc141u, - 0xc4a8f091u, - 0xad21ac2cu, - 0xf01df091u, - 0x4000a120u, - 0xa01ed081u, - 0xc020f091u, - 0xbc68c4a8u, - 0xf091f01du, - 0xf091212cu, - 0x212c212cu, - 0x20502044u, - 0x212c212cu, - 0x212c212cu, - 0x212c212cu, - 0x212c212cu, - 0x212c212cu, - 0x212c212cu, - 0x212c212cu, - 0x2888843au, - 0xad21ac28u, - 0xf11df091u, - 0x4000a1a2u, - 0xa00cb270u, - 0x22042130u, - 0x2003f091u, - 0xc328f091u, - 0x2000350u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106a2204u, - 0x21203468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0xb2700000u, - 0x130d483u, - 0x22042120u, - 0x2003f091u, - 0xc1a6f439u, - 0x2000304u, - 0xc3a4f091u, - 0xc501c324u, - 0xf091c079u, - 0x5c685e6au, - 0x22042130u, - 0x2000f091u, - 0x1f0e50du, - 0x101f80a8u, - 0xe187f091u, - 0xe075f091u, - 0x4000a1a2u, - 0xa05cb270u, - 0x22042130u, - 0x2003f091u, - 0x2000334u, - 0xc3a4f091u, - 0xc501c324u, - 0xf091c079u, - 0x5c685e6au, - 0x22042120u, - 0x2000f091u, - 0x1f0e50du, - 0x101f80a8u, - 0xe187f091u, - 0xe075f091u, - 0xb2700000u, - 0x130d483u, - 0x22042120u, - 0x2003f091u, - 0x4100a3a2u, - 0xa25c4200u, - 0xa5a2a40cu, - 0xad19acf0u, - 0xf05d104eu, - 0xc4a8f091u, - 0xb4684200u, - 0xea852301u, - 0x2300103au, - 0xd328f091u, - 0xc1110223u, - 0x3e4c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x28d30203u, - 0x8d2b8932u, - 0xc111c3b8u, - 0xf091ca28u, - 0xf639c1a6u, - 0xf039e6c6u, - 0xf0910310u, - 0x89aae10fu, - 0xf091e486u, - 0xf0910307u, - 0x89b2e11bu, - 0xf091d2a0u, - 0xf091c501u, - 0xd2b0f091u, - 0xd220f091u, - 0xc07bd230u, - 0xf091e01bu, - 0xf091dfa6u, - 0xf091c413u, - 0xdfb6f091u, - 0xdf26f091u, - 0x100u, - 0xc41bdf36u, - 0xf0912d24u, - 0xd7a8f091u, - 0xc813ad22u, - 0xac7af41du, - 0xad22ac36u, - 0xc1c8f091u, - 0x8238f19du, - 0x230106u, - 0xc2b4f091u, - 0xca28f639u, - 0xc1a6f039u, - 0xc180f091u, - 0x10380b0u, - 0xe19d2811u, - 0xc01ef091u, - 0x8338e113u, - 0xf091c446u, - 0xf0910101u, - 0x80a0c456u, - 0xf091e037u, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605f0d1u, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605ca28u, - 0xf639ad23u, - 0xac08f05du, - 0xf091f0d1u, - 0xf091c031u, - 0xc034f091u, - 0xb278f623u, - 0x8c4f091u, - 0xc703c079u, - 0xc638f091u, - 0xd6b8f091u, - 0x2e342924u, - 0xc3112d24u, - 0xca28f039u, - 0xc1a0f439u, - 0xad11ac7au, - 0xf05df091u, - 0xe7b8f091u, - 0x10741276u, - 0x2e2c0200u, - 0x3012d6au, - 0xe10bf091u, - 0x2924cc15u, - 0xe41df091u, - 0x230106u, - 0x2d32ca28u, - 0xf091ad29u, - 0xac0ef05du, - 0x2d34ad21u, - 0xacd0f01du, - 0xf091ca25u, - 0xe18bf091u, - 0xad7cacc0u, - 0xf05d0021u, - 0x106cfa28u, - 0xf091ad29u, - 0xac0ef05du, - 0xca35ad22u, - 0xac80f01du, - 0xf091f631u, - 0xfba6f091u, - 0xc177fbb6u, - 0xf091eb26u, - 0xf091cb15u, - 0xe03ef091u, - 0xffafc1a6u, - 0xf0391070u, - 0xc021e113u, - 0xf091c180u, - 0xf0910103u, - 0x80b0ad23u, - 0xac9af19du, - 0xf091ad23u, - 0xac92c446u, - 0xf0918238u, - 0xe189f091u, - 0xca25f19du, - 0xf091c446u, - 0xf0918038u, - 0xf11d01feu, - 0x80a8c456u, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605ad24u, - 0xac0ef01du, - 0xf091ca25u, - 0xad24ac0eu, - 0xf19df091u, - 0xf139c03eu, - 0xf091ffafu, - 0xb2760000u, - 0x112d483u, - 0x22082118u, - 0x2002f091u, - 0xc888f091u, - 0x8170c898u, - 0xf0916302u, - 0xf091cd06u, - 0xf0910103u, - 0x84a88030u, - 0x4000a112u, - 0xa06ed081u, - 0xc000f091u, - 0x1248a100u, - 0xa000146eu, - 0x9f74e105u, - 0x3c003c1u, - 0xad4aacfcu, - 0xf05df091u, - 0xea852301u, - 0x2300f0afu, - 0xc02ef091u, - 0xf831ad24u, - 0xac1cf01du, - 0xf091c888u, - 0xf0918170u, - 0xc898f091u, - 0x6302f091u, - 0xf0afd02eu, - 0xf091c523u, - 0xe107f091u, - 0xf0d1f091u, - 0xc0c6f091u, - 0x8170c0d6u, - 0xf091c446u, - 0xf0910102u, - 0x80a0c456u, - 0xf091c031u, - 0xcb36f091u, - 0xcbb6f091u, - 0xc406f091u, - 0x8020ad27u, - 0xac68f19du, - 0xf0910310u, - 0xe6c6f091u, - 0x803ae185u, - 0x2100200u, - 0xc486f091u, - 0x1f080a8u, - 0x1c080b0u, - 0xc086f091u, - 0xe18b01efu, - 0x8138e105u, - 0x89338933u, - 0x80a88120u, - 0xc096f091u, - 0xd1a6f091u, - 0xc523ad26u, - 0xacb0f11du, - 0xf091c43bu, - 0xe10bf433u, - 0xad25acfeu, - 0xf01df091u, - 0xff44f091u, - 0x2078daau, - 0x8932c543u, - 0x4100a324u, - 0xa2c6d583u, - 0xd022f091u, - 0xbc6af01du, - 0xf09128deu, - 0x24d6251cu, - 0x2548255eu, - 0x25ac28deu, - 0x28ded124u, - 0xf0910000u, - 0x110c129u, - 0xad25ac0eu, - 0xf11df091u, - 0xc0c6f091u, - 0x9f70f19du, - 0xf091c224u, - 0xf091d2a4u, - 0xf0912302u, - 0x2e340400u, - 0x5000600u, - 0x700ad25u, - 0xacc4f01du, - 0x100c031u, - 0xcc36f091u, - 0xad27ac68u, - 0xf01df091u, - 0xd124f091u, - 0xc43be119u, - 0xc031c0c6u, - 0xf0919f70u, - 0xe18fc031u, - 0xc928f091u, - 0xcc36f091u, - 0xf0d1f091u, - 0xcc36f091u, - 0xad27ac68u, - 0xf01df091u, - 0xc0c6f091u, - 0x9f70ad27u, - 0xac68f19du, - 0xc031cc36u, - 0xf091f0d1u, - 0xf091c6c6u, - 0xf0910110u, - 0x84a8ad27u, - 0xac68f19du, - 0xc031cc36u, - 0xf0910105u, - 0xc486f091u, - 0xc0c6f091u, - 0x8038ad28u, - 0xacdef19du, - 0xb276c086u, - 0xf0918138u, - 0xe10ff223u, - 0x1048021u, - 0xc096f091u, - 0xf01df091u, - 0x8c4f091u, - 0x23022e34u, - 0xad25acc4u, - 0xf01d0102u, - 0xc6c6f091u, - 0x11084a8u, - 0xad27ac68u, - 0xf19dc031u, - 0xcc36f091u, - 0xf0d1f091u, - 0x2ea82c66u, - 0xc0312e20u, - 0x2c27c746u, - 0xf0910108u, - 0x8021c756u, - 0xf091c1a6u, - 0xf039c180u, - 0xf0912c06u, - 0x1c496u, - 0xf091b276u, - 0xad48ac84u, - 0xf05df091u, - 0xea852301u, - 0x2300f0d1u, - 0xf091c031u, - 0xcc36f091u, - 0xc6c6f091u, - 0xe086f091u, - 0x8038e189u, - 0x11001efu, - 0xe00588aau, - 0x88a2e096u, - 0xf091c031u, - 0xc5332e00u, - 0xc128f091u, - 0x2000382u, - 0xc5212d44u, - 0xed06f091u, - 0x81720303u, - 0x89aae185u, - 0xf0918172u, - 0x2c860201u, - 0x2c87c031u, - 0xde26f091u, - 0xc543c149u, - 0xc543c149u, - 0xe326f091u, - 0xf3a6f091u, - 0xcd17c81du, - 0x6000713u, - 0xe407f091u, - 0x6000700u, - 0x2e08ca35u, - 0x2e8cb276u, - 0xf22308c4u, - 0xf0912e10u, - 0x2e94b276u, - 0x112u, - 0xd4832224u, - 0x21182002u, - 0xf0910001u, - 0x1100200u, - 0x3002e3cu, - 0xcea8f091u, - 0x2d220001u, - 0xad2dacacu, - 0xf05d0101u, - 0xad28ac5cu, - 0xf01df091u, - 0xc031cc36u, - 0xf091ad27u, - 0xac20c086u, - 0xf0918638u, - 0xf19df091u, - 0xad3bac3au, - 0xf05df091u, - 0xf3374000u, - 0xa1a1a0e0u, - 0xea874000u, - 0xa1a1a0d0u, - 0xd081c020u, - 0xf091c021u, - 0xe11df091u, - 0xc931e10du, - 0xf091f031u, - 0xad26acdeu, - 0xf01df091u, - 0xf231d022u, - 0xf091d030u, - 0xf091f137u, - 0xad3aacdcu, - 0xf05df091u, - 0xad2dacacu, - 0xf05d0001u, - 0xad7aac96u, - 0xf01df137u, - 0xf0d1f091u, - 0xcd06f091u, - 0x10384a8u, - 0x80304000u, - 0xa112a06eu, - 0xd081c000u, - 0xf0911248u, - 0xa100a000u, - 0xad4dac06u, - 0xf05df091u, - 0xcea8f091u, - 0xc021e18bu, - 0xf091ad7cu, - 0xacc0f05du, - 0x23df71u, - 0xceb8f091u, - 0xad7aac96u, - 0xf01df137u, - 0xf0d1f091u, - 0xc6c6f091u, - 0x11084a8u, - 0xad27ac90u, - 0xf11df091u, - 0xcea8f091u, - 0xc021e18bu, - 0xf091ad7cu, - 0xacc0f05du, - 0x23df71u, - 0xceb8f091u, - 0x2303ad08u, - 0xac0af05du, - 0xc031c1a6u, - 0xf23908c4u, - 0xf0912e00u, - 0xc23dad28u, - 0xac50f19du, - 0x104e2c06u, - 0xc128f091u, - 0x2000342u, - 0xc5212d44u, - 0xc1a6f239u, - 0xc222f091u, - 0xd2a2f091u, - 0x2e08b276u, - 0x112u, - 0xd4832224u, - 0x21182002u, - 0xf091ad28u, - 0xac1ec086u, - 0xf0918638u, - 0xe10f2824u, - 0x18484b0u, - 0xf11d0030u, - 0xf01d0031u, - 0xc446f091u, - 0x8238f19du, - 0x35dfa6u, - 0xf091cf26u, - 0xf0912a88u, - 0xcf13ca19u, - 0xf41d0034u, - 0xc406f091u, - 0x8020e11bu, - 0x2824010fu, - 0x80a82c0fu, - 0xcca6f091u, - 0xc021e10bu, - 0xf431ad39u, - 0xac00f05du, - 0xf091290eu, - 0xcea8f091u, - 0x2d220001u, - 0x1100200u, - 0x3002e3cu, - 0x292c0000u, - 0xad2dacacu, - 0xf05d0101u, - 0xc1a6f439u, - 0xad39ac00u, - 0xf05df091u, - 0xc031c1b6u, - 0xf091c6c6u, - 0xf0910110u, - 0x84a8c406u, - 0xf09184a0u, - 0xe11ff091u, - 0xe086f091u, - 0x813ae18bu, - 0x3fead7au, - 0xac96f01du, - 0xf137892bu, - 0xe096f091u, - 0xf0d1f091u, - 0xe086f091u, - 0x813ae107u, - 0xf091f0d1u, - 0xf091cca6u, - 0xf091c021u, - 0xe139f431u, - 0xdfa4f091u, - 0xdcb6f091u, - 0xc031cfb4u, - 0xf091f135u, - 0xc1b6f091u, - 0x5142b274u, - 0x22002140u, - 0x2002f091u, - 0xad36ac7cu, - 0xf05df091u, - 0xc1a6f091u, - 0xc021a128u, - 0xa09ef111u, - 0xf091f0d1u, - 0xf091c888u, - 0xf0918170u, - 0xc898f091u, - 0x6302f091u, - 0xf0d1f091u, - 0xe707f091u, - 0xe07bf091u, - 0x103ac533u, - 0x2e28c031u, - 0x2e2c2d34u, - 0x22803e2u, - 0x2d72292cu, - 0x292e292au, - 0x2932c021u, - 0xe11f2934u, - 0xc021e119u, - 0xf031292au, - 0xdfa0f091u, - 0xc501dfb0u, - 0xf091df20u, - 0xf091c07bu, - 0xdf30f091u, - 0x10098020u, - 0xe18b4100u, - 0xad7cacc0u, - 0xf05d0030u, - 0xb234b072u, - 0xc0312d36u, - 0x100f2d30u, - 0x22282110u, - 0x2003f091u, - 0xf0d16201u, - 0xe0050b00u, - 0xb011034u, - 0x1232c931u, - 0xe11bf233u, - 0xe2a2f091u, - 0xca258873u, - 0xe1878873u, - 0xe06df091u, - 0x111f8030u, - 0xc3b2f091u, - 0xf0d1f091u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0x10301232u, - 0xd131e187u, - 0x4000f0d1u, - 0xf091b068u, - 0xc2a0f091u, - 0xc021e18bu, - 0xbc68ad29u, - 0xaca8f01du, - 0x6204c888u, - 0xf0918020u, - 0xe10b0201u, - 0xc200f091u, - 0x110f88b0u, - 0xc120f091u, - 0xc1a0f091u, - 0xc0a0f091u, - 0xc320f091u, - 0xc021e123u, - 0xf231c0a0u, - 0xf091efa2u, - 0xf091c815u, - 0xefb2f091u, - 0xef22f091u, - 0x100u, - 0xc81def32u, - 0xf091c320u, - 0xf091e3a0u, - 0xf091f05du, - 0xf091ad29u, - 0xaca8f01du, - 0x62040000u, - 0x0u, - 0x0u, - 0x0u, - 0x80301108u, - 0x5a494200u, - 0xa502a400u, - 0x4300a7a1u, - 0xa6b4c741u, - 0xdd87c741u, - 0xd98568d1u, - 0xad2bac20u, - 0xf01d1319u, - 0x4000a1a1u, - 0xa0b0c031u, - 0xc030f091u, - 0x90f4000u, - 0xa1a1a0b4u, - 0x100u, - 0xc030f091u, - 0xf0a1e5f9u, - 0xf091f0d1u, - 0x600fad7cu, - 0xacc0f05du, - 0x71fe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x10401141u, - 0x12421343u, - 0x14441545u, - 0x1646fe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x10741276u, - 0x1478167au, - 0xfe2fb27eu, - 0xf0a308d4u, - 0xf091107cu, - 0xc03ef091u, - 0x808101cu, - 0xff2fc0beu, - 0xf091ad39u, - 0xac1ef05du, - 0xf091f12fu, - 0xc02ef091u, - 0xbc68b27eu, - 0xf0a308c4u, - 0xf091f22fu, - 0xb468b66au, - 0xb86cba6eu, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22f5048u, - 0x5149524au, - 0x534b544cu, - 0x554d564eu, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22fe015u, - 0xf09100f0u, - 0x111f80a8u, - 0xad2aac7au, - 0xf19df091u, - 0xe005f091u, - 0xe4ed2303u, - 0x164b0200u, - 0xc653c0a4u, - 0xf091c501u, - 0xc024f091u, - 0xc0795c68u, - 0x5e6a2140u, - 0x208001f0u, - 0xe50d101fu, - 0x80a8e187u, - 0xf091e075u, - 0xf0918176u, - 0xc184f091u, - 0x9b28c006u, - 0xf0918020u, - 0xe109ad2bu, - 0xace8f01du, - 0xf091283eu, - 0x8020e189u, - 0x28fc8da3u, - 0xe197c031u, - 0x114ed154u, - 0xf091c184u, - 0xf0915b48u, - 0xad2cacaau, - 0xf01df091u, - 0x2d3e4100u, - 0xa39fa238u, - 0xc022f091u, - 0x4000511u, - 0xc211e20fu, - 0xf091ad77u, - 0xacd4f05du, - 0x4100e187u, - 0x9f73f0d1u, - 0xf091124eu, - 0xe154f091u, - 0xe184f091u, - 0x5b4a2140u, - 0xf2312083u, - 0xf091e119u, - 0x8173c0b6u, - 0xf091c136u, - 0xf091f016u, - 0xf0910101u, - 0xd056f091u, - 0xf0d1f091u, - 0xad2fac6au, - 0xf05df431u, - 0xf0d1f091u, - 0x283e0201u, - 0x8910ad2cu, - 0xac44f11du, - 0xf0918030u, - 0xc016f091u, - 0xe0a6f091u, - 0xca25e13du, - 0xf2352140u, - 0x2082f091u, - 0x29bef435u, - 0x42c3eu, - 0x4000a1a1u, - 0xa0302904u, - 0xc039e109u, - 0xf0914000u, - 0xa1a1a070u, - 0xcea0f091u, - 0x2d220000u, - 0x101ad2du, - 0xacacf05du, - 0xf0910305u, - 0xe043f535u, - 0xf0d1f091u, - 0xad77acd4u, - 0xf05d4100u, - 0xe187124eu, - 0xf0d1f091u, - 0xe154f091u, - 0xe184f091u, - 0x5b4ac126u, - 0xf239cfb2u, - 0xf091c136u, - 0xf091c533u, - 0x2d7ef231u, - 0x21402083u, - 0xf091c006u, - 0xf091d046u, - 0xf0918171u, - 0xd056f091u, - 0x8011e107u, - 0x8030f0d1u, - 0xf091c016u, - 0xf091c0a6u, - 0xf439b274u, - 0x21402082u, - 0xf091ad2fu, - 0xac6af05du, - 0xf091f0d1u, - 0xf091ad7cu, - 0xacc0f05du, - 0x724000u, - 0xa1a1a030u, - 0x2904c039u, - 0xe109f091u, - 0x4000a1a1u, - 0xa070cea0u, - 0xf0912d22u, - 0x283e0104u, - 0x80212c3eu, - 0x101u, - 0xad2dacacu, - 0xf05df091u, - 0xf0d1f091u, - 0xad7cacc0u, - 0xf05d0073u, - 0xfe2fb27eu, - 0xf0a308d4u, - 0xf0911040u, - 0x11411242u, - 0x13431444u, - 0x15451646u, - 0xfe2fb27eu, - 0xf0a308d4u, - 0xf0911074u, - 0x12761478u, - 0x167afe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x107cc03eu, - 0xf0910808u, - 0x101cff2fu, - 0xc0bef091u, - 0xad39ac1eu, - 0xf05df091u, - 0xf12fc02eu, - 0xf091bc68u, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22fb468u, - 0xb66ab86cu, - 0xba6eb27eu, - 0xf0a308c4u, - 0xf091f22fu, - 0x50485149u, - 0x524a534bu, - 0x544c554du, - 0x564eb27eu, - 0xf0a308c4u, - 0xf091f22fu, - 0xad2daca2u, - 0xf01df091u, - 0xc03ef091u, - 0xffaf100du, - 0x111f00f0u, - 0x111f80a8u, - 0xad2cace4u, - 0xf19df091u, - 0x100d0118u, - 0x84a8e107u, - 0xf0910cc0u, - 0x1600f0afu, - 0xc02ef091u, - 0xe005f091u, - 0xe4cf1148u, - 0x8020e10bu, - 0x4100a302u, - 0xa228e00bu, - 0x4a054a04u, - 0x4100a302u, - 0xa2201319u, - 0x21408932u, - 0xc653c0a2u, - 0xf091c501u, - 0xc022f091u, - 0xc0795c68u, - 0x5e6ad1a2u, - 0xf0912cffu, - 0x14198174u, - 0x922a4000u, - 0xa1aaa020u, - 0xc031c030u, - 0xf0914000u, - 0xa1aaa022u, - 0x822103cu, - 0xc030f091u, - 0x15188294u, - 0xad2eac7cu, - 0xf19df091u, - 0xd03ef091u, - 0xffaf4000u, - 0xa1aaa022u, - 0xd020f091u, - 0x822103cu, - 0xc030f091u, - 0xc53100f0u, - 0x100c529u, - 0xe13df091u, - 0x4000a1aau, - 0xa020c020u, - 0xf091c171u, - 0xc030f091u, - 0x23b0388u, - 0xc131e1a3u, - 0xf0910008u, - 0xb001c48u, - 0x53000b01u, - 0x1c485300u, - 0x10060108u, - 0x80a01c48u, - 0x5700ad7cu, - 0xacc0f05du, - 0x77f0afu, - 0xd02ef091u, - 0xad2eac04u, - 0xf01df091u, - 0x208101f0u, - 0xe50d101fu, - 0x80a8e187u, - 0xf091e075u, - 0xf091ad2eu, - 0xacaaf49du, - 0xc031e132u, - 0xf0919224u, - 0xe189f091u, - 0x8173f1d2u, - 0xf091f0d1u, - 0x5b4a100du, - 0x111f00f0u, - 0x111f80a8u, - 0xad2eacd2u, - 0xf19df091u, - 0x100d0118u, - 0x84a8e107u, - 0xf0910cc0u, - 0x1600ad2eu, - 0xac96f01du, - 0xf091ad7cu, - 0xacc0f05du, - 0x74fe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x10401141u, - 0x12421343u, - 0x14441545u, - 0x1646fe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x10741276u, - 0x1478167au, - 0xfe2fb27eu, - 0xf0a308d4u, - 0xf091107cu, - 0xc03ef091u, - 0x808101cu, - 0xff2fc0beu, - 0xf091ad39u, - 0xac1ef05du, - 0xf091f12fu, - 0xc02ef091u, - 0xbc68b27eu, - 0xf0a308c4u, - 0xf091f22fu, - 0xb468b66au, - 0xb86cba6eu, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22f5048u, - 0x5149524au, - 0x534b544cu, - 0x554d564eu, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22fad2du, - 0xacc6f01du, - 0xf0914400u, - 0xa9a1a830u, - 0x2904c039u, - 0xe10b0b00u, - 0x4400a9a1u, - 0xa8700b01u, - 0x70287du, - 0x80a8e10bu, - 0xf091ad38u, - 0xac1ef01du, - 0xf0914000u, - 0xa12fa0b0u, - 0x8739e109u, - 0x85414000u, - 0xa12fa0d0u, - 0xd081c020u, - 0xf091bc68u, - 0xf01df091u, - 0x2ff0356eu, - 0x3548346eu, - 0x346e346eu, - 0x30243078u, - 0x2ff8302cu, - 0x303c3034u, - 0x301c3252u, - 0x32fc3320u, - 0x341e381eu, - 0x381e381eu, - 0x381e381eu, - 0x381e381eu, - 0x381e381eu, - 0x381e381eu, - 0x381e381eu, - 0x381e381eu, - 0xad38ac6eu, - 0xf01df091u, - 0xf135c03eu, - 0xf091ffafu, - 0xc188f091u, - 0xad43acd6u, - 0xf05d1448u, - 0xf0afc02eu, - 0xf091f431u, - 0xad38ac6eu, - 0xf01df091u, - 0xad38ac6eu, - 0xf01df091u, - 0xad38ac6eu, - 0xf01df091u, - 0xad3bac52u, - 0xf01df091u, - 0xad3cac32u, - 0xf01df091u, - 0xad3bacaau, - 0xf01df091u, - 0xad38ac6eu, - 0xf01df091u, - 0x3192u, - 0x131fau, - 0x231fau, - 0x3226u, - 0x130beu, - 0x230beu, - 0x8030beu, - 0x20030beu, - 0x40030beu, - 0x80030beu, - 0x3122u, - 0x4000a19fu, - 0xa054d020u, - 0xf091c523u, - 0xad31ac02u, - 0xf19df091u, - 0xc030f935u, - 0x2000309u, - 0x290ec413u, - 0xe28bf091u, - 0xad31ac22u, - 0xf01df091u, - 0xc2414000u, - 0xa130a04cu, - 0xd081c020u, - 0xf091d0a0u, - 0xf091bc6au, - 0xf01df091u, - 0x4000u, - 0xa130a0bcu, - 0xc030f091u, - 0x2000310u, - 0x4310544u, - 0xad7eacceu, - 0xf05df091u, - 0xad31ac02u, - 0xf19df091u, - 0xd124f091u, - 0x410c03bu, - 0xe1050300u, - 0x4204000u, - 0xa19fa050u, - 0xd020f091u, - 0xc525d030u, - 0xf091f0d1u, - 0xf0912303u, - 0xad08ac0au, - 0xf05dc031u, - 0xc533c031u, - 0x2e100200u, - 0x3322e0cu, - 0xb274ad31u, - 0xacc8f01du, - 0x5142ad31u, - 0xac920400u, - 0xf01d0533u, - 0x19f70u, - 0x29f56u, - 0x809f56u, - 0x2009f5cu, - 0x4009f60u, - 0x8009f64u, - 0x4100a331u, - 0xa22c4000u, - 0xa130a0bcu, - 0xc020f091u, - 0xd022f091u, - 0xc531e109u, - 0xf091c4f3u, - 0xe073f091u, - 0xd0a2f091u, - 0xb26a4100u, - 0x21e0304u, - 0xc42be115u, - 0xf0914000u, - 0xa19fa050u, - 0xd020f091u, - 0xcc3be185u, - 0xf091c2f3u, - 0x1072c022u, - 0xf0910400u, - 0x500b068u, - 0x2303ad08u, - 0xac0af05du, - 0xc0311270u, - 0xc0312e10u, - 0x126c2e0cu, - 0x4000510u, - 0xad80ac92u, - 0xf05df091u, - 0x4000a19fu, - 0xa054c020u, - 0xf239b472u, - 0x100u, - 0xc030f091u, - 0x8c4f091u, - 0xc23dad39u, - 0xac00f19du, - 0xf0912e00u, - 0x103u, - 0xc82d0000u, - 0x140ca21u, - 0x9fb72e84u, - 0xcf37ca35u, - 0x2e882e94u, - 0x600ad38u, - 0xacdef01du, - 0xf091cf08u, - 0xf09104f0u, - 0x92281049u, - 0x8220cf18u, - 0xf091c188u, - 0xf091ad43u, - 0xacd6f05du, - 0x14480000u, - 0x1000400u, - 0x500ad31u, - 0xac92f01du, - 0xf091cf08u, - 0xf09104f0u, - 0x92280000u, - 0x8220cf18u, - 0xf091c188u, - 0xf091ad43u, - 0xacd6f05du, - 0x14480000u, - 0x1000400u, - 0x500ad31u, - 0xac92f01du, - 0xf0912a08u, - 0x4002a100u, - 0xa0000604u, - 0x7000400u, - 0x580c080u, - 0xf0918038u, - 0xe1232948u, - 0xc1a0f239u, - 0xc022f091u, - 0xc131e195u, - 0x294ac0a2u, - 0xf091c131u, - 0xe18bf091u, - 0xad32aca8u, - 0xf01df091u, - 0xdf77e111u, - 0xd281ad32u, - 0xac62f19du, - 0x10408170u, - 0xf01d5048u, - 0xad38ac0au, - 0xf01df091u, - 0xf135c03eu, - 0xf091ffafu, - 0xb670ad7au, - 0xaceaf05du, - 0xf091c1a6u, - 0xf439f135u, - 0xf0afc02eu, - 0xf091c1b6u, - 0xf091f031u, - 0xc124f091u, - 0xc130f091u, - 0xc184f091u, - 0xc190f091u, - 0xc924f091u, - 0xc930f091u, - 0xc9a4f091u, - 0xc9b0f091u, - 0xcd24f091u, - 0xcd30f091u, - 0xad39ac00u, - 0xf01df091u, - 0xf135c03eu, - 0xf091ffafu, - 0xc188f091u, - 0xad69acceu, - 0xf05d1448u, - 0xf0afc02eu, - 0xf091f431u, - 0xad38ac6eu, - 0xf01df091u, - 0x2a1080a8u, - 0x8128e189u, - 0x848013u, - 0xe28bf091u, - 0xad38ac5au, - 0xf01df091u, - 0xcfa8f091u, - 0xc021e18fu, - 0xf091c008u, - 0xf0911148u, - 0x8020e18bu, - 0xf091ad38u, - 0xac32f01du, - 0xf091ce28u, - 0xf091c021u, - 0xad33acdcu, - 0xf11df091u, - 0x2000304u, - 0xc111b068u, - 0x40005140u, - 0xc288f091u, - 0x8038e105u, - 0x1u, - 0xc090f091u, - 0xc0c8f091u, - 0xc0d0f091u, - 0x2a8c0384u, - 0x2408113u, - 0xe205104bu, - 0x104ab270u, - 0x31482082u, - 0xf0915c6cu, - 0x5e6e3148u, - 0x208101f0u, - 0xe50d101fu, - 0x80a8e187u, - 0xf091e075u, - 0xf0918d13u, - 0xe21bf091u, - 0xe117f091u, - 0x114a8030u, - 0xd081cc07u, - 0xc031c80du, - 0xad33ac8eu, - 0xf01df091u, - 0xad38ac6eu, - 0xf01df091u, - 0x2a8cc288u, - 0xf0918038u, - 0xe1050200u, - 0x201f0c8u, - 0xf0910011u, - 0x1052e00u, - 0x1ffu, - 0x2ff03ffu, - 0x2e045c6cu, - 0x5e6e2108u, - 0x208101f0u, - 0xe50d101fu, - 0x80a8e187u, - 0xf091e075u, - 0xf091ad38u, - 0xac6ef01du, - 0xf0912a10u, - 0x80a88128u, - 0xe189001cu, - 0x8013e28bu, - 0xf091ad38u, - 0xac5af01du, - 0xf0910002u, - 0x158ea87u, - 0x41000002u, - 0x140b268u, - 0x2a8c001cu, - 0x31482082u, - 0xf0915c6cu, - 0x5e6e3148u, - 0x208101f0u, - 0xe50d101fu, - 0x80a8e187u, - 0xf091e075u, - 0xf091ad38u, - 0xac6ef01du, - 0xf091d188u, - 0xf0918071u, - 0xe10bf091u, - 0xad38ac32u, - 0xf01df091u, - 0x28079e70u, - 0xad37ace2u, - 0xf41df091u, - 0xc031c234u, - 0xf091c2b4u, - 0xf091ad7au, - 0xac30f05du, - 0xf091c021u, - 0xad37acbau, - 0xf11df631u, - 0xb2762140u, - 0x2043f091u, - 0xc1b6f935u, - 0xcd34f937u, - 0x282b2867u, - 0x80b0e197u, - 0x282a2866u, - 0x80b0e18fu, - 0x28292865u, - 0x80b0e187u, - 0xf091cdb4u, - 0xf937ea85u, - 0x310011u, - 0xc096f091u, - 0xc0310200u, - 0x340b076u, - 0xd181c730u, - 0xf0912806u, - 0x28651468u, - 0x29e6ad4eu, - 0xacf6f05du, - 0xf091c021u, - 0xe10bf091u, - 0xad37ac90u, - 0xf01df091u, - 0xc136f931u, - 0xcea8f091u, - 0xc171ceb8u, - 0xf0912302u, - 0xc031c533u, - 0x2e282e20u, - 0x2c260001u, - 0x2c272303u, - 0x29102952u, - 0x23022e34u, - 0x23032806u, - 0x23022c06u, - 0xad48ac84u, - 0xf05df091u, - 0xf0d1f091u, - 0xd188f091u, - 0x8071e10bu, - 0xf091ad38u, - 0xac32f01du, - 0xf0912807u, - 0x9f70ad37u, - 0xace2f41du, - 0xf091ad36u, - 0xac12f01du, - 0x282dd188u, - 0xf0918071u, - 0xe10bf091u, - 0xad38ac32u, - 0xf01df091u, - 0x28079f70u, - 0xad37ace2u, - 0xf41df091u, - 0x282d0180u, - 0x22084a8u, - 0xad36ac12u, - 0xf19d8928u, - 0xad36ac12u, - 0xf11df091u, - 0xad7aac30u, - 0xf05df091u, - 0xc021ad37u, - 0xacbaf11du, - 0xf631b276u, - 0x21402043u, - 0xf091c1b6u, - 0xf935cd34u, - 0xf937ea85u, - 0x310011u, - 0xc096f091u, - 0xc0310200u, - 0x340b076u, - 0xd181c730u, - 0xf0912806u, - 0x28651468u, - 0x29e6ad4eu, - 0xacf6f05du, - 0xf091c021u, - 0xe199f091u, - 0xc136f931u, - 0xcea8f091u, - 0xc171ceb8u, - 0xf091ad36u, - 0xac92f01du, - 0xf091ad37u, - 0xac90f01du, - 0xc0310180u, - 0x8029e187u, - 0x2934e005u, - 0xf0912936u, - 0xf631ad38u, - 0xac0ac086u, - 0xf0918038u, - 0x621f11du, - 0x14482934u, - 0xd8a6f091u, - 0xc033062cu, - 0xf19d2936u, - 0xd926f091u, - 0xf19d0637u, - 0xd1a6f091u, - 0xc523e189u, - 0x1074813cu, - 0xe127c031u, - 0x132u, - 0xd4875143u, - 0x400053eu, - 0xc022f091u, - 0xc021e109u, - 0xf091f231u, - 0xe073d683u, - 0xc032f935u, - 0xf0d1f091u, - 0xc0d6f091u, - 0xf135c1b6u, - 0xf091c086u, - 0xf0918438u, - 0xad37acceu, - 0xf11df091u, - 0xc124f091u, - 0xc439ad37u, - 0xac36f11du, - 0xf091287du, - 0x280b0u, - 0xe18700b5u, - 0x1018921u, - 0xb2765143u, - 0x160u, - 0xd483c224u, - 0xf091d2a4u, - 0xf091c132u, - 0xf091d1b2u, - 0xf091ce24u, - 0xf091dea4u, - 0xf091c032u, - 0xf091d0b2u, - 0xf091c031u, - 0xc232f091u, - 0xc2b2f091u, - 0xce34f091u, - 0xceb4f091u, - 0xc234f091u, - 0xc2b4f091u, - 0xc533c031u, - 0x23022e18u, - 0x11411272u, - 0x2e080200u, - 0x324c585u, - 0x11422d44u, - 0x2c43c126u, - 0xf8390005u, - 0xc914f091u, - 0xc184f091u, - 0x200030cu, - 0x640ad51u, - 0xac58f05du, - 0xf091ad54u, - 0xac2af05du, - 0xf091f0d1u, - 0xf091283du, - 0x28862302u, - 0x10184b0u, - 0xe19b0303u, - 0x8db2e195u, - 0xf091f137u, - 0x2d220055u, - 0x1582d20u, - 0xc031c533u, - 0xe009f091u, - 0xc031c533u, - 0x2e202e28u, - 0x2c260001u, - 0x2c27c224u, - 0xf091d2a4u, - 0xf0912e34u, - 0xc031c234u, - 0xf091c2b4u, - 0xf091c184u, - 0xf0912c06u, - 0xad48ac84u, - 0xf05df091u, - 0xf0d1f091u, - 0xc03ef935u, - 0xffaff137u, - 0xad7aac96u, - 0xf05df091u, - 0xf0afc02eu, - 0xf4390000u, - 0x1000200u, - 0x327ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x322ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x329ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x321ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x328ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x323ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x320ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x311ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x327ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x313ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x300ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x1000200u, - 0x325ad38u, - 0xac96f05du, - 0xf091f0d1u, - 0xf0912e0cu, - 0xb27408c4u, - 0xf091c23du, - 0xad39ac00u, - 0xf19df091u, - 0x2e000000u, - 0x103c82du, - 0x140u, - 0xca219fb7u, - 0x2e84c13du, - 0xe111ca35u, - 0x124u, - 0xc0852224u, - 0x21182002u, - 0xf091cf37u, - 0x2e882e90u, - 0x2e940600u, - 0xcea8f091u, - 0x2d220001u, - 0x110c533u, - 0xe124f091u, - 0xc23de195u, - 0x2e3c8030u, - 0xc33de105u, - 0x10184b1u, - 0xad2dacacu, - 0xf05d104eu, - 0xf135c021u, - 0xe187f091u, - 0xf0d1f091u, - 0xdfa4f091u, - 0xf433ad78u, - 0xac9cf05du, - 0x4100e065u, - 0xf091101fu, - 0x1f084a8u, - 0x10084b0u, - 0xe193f091u, - 0xad29ac60u, - 0xf05df091u, - 0xad39ac7cu, - 0xf01df091u, - 0x10284b0u, - 0xe193f091u, - 0xad29ac64u, - 0xf05df091u, - 0xad39ac7cu, - 0xf01df091u, - 0x10184b0u, - 0xe193f091u, - 0xad7cac5eu, - 0xf05df091u, - 0xad39ac7cu, - 0xf01df091u, - 0x10384b0u, - 0xe18bf091u, - 0xad7cac62u, - 0xf05df091u, - 0xea850b01u, - 0xb000c01u, - 0x5600f0d1u, - 0xf0910000u, - 0x108ad3au, - 0xac66b076u, - 0xd081c0a0u, - 0xf091c021u, - 0xf19df091u, - 0x4000a1a2u, - 0xa000ea87u, - 0x4000a1a1u, - 0xa0f0ad3au, - 0xac6ad020u, - 0xf091c523u, - 0xf11df233u, - 0x2910b472u, - 0x2000324u, - 0xd985e224u, - 0xf0918034u, - 0xe117f091u, - 0xd022f091u, - 0xc523f11du, - 0xf2334200u, - 0xa539a4bcu, - 0xf015f091u, - 0xba72f522u, - 0xf091c0a2u, - 0xf091c021u, - 0xf11df431u, - 0xd622f091u, - 0xdf73d632u, - 0xf091de36u, - 0xf091c424u, - 0xf091df71u, - 0xc434f091u, - 0xc341b274u, - 0x2000314u, - 0xd483d583u, - 0xb0760000u, - 0x108d081u, - 0xc022f091u, - 0xc030f091u, - 0xc0a2f091u, - 0xc0b0f091u, - 0xc122f091u, - 0xc130f091u, - 0xc1a2f091u, - 0xc1b0f091u, - 0xfcb6f091u, - 0x88c092u, - 0xf091c424u, - 0xf091c021u, - 0xe195f091u, - 0xb27ac2f3u, - 0xb07ac6f1u, - 0xf01ad78u, - 0xac9cf05du, - 0x4100f0d1u, - 0xf091ad3au, - 0xac66c031u, - 0xf01df091u, - 0x2a9cb276u, - 0x10cu, - 0xd483c022u, - 0xf091d0a2u, - 0xf091c703u, - 0xc2092e2cu, - 0xcca6f091u, - 0xdd26f091u, - 0x2a9cc713u, - 0x4080500u, - 0x2daac115u, - 0xe405f091u, - 0x2d6a292au, - 0xf1372d34u, - 0x3a01d4u, - 0x2d32c328u, - 0xf0910200u, - 0x31cc101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xad29ac0eu, - 0xf05d2d28u, - 0xf0d1f091u, - 0xad11ac66u, - 0xf01df091u, - 0x2303ad08u, - 0xac0af05du, - 0xc031c226u, - 0xf0912d12u, - 0x101u, - 0x2d10cfa6u, - 0xf0912d20u, - 0xce26f091u, - 0x80302d22u, - 0xc128f091u, - 0x2000382u, - 0xc1212d04u, - 0x32c06u, - 0x2012c87u, - 0xca350600u, - 0x7002e8cu, - 0xb2760000u, - 0x112d483u, - 0x22242118u, - 0x2002f091u, - 0x10110u, - 0x2000300u, - 0x2e3cf0d1u, - 0xf091298eu, - 0x29582814u, - 0x84b1c505u, - 0xc1010200u, - 0x307c129u, - 0xc141f0d1u, - 0xf091ad3cu, - 0xac78f05du, - 0xf091ad38u, - 0xac82ca25u, - 0xf19df091u, - 0xad77acd4u, - 0xf05d4100u, - 0xa3a2a200u, - 0x4000a1a2u, - 0xa004ea8bu, - 0x4100a3a1u, - 0xa2f0a1a1u, - 0xa0f40f00u, - 0xf091f231u, - 0xba72f323u, - 0x220c2134u, - 0x2003f091u, - 0xc533d0bau, - 0xf091d13au, - 0xf091d1bau, - 0xf091ad38u, - 0xac6ef01du, - 0xf091ad3cu, - 0xac78f05du, - 0xf091ca25u, - 0xe187ad38u, - 0xac82f01du, - 0xf635b276u, - 0xc2f3b076u, - 0xc6f1d020u, - 0xf091c523u, - 0xe113f091u, - 0xf01f091u, - 0xad78ac9cu, - 0xf05d4100u, - 0xe05ff091u, - 0xa3a2a200u, - 0x4000a1a2u, - 0xa004ea8du, - 0x4100a3a1u, - 0xa2f04000u, - 0xa1a1a0f4u, - 0xc022f091u, - 0xc021e12bu, - 0xc221e10bu, - 0xf091ad3bu, - 0xacf8f01du, - 0xf231d020u, - 0xf091df73u, - 0xd030f091u, - 0xf031d020u, - 0xf091d032u, - 0xf091ad78u, - 0xac9cf05du, - 0x4100ad38u, - 0xac6ef01du, - 0xf091ad3cu, - 0xac78f05du, - 0xf091ad38u, - 0xac82ca25u, - 0xf11df635u, - 0xad77acd4u, - 0xf05d4100u, - 0xb276c2f3u, - 0xb076c6f1u, - 0xf00f091u, - 0xf231f323u, - 0x220c2134u, - 0x2003f091u, - 0x2910d626u, - 0xf091c101u, - 0xc636f091u, - 0xad38ac6eu, - 0xf01df091u, - 0xa3a2a200u, - 0x4000a1a2u, - 0xa004ea8bu, - 0x4100a3a1u, - 0xa2f0a1a1u, - 0xa0f4ad3cu, - 0xacd8e022u, - 0xf091ca25u, - 0xf11df091u, - 0x294cad3cu, - 0xacbef635u, - 0xc326f091u, - 0xc131f19du, - 0xf091c3a6u, - 0xf09129ceu, - 0xad3cacd4u, - 0xc331f11du, - 0xf091ad3cu, - 0xacd8e026u, - 0xf091ca25u, - 0xf11df091u, - 0xad3cac9eu, - 0xf01df091u, - 0xf0d1ca25u, - 0xf0d1ca25u, - 0xad07ac34u, - 0x3d0130u, - 0xc03cf091u, - 0x4400a9a1u, - 0xa870e017u, - 0xb01ad07u, - 0xac30003du, - 0x140c03cu, - 0xf0914400u, - 0xa9a1a830u, - 0xb002702u, - 0x6a006b00u, - 0x100u, - 0xcb38f091u, - 0x13cu, - 0xcbb8f091u, - 0xad62acdeu, - 0xf05df091u, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xcba8f091u, - 0xdb28f091u, - 0xdf71e113u, - 0x2701e207u, - 0xdf73db38u, - 0xf091cbb8u, - 0xf091f0d1u, - 0x2702cbb8u, - 0xf091c523u, - 0xe107f091u, - 0xf0d12702u, - 0xad3eac7au, - 0xcf08f091u, - 0x11384a8u, - 0xf19df091u, - 0x80f101cu, - 0x17080a8u, - 0x80b0e193u, - 0xf091ad3cu, - 0xacdcfa9du, - 0xf091ad3cu, - 0xacf2f01du, - 0xf091ad3eu, - 0xac00100bu, - 0x8238f11du, - 0x4ca98u, - 0xf0910000u, - 0x108cbb8u, - 0xf0916a00u, - 0x6b002702u, - 0xad07ac30u, - 0xea8d003du, - 0x1f0c03cu, - 0xf091f0d1u, - 0xf091003du, - 0x1e0c13cu, - 0xf091f0d1u, - 0xf0910000u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xad3dac74u, - 0xf01d2701u, - 0x1ca98u, - 0xf0910000u, - 0x101cbb8u, - 0xf0916a00u, - 0x6b002702u, - 0xad07ac30u, - 0xea8d003eu, - 0x150c03cu, - 0xf091f0d1u, - 0xf091003eu, - 0x140c13cu, - 0xf091f0d1u, - 0xf0910000u, - 0x0u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0x100b8238u, - 0xe10bf091u, - 0xad3dac74u, - 0xf01df091u, - 0xcba8f091u, - 0xdf71cbb8u, - 0xf091e107u, - 0x2701f0d1u, - 0x27020000u, - 0x108cbb8u, - 0xf0916a00u, - 0x6b002702u, - 0xcf08f091u, - 0x11384a8u, - 0xe1050210u, - 0x218010fu, - 0x80a88120u, - 0x11481c48u, - 0x5300ad08u, - 0xac02f05du, - 0xf091100bu, - 0x1148ad07u, - 0xac30ea8du, - 0x3e01e0u, - 0xc03cf091u, - 0xf0d1f091u, - 0x3e01d0u, - 0xc13cf091u, - 0xf0d1f091u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xcf08f091u, - 0x11384a8u, - 0xe197f091u, - 0x100b0102u, - 0x84a8e18du, - 0xf0914000u, - 0xa13da074u, - 0xf011f091u, - 0xcba8f091u, - 0xdf71cbb8u, - 0xf091e107u, - 0x2701f0d1u, - 0x27020002u, - 0xca98f091u, - 0x103u, - 0xcbb8f091u, - 0xcf08f091u, - 0x11384a8u, - 0xe1050200u, - 0x208010fu, - 0x80a88120u, - 0x11481c48u, - 0x5300ad08u, - 0xac02f05du, - 0xf091100bu, - 0x11480c01u, - 0x5e000c01u, - 0x5800ad08u, - 0xac02f05du, - 0xf0910c00u, - 0x5800ad08u, - 0xac02f05du, - 0xf0910c04u, - 0x5800ad08u, - 0xac02f05du, - 0xf091ad07u, - 0xac30ea8du, - 0x3f01b0u, - 0xc03cf091u, - 0xf0d12702u, - 0x3f01a0u, - 0xc13cf091u, - 0xf0d12702u, - 0x0u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xcf08f091u, - 0x11384a8u, - 0xe197f091u, - 0x100b0102u, - 0x84a8e18du, - 0xf0914000u, - 0xa13da074u, - 0xf011f091u, - 0xcba8f091u, - 0xdf71cbb8u, - 0xf091e107u, - 0x2701f0d1u, - 0x2702ad45u, - 0xacd4f05du, - 0xf0912604u, - 0xc025e00u, - 0x105u, - 0xcbb8f091u, - 0x3ca98u, - 0xf091ad07u, - 0xac30ea8du, - 0x400140u, - 0xc03cf091u, - 0xf0d12702u, - 0x400130u, - 0xc13cf091u, - 0xf0d12702u, - 0x0u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xcf08f091u, - 0x11384a8u, - 0xe197f091u, - 0x100b0102u, - 0x84a8e00du, - 0xf0914000u, - 0xa13da074u, - 0xf011f091u, - 0x1022c239u, - 0xad40ac98u, - 0xf11d2701u, - 0x48004904u, - 0xad08ac02u, - 0xf05df091u, - 0x1022cba8u, - 0xf091df71u, - 0xcbb8f091u, - 0xad3dac74u, - 0xf11df091u, - 0xf0d12702u, - 0xca98u, - 0xf091ad63u, - 0xac08f01du, - 0xf0910826u, - 0x103c1022u, - 0x140dad8u, - 0xf0910006u, - 0xc198f091u, - 0xc031c238u, - 0xf0910000u, - 0x1fd7a68u, - 0x9ca98u, - 0xf0916c00u, - 0x6d002700u, - 0xad07ac30u, - 0xea8d0041u, - 0x100c03cu, - 0xf091f0d1u, - 0x27000040u, - 0x1f0c13cu, - 0xf091f0d1u, - 0x27000000u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xc228f091u, - 0x12220400u, - 0x5fcc62bu, - 0xc131ad42u, - 0xac6af19du, - 0xf091f0d1u, - 0xf091c031u, - 0xc238f091u, - 0x1f8u, - 0x7a68000au, - 0xca98f091u, - 0x6c006d00u, - 0xad07ac30u, - 0xea8d0041u, - 0x170c03cu, - 0xf091f0d1u, - 0x27000041u, - 0x160c13cu, - 0xf091f0d1u, - 0x27000000u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xc228f091u, - 0x12220400u, - 0x5fcc62bu, - 0xc131ad42u, - 0xac6af19du, - 0xf091f0d1u, - 0xf0911022u, - 0x480e49fcu, - 0xad08ac02u, - 0xf05df091u, - 0x1022c031u, - 0xc238f091u, - 0xc8d8f091u, - 0xcf08f091u, - 0x11384a8u, - 0xc001fcu, - 0xe107f091u, - 0x1fcu, - 0x7a68000bu, - 0xca98f091u, - 0xc198u, - 0xf0914100u, - 0xa302a280u, - 0x4200a502u, - 0xa480e028u, - 0xf091f0a8u, - 0xf091ad4eu, - 0xac12f05du, - 0xf0910000u, - 0x105cfb8u, - 0xf091ad4bu, - 0xacc4f05du, - 0xf0912605u, - 0x6c806d00u, - 0xad07ac30u, - 0xea8d0042u, - 0x130c03cu, - 0xf091f0d1u, - 0x27000042u, - 0x120c13cu, - 0xf091f0d1u, - 0x27000000u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xcf08f091u, - 0x11384a8u, - 0x47005fcu, - 0xe107f091u, - 0x40005fcu, - 0x100b1148u, - 0x80501222u, - 0x8822c228u, - 0xf091c62bu, - 0xc131ad45u, - 0xac06f19du, - 0xf091f0d1u, - 0xf091c33bu, - 0xe1234800u, - 0x49080000u, - 0x110ad47u, - 0xac2af05du, - 0xf091c228u, - 0xf0911222u, - 0x40005f4u, - 0xc62bc531u, - 0xf0d1f091u, - 0xd238f091u, - 0xc23be19du, - 0x7c53bu, - 0xe1970002u, - 0xc43be191u, - 0x3c73bu, - 0xe18b0005u, - 0xc63be185u, - 0x60004u, - 0xd03ef091u, - 0xffaff188u, - 0xf091144bu, - 0x8f438d80u, - 0x8932a143u, - 0xa08e4000u, - 0x4100d581u, - 0xf002f091u, - 0x154bf198u, - 0xf0918f43u, - 0xd581c042u, - 0xf0911c48u, - 0x5900f0afu, - 0xd02ef091u, - 0x11489224u, - 0xe11bf091u, - 0x96a5e115u, - 0xf091c23bu, - 0xe10bf091u, - 0xad3dac74u, - 0xf01df091u, - 0xf0d1f091u, - 0x9224e18fu, - 0xf091ad43u, - 0xacd6f05du, - 0xf091f0d1u, - 0xf091ad45u, - 0xacd4f05du, - 0xf0910200u, - 0x310ad43u, - 0xac40f05du, - 0xf0912605u, - 0xad41ac22u, - 0xf05df091u, - 0xf0d1f091u, - 0xd03ef091u, - 0xffaf2303u, - 0xad08ac0au, - 0xf05dc031u, - 0xf0afd02eu, - 0xf091c031u, - 0x2e0c0000u, - 0x101ea87u, - 0xf0910000u, - 0x1000201u, - 0x300c521u, - 0x2d44cea8u, - 0xf0912d22u, - 0x10110u, - 0xc5332e3cu, - 0xad2dacacu, - 0xf05d0001u, - 0xea852301u, - 0x2300f0d1u, - 0xf0910000u, - 0x2030007u, - 0x4050104u, - 0x2030107u, - 0x4050206u, - 0x2030007u, - 0x4050300u, - 0x2030007u, - 0x4050402u, - 0x2040407u, - 0x4050508u, - 0x5050507u, - 0x4050602u, - 0x2060607u, - 0x4080704u, - 0x2030707u, - 0x4080808u, - 0x5050807u, - 0x408ad00u, - 0xac54c02cu, - 0xf091c171u, - 0xc03cf091u, - 0x7c198u, - 0xf0910004u, - 0xca98f091u, - 0xad69acb4u, - 0xf05df091u, - 0xea8df091u, - 0xad3cacf2u, - 0xf05df091u, - 0xe009ad3cu, - 0xacdcf05du, - 0xf0910c02u, - 0x5600e907u, - 0xf091e07bu, - 0xf091ad45u, - 0xacd4f05du, - 0xf0916202u, - 0xc015800u, - 0xad08ac02u, - 0xf05df091u, - 0xc005600u, - 0x26040c02u, - 0x5e000000u, - 0x8230ad44u, - 0xac8cf19du, - 0xf0910200u, - 0x311ad43u, - 0xac40f05du, - 0xf091ad55u, - 0xac7af05du, - 0xf091ad59u, - 0xac4cf05du, - 0xf091ad46u, - 0xac7ef05du, - 0xf091100bu, - 0x8238e113u, - 0xf0910000u, - 0x108ad47u, - 0xac2af05du, - 0xf091e015u, - 0xf0910026u, - 0xc8d8f091u, - 0xe00bf091u, - 0xad55ac7au, - 0xf05df091u, - 0xc005800u, - 0xad08ac02u, - 0xf05df091u, - 0xcf71200u, - 0xcf71300u, - 0xc205900u, - 0xad08ac02u, - 0xf05df091u, - 0xad08ac02u, - 0xf05df091u, - 0xc005900u, - 0xad08ac02u, - 0xf05df091u, - 0xc015c00u, - 0xc0d5d00u, - 0xcf08f091u, - 0x11384a8u, - 0xe1050200u, - 0x208010fu, - 0x80a88120u, - 0x11481c48u, - 0x5300ad08u, - 0xac02f05du, - 0xf091100bu, - 0x11480c04u, - 0x5800ad08u, - 0xac02f05du, - 0xf091f0d1u, - 0xf0910826u, - 0x103c100bu, - 0x1148c23bu, - 0xe18bc33bu, - 0xad42ac6eu, - 0xf19df091u, - 0xd238f091u, - 0xc188f091u, - 0x8020e18fu, - 0xf091ad43u, - 0xacd6f05du, - 0x1468f0d1u, - 0xf091ad3du, - 0xac74f01du, - 0xf091ad07u, - 0xac30ea95u, - 0xf0910045u, - 0x190c03cu, - 0xf0914400u, - 0xa9a1a830u, - 0xe011f091u, - 0x450180u, - 0xc13cf091u, - 0x4400a9a1u, - 0xa8700006u, - 0xca98f091u, - 0xc025800u, - 0x6a006b00u, - 0x6c006d00u, - 0xf0d12702u, - 0x0u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0xe88d0101u, - 0x80e101cu, - 0x84b0e107u, - 0xf091f0d1u, - 0x2702c2c8u, - 0xf0910008u, - 0x1c485c00u, - 0xc065800u, - 0xcac8f091u, - 0x14080b0u, - 0xe10bf091u, - 0xad41ac92u, - 0xf01df091u, - 0xad41ac22u, - 0xf01df091u, - 0xad46ac4au, - 0xf05df091u, - 0xc015e00u, - 0x6301ad08u, - 0xac02f05du, - 0xf0916300u, - 0xad08ac02u, - 0xf05df091u, - 0x48ff49ffu, - 0x6304ad08u, - 0xac02f05du, - 0xf0916318u, - 0xc005e00u, - 0x2000304u, - 0xd338f091u, - 0x8c898u, - 0xf0910000u, - 0xc1d8f091u, - 0x8030c2d8u, - 0xf0910c01u, - 0x5c000000u, - 0x104c938u, - 0xf0910000u, - 0x102c9b8u, - 0xf0910826u, - 0x103c48ffu, - 0x49ff0c90u, - 0x5200f091u, - 0xf091f0d1u, - 0xf091c031u, - 0xc5332e28u, - 0x2e2c2d2au, - 0x2d322d36u, - 0x2d30b234u, - 0x4100f133u, - 0x22282110u, - 0x2003f091u, - 0x6201ad08u, - 0xac02f05du, - 0xf091ad08u, - 0xac02f05du, - 0xf091f0d1u, - 0xf0914202u, - 0xa500a400u, - 0x6040700u, - 0x4000580u, - 0xea850220u, - 0x200c084u, - 0xf0918038u, - 0xe10df091u, - 0x12080a8u, - 0x8130e117u, - 0xf091df77u, - 0xe10dda85u, - 0xe1e51042u, - 0x8170e05fu, - 0x5248f0d1u, - 0xf091c084u, - 0xf09101bfu, - 0x80a8c094u, - 0xf091c124u, - 0xf091c021u, - 0xe113f031u, - 0xc1a0f091u, - 0xcf39e109u, - 0xf091c031u, - 0xc134f091u, - 0xf135c03eu, - 0xf091ffafu, - 0xd03ef091u, - 0xffafe03eu, - 0xf091ffafu, - 0xf03ef091u, - 0xffafc031u, - 0x2000311u, - 0xad7bac6eu, - 0xf05df091u, - 0xf0aff02eu, - 0xf091f0afu, - 0xe02ef091u, - 0xf0afd02eu, - 0xf091f0afu, - 0xc02ef091u, - 0xf431ad46u, - 0xaca6f01du, - 0xf091a102u, - 0xa058ea87u, - 0x4000a102u, - 0xa040d081u, - 0xc020f091u, - 0xd0a0f091u, - 0xc173c079u, - 0xc030f091u, - 0xd0b0f091u, - 0xf0d1f091u, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0x4000a100u, - 0xa0c0e011u, - 0xb010000u, - 0x0u, - 0x4000a100u, - 0xa0800b00u, - 0xc820f091u, - 0xca20f091u, - 0xc021ad47u, - 0xace0f11du, - 0xf0910000u, - 0x128d081u, - 0xb2705140u, - 0xc4f1c0f3u, - 0xf01f091u, - 0xf431c724u, - 0xf091c021u, - 0xe10bc031u, - 0xc734f091u, - 0xe00df091u, - 0xf135ad78u, - 0xac9cf05du, - 0x4100c624u, - 0xf091c021u, - 0xe10bbc68u, - 0xc6a4f091u, - 0xf05df091u, - 0xad47ac78u, - 0xa100a0c0u, - 0xfa9d4000u, - 0xa100a080u, - 0xf01df091u, - 0xc820f091u, - 0xc021ad48u, - 0xac34f11du, - 0xf0910208u, - 0x3004200u, - 0xa59fa438u, - 0xc024f091u, - 0xc511f29du, - 0x120u, - 0xd081b270u, - 0x5140c4f1u, - 0xc0f3c020u, - 0xf091df71u, - 0xe193f091u, - 0xf01f091u, - 0xad78ac9cu, - 0xf05d4100u, - 0xe00ff091u, - 0x8c1ad78u, - 0xacb8f05du, - 0xf09108c2u, - 0xf0d1610au, - 0x296eb06au, - 0x2965504bu, - 0x9f71e439u, - 0x9f70e419u, - 0xf2212d30u, - 0xb2702238u, - 0x21082002u, - 0xf0911340u, - 0x2ce51270u, - 0xf0d12d6eu, - 0xdfa4f091u, - 0xf433b074u, - 0xc523e109u, - 0x5ccf1u, - 0xe05b2d30u, - 0xad7cacc0u, - 0xf05d00a3u, - 0xad7cacc0u, - 0xf05d00a4u, - 0xc1a6f439u, - 0xf1c4f091u, - 0x28668c93u, - 0x9f73e289u, - 0x84a1ad48u, - 0xac7cf41du, - 0xb074e10bu, - 0xf321f221u, - 0xf221e005u, - 0x2000202u, - 0x2d700400u, - 0x502114bu, - 0x8030ca01u, - 0x4100a39fu, - 0xa238f022u, - 0xf091ce17u, - 0xe28b2238u, - 0xad7cacc0u, - 0xf05d00a1u, - 0x2108b270u, - 0x2002f091u, - 0x11402c65u, - 0x12702d6eu, - 0x2aa8c325u, - 0xe12b2a3cu, - 0xcd17c81du, - 0xe211f091u, - 0x2ea8ad48u, - 0xac38f05du, - 0x2930e06du, - 0x2a3c2aa8u, - 0x2a38c703u, - 0xc2092e38u, - 0x2a3cc713u, - 0xc2192e3cu, - 0xee86f091u, - 0x8172ee96u, - 0xf0912827u, - 0x8020e117u, - 0x88520000u, - 0x124c085u, - 0x2d041342u, - 0x89232c83u, - 0x8030e017u, - 0x2c24b076u, - 0x112u, - 0xc0812d04u, - 0x13408923u, - 0x2c830004u, - 0x2c24ca35u, - 0x2d982db2u, - 0x2ab4c325u, - 0xe1af2a3cu, - 0x2932cab6u, - 0xf091c1a6u, - 0xf039c180u, - 0xf0910103u, - 0x80b0e195u, - 0xf0912802u, - 0x10284a8u, - 0xe18bf091u, - 0xad54ac2au, - 0xf05df091u, - 0xf0d1f091u, - 0xc517c01du, - 0xe20b2e8cu, - 0x2abc2e8cu, - 0xe0092e34u, - 0xc031c533u, - 0x2e342ab8u, - 0x2e88c121u, - 0x2e14e113u, - 0x28a4ad4au, - 0xaca8f01du, - 0x2ab42ab4u, - 0xcb25e185u, - 0x80300040u, - 0x89202c82u, - 0xc0312d00u, - 0x2d1cb076u, - 0x140d081u, - 0xc720f091u, - 0xc021e10fu, - 0x781ad77u, - 0xacd4f05du, - 0x4100e007u, - 0x780f137u, - 0x2d1c2a34u, - 0xc023e18du, - 0x2a20c021u, - 0xe107f091u, - 0x2e180781u, - 0x104f2c07u, - 0xb270b870u, - 0xc126f039u, - 0x2926c03eu, - 0xf091ffafu, - 0x2a0c2a94u, - 0xc507c209u, - 0xf2a0f091u, - 0xe115ca35u, - 0xc713c219u, - 0x2da629b2u, - 0xe10fc175u, - 0x2db2e071u, - 0x29a6c523u, - 0xe10d29b2u, - 0xc175c713u, - 0xe205f091u, - 0xe1f72db2u, - 0xf0afc02eu, - 0xf0912d26u, - 0x290e2956u, - 0xc5010003u, - 0x81a8e11du, - 0xf091e2a0u, - 0xf091df75u, - 0xc62b0000u, - 0x104c013u, - 0xe28bf091u, - 0xad52ac2au, - 0xf01df091u, - 0x22002120u, - 0x2003f091u, - 0x8c1f139u, - 0xb270ba70u, - 0xf121d020u, - 0xf091f123u, - 0xf4230f00u, - 0xc523e193u, - 0xf13bdfaau, - 0xf091b26au, - 0x4100b072u, - 0xf1210f10u, - 0xe0008c2u, - 0xad49ac50u, - 0xf01df091u, - 0xad48ac38u, - 0xf05d2930u, - 0x2a3cc517u, - 0xc01de40bu, - 0x2e942abcu, - 0x2e94e009u, - 0x2e34c031u, - 0xc5332e34u, - 0x2ab82e90u, - 0x29a40580u, - 0x92a4c121u, - 0xad49acaeu, - 0xf11d124cu, - 0x50292a4u, - 0x28a40321u, - 0x89a22ca4u, - 0xad48ac38u, - 0xf05d2930u, - 0xad49acaeu, - 0xf01d124cu, - 0xf0d1f091u, - 0x23022d1au, - 0x10702d18u, - 0x4100a39fu, - 0xa238e022u, - 0xf0910000u, - 0x102c211u, - 0xe40bf091u, - 0xad7cacc0u, - 0xf05d00a2u, - 0xb2760000u, - 0x112d483u, - 0x22202118u, - 0x2002f091u, - 0x2ce02df6u, - 0xcf372df4u, - 0x2dc02ddcu, - 0x2dcc2dceu, - 0x2c2c02u, - 0x2c86b076u, - 0x140u, - 0xd081c720u, - 0xf091c021u, - 0xe10f0381u, - 0xad77acd4u, - 0xf05d4100u, - 0xe0070380u, - 0xf1372d1cu, - 0x2918c021u, - 0xe105f091u, - 0x3812cc7u, - 0x120u, - 0xc0812d04u, - 0x10402c03u, - 0xb2702200u, - 0x21382003u, - 0xf091b270u, - 0xc126fa39u, - 0xcf2af039u, - 0x8c1f133u, - 0xb270ba70u, - 0xf121d020u, - 0xf091f023u, - 0xf4230f00u, - 0xc523e193u, - 0xf13bdfaau, - 0xf091b26au, - 0x4100b072u, - 0xf1210f10u, - 0xe0008c2u, - 0xf0d1f091u, - 0x2302c031u, - 0x14681668u, - 0xf631c0c8u, - 0xf0911748u, - 0x4000a1a0u, - 0xa0fac1d0u, - 0xf091c0d0u, - 0xf0910403u, - 0xad4eacf6u, - 0xf05df091u, - 0xb87000a0u, - 0x1fa2d04u, - 0x2002c83u, - 0xc0312d18u, - 0x2d002d1cu, - 0x2a10312u, - 0x1008030u, - 0x2e080200u, - 0x3100003u, - 0xad51ac58u, - 0xf05df091u, - 0xea852301u, - 0x2300f0d1u, - 0xf0912302u, - 0x2d1a1070u, - 0x2d180000u, - 0x124d483u, - 0x22202118u, - 0x2002f091u, - 0x812c20u, - 0x92c29u, - 0xff01ffu, - 0x2d32c031u, - 0x2d342d36u, - 0x2c282d2eu, - 0x2d002d1cu, - 0x2d0c2d0eu, - 0x402c02u, - 0x2c86b076u, - 0x140u, - 0xd081c720u, - 0xf091c021u, - 0xe10f0381u, - 0xad77acd4u, - 0xf05d4100u, - 0xe0070380u, - 0xf1372d1cu, - 0x2918c021u, - 0xe105f091u, - 0x3812cc7u, - 0x120u, - 0xc0812d04u, - 0xee86f091u, - 0x8172ee96u, - 0xf0918852u, - 0x10408120u, - 0x2c03b270u, - 0x22002138u, - 0x2003f091u, - 0xb270c126u, - 0xf03908c1u, - 0xf133b270u, - 0xba70f121u, - 0xd020f091u, - 0xf023f423u, - 0xf00c523u, - 0xe193f13bu, - 0xdfaaf091u, - 0xb26a4100u, - 0xb072f121u, - 0xf100e00u, - 0x8c20000u, - 0x101cab6u, - 0xf091c1a6u, - 0xf039c180u, - 0xf0910103u, - 0x80b0e18bu, - 0xf091ad54u, - 0xac2af05du, - 0xf091f0d1u, - 0xf0912302u, - 0x2c862d1au, - 0x10702d18u, - 0xb2760000u, - 0x112d483u, - 0x22202118u, - 0x2002f091u, - 0x842c20u, - 0x192c29u, - 0xff01ffu, - 0x2d32c031u, - 0x2d342d36u, - 0x2c282d2eu, - 0x2d1c2d00u, - 0x4100a39fu, - 0xa23ac8a6u, - 0xf091c132u, - 0xf0910200u, - 0x30c0080u, - 0x1002e0cu, - 0x12721141u, - 0x80302e08u, - 0x242c02u, - 0xb0760000u, - 0x140d081u, - 0xc720f091u, - 0xc021e10fu, - 0x381ad77u, - 0xacd4f05du, - 0x4100e007u, - 0x380f137u, - 0x2d1c2918u, - 0xc021e105u, - 0xf0910381u, - 0x2cc70000u, - 0x120c081u, - 0x2d04ee86u, - 0xf0918172u, - 0xee96f091u, - 0x88521040u, - 0x81202c03u, - 0xb2702200u, - 0x21382003u, - 0xf091b270u, - 0xc126f039u, - 0x8c1f133u, - 0xb270ba70u, - 0xf121d020u, - 0xf091f023u, - 0xf4230f00u, - 0xc523e193u, - 0xf13bdfaau, - 0xf091b26au, - 0x4100b072u, - 0xf1210f10u, - 0xe0008c2u, - 0x101u, - 0xcab6f091u, - 0x28060103u, - 0x80b0e18bu, - 0xf091ad54u, - 0xac2af05du, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf0910902u, - 0x4010000u, - 0x120d483u, - 0xd8850280u, - 0xc002f091u, - 0xd004f091u, - 0x89288929u, - 0xad4eac96u, - 0xf11df091u, - 0xf133c03eu, - 0xf091ffafu, - 0xad4eacf6u, - 0xf05df091u, - 0xc1a4f091u, - 0x2080300u, - 0xc511e407u, - 0xf0910008u, - 0x100c2b0u, - 0xf091c2a4u, - 0xf091c330u, - 0xf091f0afu, - 0xc02ef091u, - 0xf231c1a0u, - 0xf091cf39u, - 0xe1a5f091u, - 0x2800300u, - 0xc121c1b0u, - 0xf091f133u, - 0xc03ef091u, - 0xffafad4eu, - 0xacacf05du, - 0xf091f0afu, - 0xc02ef091u, - 0xf2310000u, - 0x110d483u, - 0xd8858174u, - 0xad4eac1eu, - 0xf59df091u, - 0xf0d1f091u, - 0x134cea8du, - 0x8d434100u, - 0xa39ea20eu, - 0xe00b8932u, - 0x4100a39eu, - 0xa2168932u, - 0xd583c022u, - 0xf091c021u, - 0xe18bf231u, - 0x105u, - 0xf0d1d021u, - 0x8bb68935u, - 0x31f8d2bu, - 0x8932c543u, - 0xd583c022u, - 0xf091c0b0u, - 0xf091c032u, - 0xf931f0d1u, - 0xc031134cu, - 0xea8d8d43u, - 0x4100a39eu, - 0xa20ee00bu, - 0x89324100u, - 0xa39ea216u, - 0x8932d583u, - 0xc022f091u, - 0xc021e18bu, - 0xf2310000u, - 0x105f0d1u, - 0xc0218bb6u, - 0x8935031fu, - 0x8d2b8932u, - 0xc543d583u, - 0xc022f091u, - 0xc021ad4fu, - 0xac6af11du, - 0xf031ad4fu, - 0xac5ece20u, - 0xf091dea0u, - 0xf091c733u, - 0xf19d86b1u, - 0xf19df091u, - 0xf131d220u, - 0xf091f0d1u, - 0xc031c0a0u, - 0xf091ad4fu, - 0xac36f01du, - 0xc021ad77u, - 0xacd4f05du, - 0x4100e18bu, - 0xba700000u, - 0x118f0d1u, - 0xf091b27au, - 0x21402043u, - 0xf091ad77u, - 0xacd4f05du, - 0x4100e18fu, - 0xb270ad78u, - 0xac9cf05du, - 0x4100e05bu, - 0xf091c23au, - 0xf0912140u, - 0x2043f091u, - 0xff01ffu, - 0xc030f091u, - 0xc0b0f091u, - 0xc130f091u, - 0xc1b0f091u, - 0xc230f091u, - 0xc2b0f091u, - 0xc330f091u, - 0xc3b0f091u, - 0xc430f091u, - 0xc4b0f091u, - 0xc530f091u, - 0xc5b0f091u, - 0xc630f091u, - 0xc6b0f091u, - 0xc730f091u, - 0xc7b0f091u, - 0x4400a9a1u, - 0xa870ea89u, - 0xf0914400u, - 0xa9a1a830u, - 0xcac8f091u, - 0x14080b0u, - 0xe131f091u, - 0x100u, - 0xc1baf091u, - 0x104d8026u, - 0xe119104fu, - 0xc068f091u, - 0x8035e18du, - 0xf091c0a8u, - 0xf0918036u, - 0xe105104fu, - 0xd0c8u, - 0xf091c3bau, - 0xf0918030u, - 0x114dce3au, - 0xf091febau, - 0xf0910000u, - 0x184c2bau, - 0xf0910000u, - 0x101c33au, - 0xf0910000u, - 0x1c8ea87u, - 0xf0910000u, - 0x188cfbau, - 0xf091104cu, - 0x9f70e12du, - 0x9f70e129u, - 0x9f70ad51u, - 0xac26f11du, - 0xf091c22au, - 0xf091ad78u, - 0xac9cf05du, - 0x4100f13bu, - 0xad78ac9cu, - 0xf05d4100u, - 0x105u, - 0xf0d1d031u, - 0xad77acd4u, - 0xf05d4100u, - 0xe1a1b270u, - 0xc22af091u, - 0xad78ac9cu, - 0xf05d4100u, - 0xf13bad78u, - 0xac9cf05du, - 0x41000000u, - 0x118f0d1u, - 0xd031cf3au, - 0xf0912140u, - 0x2043f091u, - 0xc1aaf091u, - 0x2000301u, - 0xc121c1bau, - 0xf0914400u, - 0xa9a1a870u, - 0xea89f091u, - 0x4400a9a1u, - 0xa830cac8u, - 0xf0910140u, - 0x80b0e111u, - 0xc031104fu, - 0xd0c8f091u, - 0xc3b0f091u, - 0x100u, - 0xc1b0f091u, - 0xc22af091u, - 0xc230f091u, - 0xcf30f93bu, - 0x1c0u, - 0xea87f091u, - 0x180u, - 0xcfb0f091u, - 0xb07af0d1u, - 0xc031b07au, - 0xf0d1c031u, - 0xcf24f091u, - 0xc021e10bu, - 0xf091ad78u, - 0xac9cf05du, - 0x4100c224u, - 0xf091ad78u, - 0xac9cf05du, - 0x4100f135u, - 0xad78ac9cu, - 0xf05d4100u, - 0xf0d1f091u, - 0x2c060080u, - 0x1002e0cu, - 0xf1372d1cu, - 0xc021e115u, - 0x381b076u, - 0x140u, - 0xd081c720u, - 0xf091c021u, - 0xe111f131u, - 0xc0312d1cu, - 0xad77acd4u, - 0xf05d4100u, - 0x3802918u, - 0xc021e105u, - 0xc0310381u, - 0x2cc72d00u, - 0x2d142d16u, - 0xf137c021u, - 0xe1050020u, - 0x104e2c02u, - 0xb2702200u, - 0x21202003u, - 0xf091b270u, - 0xb07808c1u, - 0xf133b270u, - 0xba70f121u, - 0xd020f091u, - 0xf023f423u, - 0xf00c523u, - 0xe193f13bu, - 0xdfaaf091u, - 0xb26a4100u, - 0xb072f121u, - 0xf100e00u, - 0x8c2f137u, - 0xc021e187u, - 0xf091f0d1u, - 0xf091c1c6u, - 0xf0910103u, - 0x80b0e11du, - 0x28020101u, - 0x84a80000u, - 0x101e109u, - 0xf091caa6u, - 0xf091c171u, - 0xcab6f091u, - 0xe013f091u, - 0x10284a8u, - 0xe18bf091u, - 0xad54ac2au, - 0xf05df091u, - 0xf0d1f091u, - 0xad52u, - 0xacda2a0cu, - 0xc021f19du, - 0x104u, - 0xc911f21du, - 0xf091ad53u, - 0xac4ef11du, - 0xf091ad52u, - 0xac28c03cu, - 0xf933fe2fu, - 0x2802c01eu, - 0xf0912918u, - 0xc09ef091u, - 0x291cc11eu, - 0xf0912807u, - 0xc19ef091u, - 0x802c07u, - 0xc0312d18u, - 0x2d1c2a14u, - 0xca350600u, - 0x704c713u, - 0xc2192e14u, - 0xad77acd4u, - 0xf05d4100u, - 0xb2702200u, - 0x21202003u, - 0xf091c00eu, - 0xf091017fu, - 0x80a80121u, - 0x80a02c02u, - 0xc0aef091u, - 0x2d18c12eu, - 0xf0912d1cu, - 0xc1aef091u, - 0x2c07f22fu, - 0x2a102a94u, - 0xc703c209u, - 0x2e08c031u, - 0xc5332e14u, - 0x3042e0cu, - 0xc02cf239u, - 0x22002120u, - 0x2003f091u, - 0xad53acb8u, - 0xf01dad52u, - 0xac28c03cu, - 0xf9332a0cu, - 0xca350600u, - 0x704c713u, - 0xc2192e0cu, - 0x2a08c703u, - 0xc2092e08u, - 0x2802c01eu, - 0xf0910121u, - 0x80a02c02u, - 0x22002120u, - 0x2003f091u, - 0xc00ef091u, - 0x13f80a8u, - 0x10280a0u, - 0x2c020080u, - 0x2c07ca35u, - 0x2d982d9cu, - 0xcf372e94u, - 0x7042e8cu, - 0x2a08c713u, - 0xc2192e08u, - 0xad77acd4u, - 0xf05d4100u, - 0xb2702200u, - 0x21202003u, - 0xf091ad53u, - 0xacb8f01du, - 0xf091ad52u, - 0xac28c03cu, - 0xf9332802u, - 0xc01ef091u, - 0x17f80a8u, - 0x12180a0u, - 0x2c022a14u, - 0x2e0c2a10u, - 0x2a882e08u, - 0x2e90c031u, - 0xc5332e14u, - 0x22002120u, - 0x2003f091u, - 0xc00ef091u, - 0x1c080a8u, - 0x10280a0u, - 0x2c02c031u, - 0x2d182d1cu, - 0x802c07u, - 0x2a102e08u, - 0xc031c533u, - 0x2e140304u, - 0x2e0cad77u, - 0xacd4f05du, - 0x4100b270u, - 0x22002120u, - 0x2003f091u, - 0xb870c126u, - 0xf03908c1u, - 0xf139b270u, - 0xba70f121u, - 0xd020f091u, - 0xf123f423u, - 0xf00c523u, - 0xe193f13bu, - 0xdfaaf091u, - 0xb26a4100u, - 0xb072f121u, - 0xf100e00u, - 0x8c2ad52u, - 0xac28c02cu, - 0xf839c126u, - 0xf03908c1u, - 0xf139b270u, - 0xba70f121u, - 0xd020f091u, - 0xf123f423u, - 0xf00c523u, - 0xe193f13bu, - 0xdfaaf091u, - 0xb26a4100u, - 0xb072f121u, - 0xf100e00u, - 0x8c2ad49u, - 0xac50f01du, - 0xf091c0c6u, - 0xf0918170u, - 0xc0d6f091u, - 0xc446f091u, - 0x10280a0u, - 0xc456f091u, - 0xc031cb36u, - 0xf091cbb6u, - 0xf091c1a6u, - 0xf439eb44u, - 0xf0912827u, - 0x8020e187u, - 0xf091e6c6u, - 0xf091803au, - 0xe1850200u, - 0x210c086u, - 0xf09101efu, - 0x80a88120u, - 0xc096f091u, - 0x8638e10fu, - 0xf0910000u, - 0x102cc36u, - 0xf091f0d1u, - 0xf091ff44u, - 0xf0910207u, - 0x8daa8932u, - 0xc5434100u, - 0xa354a2a4u, - 0xd583d022u, - 0xf091bc6au, - 0xf01df091u, - 0x5554550au, - 0x555454b4u, - 0x54ca54e2u, - 0x55545554u, - 0xc0c6f091u, - 0x9f70ad55u, - 0xac5af19du, - 0xc031cc36u, - 0xf091f0d1u, - 0xf091c6c6u, - 0xf0910110u, - 0x84a8ad55u, - 0xac5af19du, - 0xc031cc36u, - 0xf091f0d1u, - 0xf091c0c6u, - 0xf0910101u, - 0x84a8e107u, - 0x8170c0d6u, - 0xf091c6c6u, - 0xf0910110u, - 0x84a8ad55u, - 0xac5af19du, - 0xc031cc36u, - 0xf091f0d1u, - 0xf091d124u, - 0xf0910000u, - 0x110c129u, - 0xad55ac42u, - 0xf11df091u, - 0xc0c6f091u, - 0x9f70f19du, - 0xf091c224u, - 0xf091d2a4u, - 0xf0912302u, - 0x2e340400u, - 0x5000600u, - 0x700ad25u, - 0xacc4f01du, - 0x100c031u, - 0xcc36f091u, - 0xcb44f091u, - 0xc6d6f091u, - 0xf0d1f091u, - 0xf0d1f091u, - 0xf631c086u, - 0xf0914400u, - 0xa9a1a870u, - 0x8538e18bu, - 0xb014400u, - 0xa9a1a830u, - 0xb00ad27u, - 0xac68f01du, - 0xf091a500u, - 0xa4c0ea87u, - 0x4200a500u, - 0xa48008c1u, - 0x2000318u, - 0xd1855042u, - 0xb2705140u, - 0xc4f1c0f3u, - 0xc020f091u, - 0xc021e115u, - 0xf091c022u, - 0xf091c021u, - 0xe19df091u, - 0xad7cacc0u, - 0xf05d00a5u, - 0x108u, - 0xc413e2d1u, - 0xf091ad56u, - 0xac4af01du, - 0xf091f135u, - 0xc03ef091u, - 0xffafd03eu, - 0xf091ffafu, - 0xf11f091u, - 0xf4310200u, - 0x30cb074u, - 0x5042b270u, - 0x5140c4f1u, - 0x110u, - 0xd483d583u, - 0xc020f091u, - 0xc021e11bu, - 0xf091c022u, - 0xf091c021u, - 0xe1a7f091u, - 0x104u, - 0xc413ad55u, - 0xacdef29du, - 0xf091f0afu, - 0xd02ef091u, - 0xf0afc02eu, - 0xf091f431u, - 0xad55ac8cu, - 0xf01df091u, - 0xf01f091u, - 0xf031c720u, - 0xf091c021u, - 0xe18df091u, - 0xf131ad78u, - 0xac9cf05du, - 0x4100ad55u, - 0xacdef01du, - 0xf091a100u, - 0xa0c0ea87u, - 0x4000a100u, - 0xa080ca20u, - 0xf091c021u, - 0xad56aca8u, - 0xf11df091u, - 0x128u, - 0xd081b270u, - 0x5140c4f1u, - 0xc0f30f01u, - 0xf091f431u, - 0xc724f091u, - 0xc021e10bu, - 0xc031c734u, - 0xf091e00du, - 0xf091f135u, - 0xad78ac9cu, - 0xf05d4100u, - 0xad56ac56u, - 0xa100a0c0u, - 0xfa9d4000u, - 0xa100a080u, - 0xf01df091u, - 0x8c2f0d1u, - 0xf091f535u, - 0x8c10901u, - 0x4200a500u, - 0xa4800200u, - 0x318d185u, - 0x5042c120u, - 0xf091c021u, - 0xad57ac08u, - 0xf11df091u, - 0xd03ef091u, - 0xffafd120u, - 0xf091c020u, - 0xf091f231u, - 0xc231e191u, - 0xf091f0afu, - 0xd02ef091u, - 0xad57ac2cu, - 0xf01df091u, - 0xc022f091u, - 0xdf73ad56u, - 0xace0f19du, - 0xf231f0afu, - 0xd02ef091u, - 0x108u, - 0xc413ad56u, - 0xacbef29du, - 0xf0914200u, - 0xa500a4c0u, - 0xad56acbau, - 0xf59df091u, - 0xad57ac58u, - 0xf01df091u, - 0xb4705240u, - 0xd120f091u, - 0xdf73e10du, - 0x106cc022u, - 0xf091df73u, - 0xe1f9f231u, - 0xc0b0f091u, - 0xe030f091u, - 0xb2705140u, - 0xc4f1c0f3u, - 0xf11f091u, - 0xf4350200u, - 0x30cb074u, - 0x5042b270u, - 0x5140c4f1u, - 0x110u, - 0xd483d583u, - 0xc020f091u, - 0xc021e11bu, - 0xf091c022u, - 0xf091c021u, - 0xe197f091u, - 0x104u, - 0xc413ad57u, - 0xac5ef29du, - 0xf09108c2u, - 0xf0d1f091u, - 0xf01f091u, - 0xf031c720u, - 0xf091c021u, - 0xe18df091u, - 0xf131ad78u, - 0xac9cf05du, - 0x4100ad57u, - 0xac5ef01du, - 0xf091f535u, - 0x8c10901u, - 0x4200a500u, - 0xa4800200u, - 0x318d185u, - 0x5042c120u, - 0xf091c021u, - 0xad58ac14u, - 0xf11df091u, - 0xd03ef091u, - 0xffafd120u, - 0xf091c020u, - 0xf091f231u, - 0xc231e191u, - 0xf091f0afu, - 0xd02ef091u, - 0xad58ac38u, - 0xf01df091u, - 0xc022f091u, - 0xdf73ad57u, - 0xacecf19du, - 0xf231f0afu, - 0xd02ef091u, - 0x108u, - 0xc413ad57u, - 0xaccaf29du, - 0xf0914200u, - 0xa500a4c0u, - 0xad57acc6u, - 0xf59df091u, - 0xad58ac64u, - 0xf01df091u, - 0xb4705240u, - 0xd120f091u, - 0xdf73e10du, - 0x106cc022u, - 0xf091df73u, - 0xe1f9f231u, - 0xc0b0f091u, - 0xe030f091u, - 0xb2705140u, - 0xc4f1c0f3u, - 0xf11f091u, - 0x8c2f0d1u, - 0xf091f135u, - 0xf13708c1u, - 0xe124f091u, - 0xca25ad58u, - 0xace8f11du, - 0xf091cf37u, - 0x200030cu, - 0xb0745042u, - 0xc4f1b274u, - 0x51420000u, - 0x110d483u, - 0xd583c022u, - 0xf091c021u, - 0xad58acd8u, - 0xf11df091u, - 0xcf27e189u, - 0xf0911668u, - 0xe00df091u, - 0xc331ad58u, - 0xacd8f11du, - 0xf091c022u, - 0xf091ad58u, - 0xaceef05du, - 0xf091df75u, - 0xad58ac8au, - 0xf19df091u, - 0xad58ace8u, - 0xf01df091u, - 0xcf370000u, - 0x104c413u, - 0xad58ac8au, - 0xf29df091u, - 0x8c2f0d1u, - 0xf091f135u, - 0xc03ef091u, - 0xffafd03eu, - 0xf091ffafu, - 0xe03ef091u, - 0xffaff537u, - 0xf01f091u, - 0xf631d726u, - 0xf091c535u, - 0xe121f091u, - 0xd126f091u, - 0xb46ae0c6u, - 0xf091030fu, - 0x89aa524au, - 0xd424f091u, - 0xc535e107u, - 0xf0910f00u, - 0xf091f635u, - 0xf0afe02eu, - 0xf091f0afu, - 0xd02ef091u, - 0xf0afc02eu, - 0xf091f431u, - 0xf0d1f091u, - 0x2000306u, - 0x4000a19eu, - 0xa016ea89u, - 0xf0914000u, - 0xa19ea00eu, - 0x5140d581u, - 0xc022f091u, - 0xc021e18fu, - 0xf231df73u, - 0xdf73e1edu, - 0xf091f0d1u, - 0xf091d03eu, - 0xf091ffafu, - 0x2000320u, - 0xc022f091u, - 0xc021e137u, - 0xf431c0a4u, - 0xf091c032u, - 0xf0911072u, - 0xc03ef091u, - 0xffaf1041u, - 0xc03ef091u, - 0xffafad51u, - 0xac2cf05du, - 0xf091f0afu, - 0xc02ef091u, - 0x5148f0afu, - 0xc02ef091u, - 0xb268e045u, - 0xf091f0a3u, - 0xdf73ad59u, - 0xac84f19du, - 0xf091f0afu, - 0xd02ef091u, - 0x4000a19eu, - 0xa016ea89u, - 0xf0914000u, - 0xa19ea00eu, - 0xad59ac6eu, - 0xf01df091u, - 0x4100a39eu, - 0xa2202140u, - 0x2043f091u, - 0x4100a39eu, - 0xa2a02140u, - 0x2043f091u, - 0x4100a39eu, - 0xa2602140u, - 0x2043f091u, - 0x4100a39eu, - 0xa2e02140u, - 0x2043f091u, - 0x4100a39eu, - 0xa20ec031u, - 0xc533049eu, - 0x520069eu, - 0x76008d4u, - 0xf0914100u, - 0xa39ea216u, - 0xc031c533u, - 0x49e05a0u, - 0x69e07e0u, - 0x8d4f091u, - 0xf0d1f091u, - 0x0u, - 0x1017du, - 0x4000a15au, - 0xa04ec030u, - 0xf0910c00u, - 0x54004000u, - 0xa15aa04cu, - 0xc030f091u, - 0xf0d1f091u, - 0x4000a15au, - 0xa04cc020u, - 0xf091df71u, - 0xc005400u, - 0xad5aace4u, - 0xf11df091u, - 0xc030f091u, - 0x4000a1a1u, - 0xa030c8c0u, - 0xf0918020u, - 0xe11df091u, - 0x9f70c8d0u, - 0xf0918020u, - 0xe191f091u, - 0xb000000u, - 0x104ad47u, - 0xac2af05du, - 0xf0914000u, - 0xa1a1a070u, - 0xc8c0f091u, - 0x8020e11du, - 0xf0919f70u, - 0xc8d0f091u, - 0x8020e191u, - 0xf0910b01u, - 0x104u, - 0xad47ac2au, - 0xf05df091u, - 0xf0d1f091u, - 0x4400a9a1u, - 0xa830cfa8u, - 0xf091c021u, - 0xe117f091u, - 0xdf71cfb8u, - 0xf091c021u, - 0xe18b0b00u, - 0xad69acceu, - 0xf05d0407u, - 0x4400a9a1u, - 0xa870cfa8u, - 0xf091c021u, - 0xe117f091u, - 0xdf71cfb8u, - 0xf091c021u, - 0xe18b0b01u, - 0xad69acceu, - 0xf05d0407u, - 0x4100a35au, - 0xa24ec022u, - 0xf0914000u, - 0xa15aa04cu, - 0xc030f091u, - 0x4202a500u, - 0xa4000604u, - 0x7000400u, - 0x580c084u, - 0xf0910109u, - 0x84a8e133u, - 0xf091dc24u, - 0xf091c523u, - 0xe18b8338u, - 0xe125f091u, - 0xe039f091u, - 0xdf73dc34u, - 0xf091e197u, - 0x8338e1abu, - 0x8638ad5bu, - 0xacf4f11du, - 0xf091ad5cu, - 0xac44f01du, - 0xf091df77u, - 0xe111da85u, - 0xad5bac4eu, - 0xf19d1042u, - 0x8170f01du, - 0x5248f0d1u, - 0xf0914400u, - 0xa9a1a830u, - 0xc084f091u, - 0x11488538u, - 0xe10b0b00u, - 0x4400a9a1u, - 0xa8700b01u, - 0xcea8f091u, - 0xc021e18bu, - 0xf091ad7cu, - 0xacc0f05du, - 0x23df71u, - 0xceb8f091u, - 0xf135c03eu, - 0xf091ffafu, - 0xad7aac96u, - 0xf05df091u, - 0xf0afc02eu, - 0xf091f431u, - 0xad5bac8au, - 0xf01df091u, - 0x4000a100u, - 0xa052c020u, - 0xf091c171u, - 0xc030f091u, - 0xf135c03eu, - 0xf091ffafu, - 0xe03ef091u, - 0xffaff03eu, - 0xf091ffafu, - 0x100u, - 0x2000312u, - 0xad7bac6eu, - 0xf05db474u, - 0xf0aff02eu, - 0xf091f0afu, - 0xe02ef091u, - 0xf0afc02eu, - 0xf091f431u, - 0xad5bac8au, - 0xf01df091u, - 0x4400a9a1u, - 0xa830c084u, - 0xf0911148u, - 0x8538e10bu, - 0xb004400u, - 0xa9a1a870u, - 0xb01cea8u, - 0xf091c021u, - 0xe18bf091u, - 0xad7cacc0u, - 0xf05d0023u, - 0xdf71ceb8u, - 0xf091f135u, - 0xc03ef091u, - 0xffafe03eu, - 0xf091ffafu, - 0xf03ef091u, - 0xffafc03eu, - 0xf091ffafu, - 0xc03ef091u, - 0xffafc1a4u, - 0xf639cf46u, - 0xf091010du, - 0x84b00200u, - 0x331e107u, - 0xc0310200u, - 0x332ad7bu, - 0xac6ef05du, - 0xb474f0afu, - 0xc02ef091u, - 0xad7aac5au, - 0xf05df091u, - 0xf0afc02eu, - 0xf091ad7au, - 0xac96f05du, - 0xf091f0afu, - 0xf02ef091u, - 0xf0afe02eu, - 0xf091f0afu, - 0xc02ef091u, - 0xf431ad5bu, - 0xac8af01du, - 0xf091c03eu, - 0xf091ffafu, - 0xfad5cu, - 0xacfa9f70u, - 0xf19df091u, - 0xf0afc02eu, - 0xf091f0d1u, - 0xf091ad5cu, - 0xaceef05du, - 0xf091ad5cu, - 0xaceef05du, - 0xf091ad5cu, - 0xaceef05du, - 0xf091ad5cu, - 0xaceef05du, - 0xf091ad5cu, - 0xaceef05du, - 0xf091f0d1u, - 0xf091ad5du, - 0xac0af05du, - 0xf091ad5du, - 0xac0af05du, - 0xf091ad5du, - 0xac0af05du, - 0xf091ad5du, - 0xac0af05du, - 0xf091ad5du, - 0xac0af05du, - 0xf091f0d1u, - 0xf091c03eu, - 0xf091ffafu, - 0xd03ef091u, - 0xffaf0203u, - 0x3e80003u, - 0x1e8ad5cu, - 0xaceef05du, - 0xf091df71u, - 0xe1f5f091u, - 0xdf73e1ebu, - 0xf091f0afu, - 0xd02ef091u, - 0xf0afc02eu, - 0xf091f0d1u, - 0xf091c03eu, - 0xf091ffafu, - 0xd03ef091u, - 0xffaf0203u, - 0x3e80003u, - 0x1e8ad5du, - 0xac0af05du, - 0xf091df71u, - 0xe1f5f091u, - 0xdf73e1ebu, - 0xf091f0afu, - 0xd02ef091u, - 0xf0afc02eu, - 0xf091f0d1u, - 0xf0910c02u, - 0x5f000901u, - 0xb004200u, - 0xa504a400u, - 0xc015e00u, - 0x6301ad08u, - 0xac02f05du, - 0xf0916300u, - 0xad08ac02u, - 0xf05df091u, - 0x48ff49ffu, - 0x6304ad08u, - 0xac02f05du, - 0xf0916318u, - 0xad08ac02u, - 0xf05df091u, - 0x62060c44u, - 0x10000c00u, - 0x5e004000u, - 0xa15da0e0u, - 0x26044200u, - 0xa505a400u, - 0xf5910b01u, - 0x91f4000u, - 0xa1a1a030u, - 0x100u, - 0xc030f091u, - 0xf0a1e5f9u, - 0xf0914100u, - 0xa3a1a230u, - 0x100u, - 0xc132f091u, - 0x106d192u, - 0xf0910004u, - 0xca92f091u, - 0xcad2u, - 0xf0910000u, - 0x104c932u, - 0xf0910000u, - 0x102c9b2u, - 0xf0910200u, - 0x304d332u, - 0xf0910008u, - 0xc892f091u, - 0xcf02f091u, - 0x10080a0u, - 0xcf12f091u, - 0x91f4000u, - 0xa1a1a070u, - 0x100u, - 0xc030f091u, - 0xf0a1e5f9u, - 0xf0914100u, - 0xa3a1a270u, - 0x101u, - 0xc132f091u, - 0x106d192u, - 0xf0910004u, - 0xca92f091u, - 0xcad2u, - 0xf0910000u, - 0x104c932u, - 0xf0910000u, - 0x102c9b2u, - 0xf0910200u, - 0x304d332u, - 0xf0910008u, - 0xc892f091u, - 0xcf02f091u, - 0x10080a0u, - 0xcf12f091u, - 0xad3cacf2u, - 0xf05df091u, - 0xad3cacdcu, - 0xf05df091u, - 0xf0d1f091u, - 0x4000a1a1u, - 0xa030ad5fu, - 0xac28f05du, - 0xb004000u, - 0xa1a1a070u, - 0xad5fac28u, - 0xf05d0b01u, - 0xad59acecu, - 0xf05df091u, - 0xf0d1f091u, - 0xca85a00u, - 0xad08ac02u, - 0xf05df091u, - 0xc285a00u, - 0xc015800u, - 0xad08ac02u, - 0xf05df091u, - 0xad08ac02u, - 0xf05df091u, - 0xcf00f091u, - 0x11384a8u, - 0xe1050200u, - 0x208010fu, - 0x80a88120u, - 0x1c485300u, - 0xc005800u, - 0xad08ac02u, - 0xf05df091u, - 0xcf71200u, - 0xcf71300u, - 0xc205900u, - 0xad08ac02u, - 0xf05df091u, - 0xad08ac02u, - 0xf05df091u, - 0xc005900u, - 0xad08ac02u, - 0xf05df091u, - 0xc015c00u, - 0xc0d5d00u, - 0xc045800u, - 0xad08ac02u, - 0xf05df091u, - 0xad08ac02u, - 0xf05df091u, - 0xc951100u, - 0xb501b5u, - 0x1c481200u, - 0x1c491300u, - 0xc205900u, - 0xad08ac02u, - 0xf05df091u, - 0xc011500u, - 0xad08ac02u, - 0xf05df091u, - 0x6102091fu, - 0xad00acc0u, - 0xea87c031u, - 0xad00ac80u, - 0xc03cf091u, - 0xe5fbf0adu, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x6000u, - 0x60b06160u, - 0x62100000u, - 0x2200u, - 0xef0000u, - 0xef0138u, - 0x0u, - 0xffffu, - 0xffff0000u, - 0x71c0u, - 0x71c0ad69u, - 0xacb4f05du, - 0xf0916e00u, - 0x6f00ad07u, - 0xac38ea8du, - 0x640140u, - 0xc03cf091u, - 0xf0d1f091u, - 0x640150u, - 0xc13cf091u, - 0xf0d1f091u, - 0xcf71200u, - 0xcf71300u, - 0xc041600u, - 0xad69acb4u, - 0xf05df091u, - 0xc025e00u, - 0x26040c08u, - 0x1400ad08u, - 0xac02f05du, - 0xf091005fu, - 0x146cbb8u, - 0xf0916e01u, - 0x6f006a00u, - 0x6b006c00u, - 0x6d00ad07u, - 0xac304500u, - 0xab07aa38u, - 0xea950063u, - 0x180c03cu, - 0xf0910064u, - 0x140c03au, - 0xf091f0d1u, - 0x27020063u, - 0x190c13cu, - 0xf0910064u, - 0x150c13au, - 0xf091f0d1u, - 0x27020000u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0x822103cu, - 0x826103cu, - 0xad64ac10u, - 0xcf08f091u, - 0x11384a8u, - 0xe18ff091u, - 0x100b1148u, - 0x2058928u, - 0xf19df091u, - 0x10220200u, - 0x304c529u, - 0xf19df091u, - 0xad75ac3eu, - 0x826103cu, - 0xc839f19du, - 0x2701ad75u, - 0xac4e1022u, - 0xc839f19du, - 0x2701cba8u, - 0xf091df71u, - 0xcbb8f091u, - 0xe107f091u, - 0xf0d12702u, - 0xcac8f091u, - 0x10884b0u, - 0xe10bf091u, - 0xad75ac26u, - 0xf01d2701u, - 0xad75ac26u, - 0xf01d2701u, - 0xad75ac26u, - 0xf01d2701u, - 0x6e006f00u, - 0x40cad8u, - 0xf0910c01u, - 0x14000c00u, - 0x5e00ad40u, - 0xaca6f01du, - 0xf0910000u, - 0x0u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0xc025e00u, - 0x26040cf7u, - 0x12000cf7u, - 0x13000c20u, - 0x5900ad08u, - 0xac02f05du, - 0xf0910c02u, - 0x1600ad08u, - 0xac02f05du, - 0xf091ad08u, - 0xac02f05du, - 0xf091ad08u, - 0xac02f05du, - 0xf0910c00u, - 0x59006e00u, - 0x6f002701u, - 0x9cad8u, - 0xf091c031u, - 0xc038f091u, - 0x1fec0b8u, - 0xf091e003u, - 0xf0911022u, - 0x826103cu, - 0xc939ad64u, - 0xacaef11du, - 0xf0910019u, - 0xcad8f091u, - 0x1b6u, - 0xcbb8f091u, - 0x6a006b00u, - 0x6c006d00u, - 0x6e006f00u, - 0xad07ac30u, - 0xea8ff091u, - 0x650100u, - 0xc03cf091u, - 0xf0d12702u, - 0x650110u, - 0xc13cf091u, - 0xf0d12702u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0x27011022u, - 0xc239ad65u, - 0xac42f19du, - 0xf091c839u, - 0xad65ac4au, - 0xf11df091u, - 0xcba8f091u, - 0xdf71cbb8u, - 0xf091e10fu, - 0xf091f0d1u, - 0x2702ad75u, - 0xac26f01du, - 0xf0911022u, - 0xc239e191u, - 0xf091c839u, - 0xe113f091u, - 0xad75ac4eu, - 0xf01df091u, - 0xad75ac26u, - 0xf01df091u, - 0xcf08f091u, - 0x11384a8u, - 0xc101fcu, - 0xe107f091u, - 0x101fcu, - 0x7a686c80u, - 0x6d002700u, - 0x6e056f00u, - 0xad07ac38u, - 0x4500ab07u, - 0xaa30ea97u, - 0xf0910065u, - 0x1d0c03cu, - 0xf0910063u, - 0x180c03au, - 0xf091e013u, - 0xf0910065u, - 0x1e0c13cu, - 0xf0910063u, - 0x190c13au, - 0xf091005fu, - 0x146cbb8u, - 0xf0912702u, - 0xc011600u, - 0xf0d1f091u, - 0x0u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0x1022ad75u, - 0xac26c239u, - 0xf19df091u, - 0xad64ac58u, - 0x826103cu, - 0xc839f19du, - 0xf0910029u, - 0xcad8f091u, - 0x6901b0u, - 0xc438f091u, - 0xad45acd4u, - 0xf05df091u, - 0xc031600u, - 0xad62acbau, - 0xea87f091u, - 0xad62acb6u, - 0xc02cfa39u, - 0xc0acf439u, - 0x6d0100u, - 0xad62acdcu, - 0xea87f091u, - 0xad62acdau, - 0xc03cf091u, - 0xad73ac82u, - 0xf05df091u, - 0x10cu, - 0xc034f091u, - 0x3c094u, - 0xf091b074u, - 0xf1a1ad62u, - 0xacc20902u, - 0xb27c08c4u, - 0xf091bc72u, - 0xb27008d4u, - 0xf091e5f1u, - 0xb0720011u, - 0x101c7b4u, - 0xf091c031u, - 0xc834f091u, - 0xb0740000u, - 0x122d081u, - 0x4100a303u, - 0xa208ea89u, - 0xf0914100u, - 0xa303a200u, - 0x8c4f091u, - 0xb27008d4u, - 0xf0916e09u, - 0x6f006a00u, - 0x6b00ad07u, - 0xac38ea8du, - 0x670130u, - 0xc03cf091u, - 0xe00bf091u, - 0x670140u, - 0xc13cf091u, - 0xad62acc0u, - 0xea87f091u, - 0xad62acbeu, - 0xc02cf091u, - 0xc021e1afu, - 0xf031107cu, - 0xc03ef091u, - 0xffaf0403u, - 0x5000600u, - 0x7efad4fu, - 0xac6af05du, - 0xf091f0afu, - 0xc02ef091u, - 0xbc68c03cu, - 0xf9310200u, - 0x302d1b0u, - 0xf091c380u, - 0xf09101efu, - 0x84b0e18bu, - 0xf091ad71u, - 0xacecf01du, - 0xf091ad7cu, - 0xacc0f05du, - 0x610000u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0xad75ac3eu, - 0x826103cu, - 0xc839f19du, - 0xf0914800u, - 0x49080039u, - 0xcad8f091u, - 0xcba8f091u, - 0x5f0146u, - 0xcbb8f091u, - 0x6d01f0u, - 0xad62acdcu, - 0xea87f091u, - 0xad62acdau, - 0xc03cf091u, - 0x6e016f01u, - 0x6a006b00u, - 0xad75ac62u, - 0xf05df091u, - 0xad07ac38u, - 0xea8df091u, - 0x6801d0u, - 0xc03cf091u, - 0xe0090068u, - 0x1e0c13cu, - 0xf091e8ffu, - 0xf09100f0u, - 0x1f00c94u, - 0x11001c48u, - 0x12001c49u, - 0x13000c20u, - 0x5900ad08u, - 0xac02f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0xad75ac3eu, - 0x826103cu, - 0xc839f19du, - 0xf091cba8u, - 0xf091005fu, - 0x146cbb8u, - 0xf091ad62u, - 0xacbaea87u, - 0xf091ad62u, - 0xacb6c02cu, - 0xfa39c0acu, - 0xf4394800u, - 0x49080c00u, - 0x5900ad08u, - 0xac02f05du, - 0xf0910cf7u, - 0x12000cf7u, - 0x1300ad75u, - 0xac62f05du, - 0xf091006fu, - 0x170ad62u, - 0xacdcea87u, - 0xf091ad62u, - 0xacdac03cu, - 0xf0916e01u, - 0x6f016a00u, - 0x6b00ad07u, - 0xac38ea8du, - 0x6801d0u, - 0xc03cf091u, - 0xe00bf091u, - 0x6801e0u, - 0xc13cf091u, - 0x114u, - 0xc034f091u, - 0x3c094u, - 0xf091b074u, - 0xf1a1ad62u, - 0xacc20902u, - 0xb27c08c4u, - 0xf091bc72u, - 0xb27008d4u, - 0xf091e5f1u, - 0xb0720011u, - 0x102c7b4u, - 0xf091c031u, - 0xc834f091u, - 0xb0740000u, - 0x122d081u, - 0xc031c533u, - 0xca35cf37u, - 0x901b270u, - 0x8d4f091u, - 0xe5fbf091u, - 0xad71acecu, - 0xf01df091u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa830e011u, - 0xb000000u, - 0x0u, - 0x4400a9a1u, - 0xa8700b01u, - 0xad75ac3eu, - 0x826103cu, - 0xc839f19du, - 0x27010000u, - 0xcad8f091u, - 0xcf71200u, - 0xcf71300u, - 0xcc21400u, - 0xad73acbcu, - 0xf05df091u, - 0xad62acc0u, - 0xea87f091u, - 0xad62acbeu, - 0xc02cf439u, - 0xc031c03cu, - 0xf091ad51u, - 0xac2cf05du, - 0xf091ad75u, - 0xacc8f05du, - 0xf0916e01u, - 0x6f00ad07u, - 0xac38ea8du, - 0x690180u, - 0xc03cf091u, - 0xe00bf091u, - 0x690160u, - 0xc13cf091u, - 0xcba8f091u, - 0xad41ac92u, - 0xf01df091u, - 0x4400a9a1u, - 0xa870ad07u, - 0xac380064u, - 0x150c13cu, - 0xf091e021u, - 0xb010000u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa830ad07u, - 0xac380064u, - 0x140c03cu, - 0xf0910b00u, - 0x10220826u, - 0x103cc188u, - 0xf091ad6au, - 0xac7af05du, - 0x1448ad75u, - 0xac3ef01du, - 0xf0910000u, - 0xf0d1f091u, - 0x8cad8u, - 0xf091c031u, - 0xce38f091u, - 0xc038f091u, - 0x1fec0b8u, - 0xf091f0d1u, - 0xf091ad63u, - 0xac08f05du, - 0xf0910007u, - 0xc198f091u, - 0xca98u, - 0xf091ad69u, - 0xacb4f05du, - 0xf0910c02u, - 0x5600e907u, - 0xf091e07bu, - 0xf091ad45u, - 0xacd4f05du, - 0xf0916202u, - 0xc015800u, - 0xad08ac02u, - 0xf05df091u, - 0xc005800u, - 0xad08ac02u, - 0xf05df091u, - 0xc015c00u, - 0xc0d5d00u, - 0xc045800u, - 0xad08ac02u, - 0xf05df091u, - 0xc005600u, - 0x26040c02u, - 0x5e000000u, - 0x8230e1abu, - 0xf0910200u, - 0x311ad43u, - 0xac40f05du, - 0xf091ad55u, - 0xac7af05du, - 0xf091ad59u, - 0xac4cf05du, - 0xf091ad46u, - 0xac7ef05du, - 0xf091e013u, - 0xf091ad55u, - 0xac7af05du, - 0xf091ad59u, - 0xac4cf05du, - 0xf091f0d1u, - 0xf0910007u, - 0xc198f091u, - 0xca98u, - 0xf091ad69u, - 0xacb4f05du, - 0xf0910c02u, - 0x5600e907u, - 0xf091e07bu, - 0xf091ad45u, - 0xacd4f05du, - 0xf0916202u, - 0xc005600u, - 0x26040c02u, - 0x5e000000u, - 0x8230e1abu, - 0xf0910200u, - 0x311ad43u, - 0xac40f05du, - 0xf091ad55u, - 0xac7af05du, - 0xf091ad59u, - 0xac4cf05du, - 0xf091ad46u, - 0xac7ef05du, - 0xf091e013u, - 0xf091ad55u, - 0xac7af05du, - 0xf091ad59u, - 0xac4cf05du, - 0xf091f0d1u, - 0xf0910000u, - 0x0u, - 0x0u, - 0x0u, - 0x4400a9a1u, - 0xa870ad62u, - 0xacba2301u, - 0xe0110b01u, - 0x4400a9a1u, - 0xa830ad62u, - 0xacb62300u, - 0xb00c02cu, - 0xfa3909ffu, - 0xe707f091u, - 0xe5fbf091u, - 0xe70bf091u, - 0xad7cacc0u, - 0xf05d0062u, - 0xad6bacdeu, - 0xf99df091u, - 0x826103cu, - 0x2030380u, - 0xc529ad6cu, - 0xac02f19du, - 0xf0918030u, - 0x110c0207u, - 0x85298541u, - 0x4000a16bu, - 0xa06ed081u, - 0xc020f091u, - 0xbc68f01du, - 0xf0916c02u, - 0x6c026c02u, - 0x6b7e6b7eu, - 0x6c026b7eu, - 0x6c020003u, - 0xc1d8f091u, - 0xb07aad72u, - 0xac84f05du, - 0xf091ad28u, - 0xacf4f05du, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605ad62u, - 0xacdcea87u, - 0xf091ad62u, - 0xacdac02cu, - 0xf039f011u, - 0xf091100du, - 0x111f1022u, - 0x103a2200u, - 0x21043468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0x2a00ad75u, - 0xac26f01du, - 0xf091ad28u, - 0xacf4f05du, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605f0d1u, - 0xf0910000u, - 0x0u, - 0x0u, - 0x0u, - 0x4000a100u, - 0xa0c0e011u, - 0xb010000u, - 0x0u, - 0x4000a100u, - 0xa0800b00u, - 0x826103cu, - 0x20c0300u, - 0xc529e109u, - 0xf0910c00u, - 0x5e002605u, - 0x826103cu, - 0x1022ca20u, - 0xf091c021u, - 0xad6caceeu, - 0xf11df091u, - 0x128u, - 0xd081b270u, - 0x5140c4f1u, - 0xc0f30f01u, - 0xf091f091u, - 0xf091f431u, - 0xc724f091u, - 0xc021e10bu, - 0xc031c734u, - 0xf091e00du, - 0xf091f135u, - 0xad78ac9cu, - 0xf05d4100u, - 0xc624f091u, - 0xc021e10du, - 0xf091bc68u, - 0xc6a4f091u, - 0xf05df091u, - 0xa100a0c0u, - 0xea874000u, - 0xa100a080u, - 0xca20f091u, - 0xc021e185u, - 0xf091610au, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0xad62acbau, - 0xea87f091u, - 0xad62acb6u, - 0x4100a36du, - 0xa2944200u, - 0xa56da49cu, - 0x4000a16du, - 0xa0dcc02cu, - 0xfa39c7aau, - 0xf0910211u, - 0x301c433u, - 0xf191f091u, - 0xc34af091u, - 0xd24af091u, - 0x84b0f191u, - 0x8020f113u, - 0x1ef80b0u, - 0xf1910000u, - 0x122b67au, - 0xdc87ad03u, - 0xac08ea87u, - 0xf091ad03u, - 0xac000a00u, - 0xc1a6f091u, - 0xd1acf091u, - 0xc111c126u, - 0xf091d12cu, - 0xf091c119u, - 0xc0a6f091u, - 0xd0acf091u, - 0xc119c026u, - 0xf091d02cu, - 0xf091c119u, - 0xf315f091u, - 0xf213f091u, - 0xc031600u, - 0xf0d1f091u, - 0xad71acc4u, - 0xf01df091u, - 0x39cad8u, - 0xf091e8ffu, - 0xf091ad07u, - 0xac38ea8du, - 0x6701d0u, - 0xc03cf091u, - 0xe00bf091u, - 0x6701e0u, - 0xc13cf091u, - 0xc101400u, - 0xc941100u, - 0xf001f0u, - 0x1c481200u, - 0x1c491300u, - 0xc205900u, - 0xf0d1f091u, - 0xad75ac4eu, - 0xf01df091u, - 0x0u, - 0x0u, - 0x0u, - 0xcba8f091u, - 0x5f0146u, - 0xcbb8f091u, - 0xad62acbau, - 0xea87f091u, - 0xad62acb6u, - 0xc005900u, - 0xc02cfa39u, - 0x4000a16fu, - 0xa060c8aau, - 0xf091c7aau, - 0xf0910211u, - 0x301c511u, - 0xf4110211u, - 0x307c413u, - 0xf4110211u, - 0x302c511u, - 0xe41f0211u, - 0x305c413u, - 0xe417f091u, - 0xe88af091u, - 0x873ae10du, - 0x301e288u, - 0xf09189a2u, - 0xe298f091u, - 0x8030c001u, - 0x4000a16eu, - 0xa070d081u, - 0xc020fc39u, - 0x4000a171u, - 0xa09ef01du, - 0xf0910000u, - 0x6f60u, - 0x6e806ea0u, - 0x6ec06ee0u, - 0x6f006f40u, - 0xad71ac08u, - 0xf05df091u, - 0x110102u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0xad71ac14u, - 0xf05df091u, - 0x110103u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0xad71ac26u, - 0xf05df091u, - 0x110104u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0xad71ac6cu, - 0xf05df091u, - 0xc0c8f091u, - 0x1c481700u, - 0x110105u, - 0xc7baf091u, - 0xf011f091u, - 0x0u, - 0xb27a0000u, - 0x122d483u, - 0xd88af091u, - 0x8171d89au, - 0xf0918030u, - 0xd483c0c8u, - 0xf091c012u, - 0xf0910011u, - 0x106c7bau, - 0xf0910000u, - 0x100c83au, - 0xf091f011u, - 0xf0910000u, - 0x0u, - 0x0u, - 0x0u, - 0xb27a0000u, - 0x122c083u, - 0xce38f091u, - 0x110107u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0xad75ac4eu, - 0xf01df091u, - 0x0u, - 0x0u, - 0xad62acbau, - 0xea87f091u, - 0xad62acb6u, - 0xc02cfa39u, - 0x4000a171u, - 0xa000c8aau, - 0xf091c7aau, - 0xf0910211u, - 0x301c511u, - 0xf4110211u, - 0x307c413u, - 0xf4110211u, - 0x302c511u, - 0xe41f0211u, - 0x305c413u, - 0xe417f091u, - 0xe88af091u, - 0x873ae10du, - 0x301e288u, - 0xf09189a2u, - 0xe298f091u, - 0x8030c001u, - 0x4000a16fu, - 0xa0e0d081u, - 0xc020fc39u, - 0x4000a171u, - 0xa09ef01du, - 0xf0910000u, - 0x7100u, - 0x6ff07010u, - 0x70307060u, - 0x70b070d0u, - 0xad71ac14u, - 0xf05df091u, - 0x110103u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0xad71ac26u, - 0xf05df091u, - 0x110104u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0xad71ac6cu, - 0xf05df091u, - 0xc0c8f091u, - 0x1c481700u, - 0x110105u, - 0xc7baf091u, - 0x10100u, - 0xc83af091u, - 0xf011f091u, - 0xad70acdcu, - 0xf01df091u, - 0x0u, - 0xc82af091u, - 0x9f70e1edu, - 0xf0910000u, - 0x184c03au, - 0xf091b27au, - 0x122u, - 0xd48300ffu, - 0x1ff1268u, - 0x14681668u, - 0x90f08d4u, - 0xf091e5fbu, - 0xf091d0c8u, - 0xf0910001u, - 0xc8baf091u, - 0x110106u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0x110107u, - 0xc7baf091u, - 0x100u, - 0xc83af091u, - 0xf011f091u, - 0x0u, - 0x0u, - 0x0u, - 0xb27a0000u, - 0x122c083u, - 0xce38f091u, - 0xb501b5u, - 0xc851100u, - 0x1c481200u, - 0x1c491300u, - 0xc105900u, - 0xf0d1f091u, - 0x0u, - 0x0u, - 0x0u, - 0xad75ac4eu, - 0xf01df091u, - 0xc028f091u, - 0xd0a8f091u, - 0xf0d1f091u, - 0xc028f091u, - 0xd0a8f091u, - 0x8020e183u, - 0xf091f0d1u, - 0xf091c028u, - 0xf091d0a8u, - 0xf0918020u, - 0xe1b7f091u, - 0xad03ac19u, - 0xea87f091u, - 0xad03ac18u, - 0xf00cf091u, - 0xad73acf6u, - 0xf05df091u, - 0x8020e119u, - 0xf091ad74u, - 0xac56f05du, - 0xf0918020u, - 0xe10bf091u, - 0xc038f091u, - 0xd0b8f091u, - 0xf0d1f091u, - 0xc028f091u, - 0xd0a8f091u, - 0x8020e1a3u, - 0xf09103feu, - 0xad74ac86u, - 0xf05df091u, - 0x8020e113u, - 0xf091ad74u, - 0xac56f05du, - 0xf091c038u, - 0xf091d0b8u, - 0xf091f0d1u, - 0xf091ad71u, - 0xacc4f05du, - 0xf091ad71u, - 0xacecf05du, - 0xf091f0d1u, - 0xf0910000u, - 0x0u, - 0x0u, - 0x0u, - 0xe07ff091u, - 0xe8fff091u, - 0xad62acbau, - 0xea87f091u, - 0xad62acb6u, - 0xc02cf091u, - 0xd0acf091u, - 0xd03cf091u, - 0xc0bcf091u, - 0xc031600u, - 0xf0d1f091u, - 0x4600ad62u, - 0xacbcea89u, - 0xf0914600u, - 0xad62acb8u, - 0xc02cf439u, - 0x1074c7a4u, - 0xf091c031u, - 0xf6312302u, - 0xb074f1a1u, - 0x12701140u, - 0x2c432d44u, - 0xb074f7a1u, - 0x12701140u, - 0x2e08cac8u, - 0xf0910129u, - 0x84b00072u, - 0x160e105u, - 0xf091c031u, - 0x2d18c084u, - 0xf091d024u, - 0xf091ad62u, - 0xacc0ea87u, - 0xf091ad62u, - 0xacbe6102u, - 0xc02cf839u, - 0xad51ac58u, - 0xf05df091u, - 0xf0d1f091u, - 0x0u, - 0x4400a9a1u, - 0xa870ea89u, - 0xf0914400u, - 0xa9a1a830u, - 0xcac8f091u, - 0x12984b0u, - 0xad71acecu, - 0xf11df091u, - 0xf0d1f091u, - 0xf131c03eu, - 0xf091ffafu, - 0xc328f091u, - 0x2200211cu, - 0x34682008u, - 0xf091e507u, - 0xf091e07bu, - 0xf091103au, - 0x103ad328u, - 0xf091c111u, - 0x22303e4u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106a28d3u, - 0x2038d2bu, - 0x8932c111u, - 0xc3b8f091u, - 0x2000384u, - 0xc511e407u, - 0xf0910000u, - 0x1841468u, - 0xc030f091u, - 0xf0a1b270u, - 0x2200211cu, - 0x2003f091u, - 0xca25ad73u, - 0xac5cf11du, - 0xf091b072u, - 0xc328f091u, - 0x200031cu, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106a0440u, - 0x8a94124cu, - 0xe405f091u, - 0x124d2200u, - 0x314a3468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0xb2702200u, - 0x314a2003u, - 0xf0910200u, - 0x340c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x2000340u, - 0xd1819615u, - 0xe20bf091u, - 0xad73ac10u, - 0xf19df091u, - 0xf0afc02eu, - 0xf091f231u, - 0xc082f091u, - 0x10384a8u, - 0x80304000u, - 0xa112a06eu, - 0xd081c000u, - 0xf091c092u, - 0xf091f0d1u, - 0xf091ad07u, - 0xac104500u, - 0xab07aa40u, - 0xc005d00u, - 0xea97f091u, - 0x6b0110u, - 0xc03cf091u, - 0x6c0160u, - 0xc03af091u, - 0xf0d12605u, - 0x6b0100u, - 0xc13cf091u, - 0x6c0150u, - 0xc13af091u, - 0xf0d12605u, - 0xad07ac10u, - 0x4500ab07u, - 0xaa400c0du, - 0x5d00ea97u, - 0xf0910009u, - 0x130c03cu, - 0xf0910047u, - 0x170c03au, - 0xf091f0d1u, - 0x26070009u, - 0x120c13cu, - 0xf0910047u, - 0x160c13au, - 0xf091f0d1u, - 0x260701feu, - 0x84b3e11fu, - 0xf091114bu, - 0x4100a3a0u, - 0xa27ab672u, - 0x97ee002u, - 0xf0918cb2u, - 0xe115f091u, - 0xc1f3e5f3u, - 0xf091c031u, - 0x20003feu, - 0xca35e02fu, - 0xf0911276u, - 0xc993144du, - 0x81740507u, - 0x96ac9f75u, - 0xe03ef091u, - 0x194de409u, - 0x5809465u, - 0xe5fdf091u, - 0x90649064u, - 0x9064c533u, - 0x1349c031u, - 0xfff0d1u, - 0xf091b27au, - 0x6000722u, - 0xd7830600u, - 0x174cd783u, - 0xd002f091u, - 0x8aa9e191u, - 0x86a1d012u, - 0xf09100ffu, - 0x1000200u, - 0xf0d1f091u, - 0x100u, - 0x200f0d1u, - 0xf091090fu, - 0xb27a0600u, - 0x722d783u, - 0xd022f091u, - 0xd03ef091u, - 0xffaf04c0u, - 0x500c623u, - 0xd032f091u, - 0x1272d03eu, - 0xf091d022u, - 0xf091c173u, - 0xe113f091u, - 0xd022f091u, - 0x8172e19fu, - 0xf091c1f3u, - 0xe019f091u, - 0xf0a3e5e3u, - 0xf0910000u, - 0x1000200u, - 0x3fe0400u, - 0x500e03bu, - 0xf091d02eu, - 0xf091c593u, - 0x144b0580u, - 0xe002f091u, - 0x8db38942u, - 0xe28bf091u, - 0x94658173u, - 0xe075f091u, - 0x124c8b42u, - 0x8d829f73u, - 0x2004100u, - 0xa3a0a27au, - 0xd583f002u, - 0xf09100ffu, - 0x100f02eu, - 0xf091bc6eu, - 0xf0aff02eu, - 0xf091f03cu, - 0xf091f0d1u, - 0xf091ad75u, - 0xacc8f05du, - 0xf091c188u, - 0xf091ad43u, - 0xacd6f05du, - 0x1448f0d1u, - 0xf091ad75u, - 0xacc8f05du, - 0xf091ad64u, - 0xac58f01du, - 0xf091ad75u, - 0xacc8f05du, - 0xf091ad63u, - 0xac08f05du, - 0xf091f0d1u, - 0xf091e687u, - 0xf091f0d1u, - 0xf09109ffu, - 0xe707f091u, - 0xe5fbf091u, - 0xe70ff091u, - 0xad7cacc0u, - 0xf05d0065u, - 0xe065f091u, - 0xad28acf4u, - 0xf05df091u, - 0xc1d8u, - 0xf091103au, - 0x2000304u, - 0xc101c121u, - 0x2000300u, - 0xc1010224u, - 0x300c511u, - 0xe405f091u, - 0x106ac338u, - 0xf091c888u, - 0xf0919f70u, - 0xc898f091u, - 0x63102605u, - 0xad75ac62u, - 0xf01df091u, - 0xa100a0c0u, - 0xea874000u, - 0xa100a080u, - 0x1070ca20u, - 0xf091c021u, - 0xad76ac28u, - 0xf11df091u, - 0x128u, - 0xd081b270u, - 0x5140c4f1u, - 0xc0f30f01u, - 0xf091f431u, - 0xc724f091u, - 0xc021e10bu, - 0xc031c734u, - 0xf091e00du, - 0xf091f135u, - 0xad78ac9cu, - 0xf05d4100u, - 0xad75acd4u, - 0xa100a0c0u, - 0xfa9d4000u, - 0xa100a080u, - 0xf01df091u, - 0x1070c820u, - 0xf091c021u, - 0xad76ac6cu, - 0xf11df091u, - 0x120u, - 0xd081b270u, - 0x5140c4f1u, - 0xc0f3c020u, - 0xf091df71u, - 0xe193f091u, - 0xf01f091u, - 0xad78ac9cu, - 0xf05d4100u, - 0xe00ff091u, - 0x8c1ad78u, - 0xacb8f05du, - 0xf09108c2u, - 0xf0d1f091u, - 0x4400a9a1u, - 0xa870e011u, - 0xb010000u, - 0x0u, - 0x4400a9a1u, - 0xa8300b00u, - 0x826103cu, - 0x100b1148u, - 0x1022100du, - 0x111f01dfu, - 0x80a80105u, - 0x84a8ad76u, - 0xacd0f11du, - 0xf0910104u, - 0x84a8e115u, - 0xf0910826u, - 0x103c0203u, - 0x300c529u, - 0xad77ac5eu, - 0xf19df091u, - 0xc188f091u, - 0xad43acd6u, - 0xf05d1448u, - 0xf0d1f091u, - 0x1e784a8u, - 0x84a1ad77u, - 0xac56f19du, - 0xf091101fu, - 0x1f084a8u, - 0x84a1f19du, - 0xf091ca88u, - 0xf0911148u, - 0xad77ac3au, - 0x10484b0u, - 0xf11d0101u, - 0x84b0f11du, - 0x10284b0u, - 0xf11d0103u, - 0x84b0f11du, - 0xf0911022u, - 0x2000304u, - 0xc529f11du, - 0xf091cac8u, - 0xf0910100u, - 0xad75ac26u, - 0x84b0f19du, - 0xf091c188u, - 0xf091ad43u, - 0xacd6f05du, - 0x1448f0d1u, - 0xf0910cc0u, - 0x1600ad08u, - 0xac02f05du, - 0xf091ad08u, - 0xac02f05du, - 0xf091100du, - 0x111ff0d1u, - 0xf091ad7cu, - 0xacc0f05du, - 0x510c03u, - 0x5e00ad08u, - 0xac02f05du, - 0xf0910c02u, - 0x5e00e687u, - 0xf091f0d1u, - 0x260409ffu, - 0xe707f091u, - 0xe5fbf091u, - 0xe707f091u, - 0xe06df091u, - 0x103a100fu, - 0x110cad28u, - 0xacf4f05du, - 0xf0910000u, - 0xc1d8f091u, - 0x103a0200u, - 0x304c101u, - 0xc1210200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0xc338f091u, - 0xc888f091u, - 0x9f70c898u, - 0xf0916310u, - 0x2605ad77u, - 0xac6ef01du, - 0xf0914100u, - 0xa234a39fu, - 0xc022f091u, - 0xc021e18bu, - 0xf031ad77u, - 0xacfaf01du, - 0xf0914000u, - 0xa19fa038u, - 0xf01f091u, - 0xf031f0d1u, - 0xc021fe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x10401141u, - 0x12421343u, - 0x14441545u, - 0x1646fe2fu, - 0xb27ef0a3u, - 0x8d4f091u, - 0x10741276u, - 0x1478167au, - 0xfe2fb27eu, - 0xf0a308d4u, - 0xf091107cu, - 0xc03ef091u, - 0x808101cu, - 0xff2fc0beu, - 0xf091ad47u, - 0xac50f05du, - 0xf091ad47u, - 0xac60ea87u, - 0xf091ad47u, - 0xac70f05du, - 0xf091f12fu, - 0xc02ef091u, - 0xbc68b27eu, - 0xf0a308c4u, - 0xf091f22fu, - 0xb468b66au, - 0xb86cba6eu, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22f5048u, - 0x5149524au, - 0x534b544cu, - 0x554d564eu, - 0xb27ef0a3u, - 0x8c4f091u, - 0xf22fad77u, - 0xacd4f01du, - 0x41004100u, - 0xa234a39fu, - 0xc039e111u, - 0xc139e18du, - 0xf0914000u, - 0xa19fa038u, - 0xf00f091u, - 0xf0d1f091u, - 0x4200a59fu, - 0xa438c024u, - 0xf091d020u, - 0xf091c101u, - 0xc034f091u, - 0xc533d030u, - 0xf0914000u, - 0xa19fa036u, - 0xc020f439u, - 0xc022f091u, - 0xc0a2f091u, - 0xc030f091u, - 0xf031d030u, - 0xf091f135u, - 0xc021c022u, - 0xf091e191u, - 0xf0914000u, - 0xa19fa034u, - 0xc030f091u, - 0xe007f091u, - 0xc034f091u, - 0xd032f091u, - 0xd0b2f091u, - 0xf0d1f091u, - 0x4001a102u, - 0xa0000400u, - 0x5400203u, - 0x3f45140u, - 0xb2702140u, - 0x2043f091u, - 0xdf73e10fu, - 0xd281e1f1u, - 0x10408170u, - 0x5048e069u, - 0x51400603u, - 0x7f44001u, - 0xa102a000u, - 0x4200a502u, - 0xa4200901u, - 0xc0a4f091u, - 0xc039e12bu, - 0x101u, - 0x1270c423u, - 0x1140c034u, - 0xf091d0b4u, - 0xf091d184u, - 0xf0918030u, - 0xc171cc17u, - 0xc251d081u, - 0xe289f091u, - 0x10408170u, - 0x5048e5cdu, - 0xf2254100u, - 0xa39fa238u, - 0xf032f091u, - 0x4100a39fu, - 0xa234106eu, - 0xc171d291u, - 0xe289f091u, - 0x12409f72u, - 0x504adf71u, - 0xe115d281u, - 0xe289f091u, - 0x12408172u, - 0x504ac032u, - 0xf931e06bu, - 0xb270c031u, - 0xc032f091u, - 0x4000a19fu, - 0xa036c030u, - 0xf933f0d1u, - 0xf0910002u, - 0xff830400u, - 0x6040700u, - 0x4000580u, - 0x4102a300u, - 0xa2004000u, - 0xa179a0d6u, - 0xc030f933u, - 0xc031b072u, - 0x5041df77u, - 0xe119d683u, - 0xe1871241u, - 0x8172514au, - 0xc030f933u, - 0xc090f091u, - 0xe069b072u, - 0x5041b270u, - 0x5140c030u, - 0xf091c090u, - 0xf0914000u, - 0xa179a0d8u, - 0xc030f933u, - 0xf0d1f091u, - 0x4100a379u, - 0xa2d6c022u, - 0xf091c021u, - 0xe187f031u, - 0xf0d1f091u, - 0x4000a179u, - 0xa0da0f01u, - 0xf091f031u, - 0x201e090u, - 0xf091f0d1u, - 0xf091f031u, - 0xd120f091u, - 0xc523e12fu, - 0xf433f337u, - 0xd03ef091u, - 0xffaff631u, - 0xad58ac6au, - 0xf05df091u, - 0xd124f091u, - 0xc523e18bu, - 0xf091ad57u, - 0xacbaf05du, - 0xf091f0afu, - 0xd02ef091u, - 0xf633f0d1u, - 0xf091f031u, - 0xc120f439u, - 0xc533e090u, - 0xf0914000u, - 0xa179a0dau, - 0x4100a379u, - 0xa2d60f00u, - 0xf091ad7au, - 0xace6f135u, - 0xc021f11du, - 0xf091c1a4u, - 0xf091cf39u, - 0xf19df091u, - 0xc124f091u, - 0xc021ad7au, - 0xacdef11du, - 0xf091ad56u, - 0xacaef05du, - 0xf091ad51u, - 0xac2cf05du, - 0xf091f0d1u, - 0xf091f137u, - 0xc086f091u, - 0x15080a0u, - 0xc096f091u, - 0x101u, - 0xcc36f091u, - 0x8c1c126u, - 0xf091c021u, - 0xad7bac50u, - 0xf11df031u, - 0xc120f091u, - 0xc520f091u, - 0xc021ad7bu, - 0xac50f11du, - 0xf031c720u, - 0xf091f337u, - 0xc531e199u, - 0xf091c031u, - 0xc330f091u, - 0xc3b0f091u, - 0xc530f091u, - 0xc5b0f091u, - 0xc630f091u, - 0xc020f091u, - 0xad7bac18u, - 0xf01df091u, - 0x8c2c1a6u, - 0xf039e180u, - 0xf091a100u, - 0xa000ad4cu, - 0xac22f05du, - 0xf091f0d1u, - 0xf0910000u, - 0x4000u, - 0xa17ba06au, - 0xc030f091u, - 0xd0b0f091u, - 0xf1354400u, - 0xa9a1a830u, - 0xc084f091u, - 0x11488538u, - 0xe10b0b00u, - 0x4400a9a1u, - 0xa8700b01u, - 0xc084f091u, - 0x8638e195u, - 0x12080a8u, - 0x10880a0u, - 0xc094f091u, - 0xc928f091u, - 0xcc34f091u, - 0xc1a4f091u, - 0xc021ad7cu, - 0xac5af11du, - 0xf631f335u, - 0xd03ef091u, - 0xffaf2303u, - 0x112u, - 0xd4852224u, - 0x21182002u, - 0xf0914000u, - 0xa17ba06au, - 0xc020f091u, - 0xd0a0f091u, - 0x2e0cb276u, - 0x8c4f091u, - 0x2e000000u, - 0x101c82du, - 0x142u, - 0xc8259fb7u, - 0x2e84c031u, - 0xc5332e08u, - 0x2e102e14u, - 0xcea8f091u, - 0x2d220600u, - 0xad38acdeu, - 0xf05db476u, - 0xf0afc02eu, - 0xf091f431u, - 0xcca4f091u, - 0xc021e12fu, - 0xf631ff06u, - 0xf091b276u, - 0x9f73e10bu, - 0xf091c0a2u, - 0xf239e075u, - 0xf091cfa2u, - 0xf091ccb4u, - 0xf091c031u, - 0xcfb2f091u, - 0x4000a17bu, - 0xa0c2f011u, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf091f0d1u, - 0xf0910907u, - 0x100f110cu, - 0xc032f091u, - 0x103ac0b2u, - 0xf0916310u, - 0xe5efc4f3u, - 0xf0d1f091u, - 0x98f0600u, - 0x700f235u, - 0x106e2200u, - 0x21403468u, - 0x2008f091u, - 0xe507f091u, - 0xe07bf091u, - 0x22002140u, - 0x2003f091u, - 0x140u, - 0xcf01e5ddu, - 0xf091f0d1u, - 0xf0910000u, - 0x0u, - 0x0u, - 0xc03ef091u, - 0xffaf1070u, - 0x4000a1a2u, - 0xa0b0c030u, - 0xf0911072u, - 0xc0b0f091u, - 0x1074c130u, - 0xf0911076u, - 0xc1b0f091u, - 0x1078c230u, - 0xf091107au, - 0xc2b0f091u, - 0x107cc330u, - 0xf091107eu, - 0xc3b0f091u, - 0xf0afc02eu, - 0xf091c430u, - 0xf091d4b0u, - 0xf091e530u, - 0xf091f5b0u, - 0xf0914100u, - 0xa300a258u, - 0xd002f091u, - 0xc032f091u, - 0x4100a3a2u, - 0xa2d0ad7cu, - 0xac66f05du, - 0xf0914100u, - 0xa3a3a250u, - 0xad7cac6au, - 0xf05d0b00u, - 0x4100a3a3u, - 0xa270ad7cu, - 0xac6af05du, - 0xb012300u, - 0x4100a3a3u, - 0xa2902200u, - 0x21402003u, - 0xf0912301u, - 0x4100a3a3u, - 0xa2d02200u, - 0x21402003u, - 0xf0912302u, - 0x4100a3a4u, - 0xa2102200u, - 0x21402003u, - 0xf0912303u, - 0x4100a3a4u, - 0xa2502200u, - 0x21402003u, - 0xf0910008u, - 0xb001c48u, - 0x53000b01u, - 0x1c485300u, - 0x10060108u, - 0x80a01c48u, - 0x57000c00u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c02u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c01u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c03u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c00u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c02u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c01u, - 0x5500ad08u, - 0xac02f05du, - 0xf0910c03u, - 0x5500ad08u, - 0xac02f05du, - 0xf091ad7cu, - 0xac840410u, - 0x500f05du, - 0xb00ad7cu, - 0xac840434u, - 0x500f05du, - 0xb01e07fu, - 0xf0914000u, - 0xa19fa050u, - 0x300108u, - 0xc030f091u, - 0x4000a193u, - 0xa09c0093u, - 0x19ec030u, - 0xf091b268u, - 0x4100c022u, - 0xf09102ffu, - 0x3ffad7eu, - 0xacbcc531u, - 0xf11df091u, - 0x4000a19fu, - 0xa04cc020u, - 0xf091d0a2u, - 0xf091c023u, - 0xc030f091u, - 0x4000a19fu, - 0xa04ec020u, - 0xf091c023u, - 0xc030f091u, - 0xc022f091u, - 0xbc68f05du, - 0xf0914000u, - 0xa193a09cu, - 0xad7eacaau, - 0xc021f19du, - 0xf091c020u, - 0xf091b268u, - 0x4100c0a2u, - 0xf0914100u, - 0xa39fa24cu, - 0xd022f091u, - 0xc131c032u, - 0xf091c020u, - 0xf091c471u, - 0xc030f091u, - 0xad7eac3au, - 0xf01df091u, - 0x4000a19fu, - 0xa0500030u, - 0x100c030u, - 0xf091f0d1u, - 0xf091e03eu, - 0xf091ffafu, - 0xad7fac1au, - 0x4000a19fu, - 0xa050e020u, - 0xf0910600u, - 0x71fcb2du, - 0xe18bf091u, - 0xd030f091u, - 0xe009f091u, - 0xca33f19du, - 0xf0914000u, - 0xa19fa04au, - 0xc030f091u, - 0x4000a19fu, - 0xa052f0afu, - 0xe02ef091u, - 0xe030f091u, - 0x8030f0d1u, - 0x8020f0afu, - 0xe02ef091u, - 0xe0750001u, - 0x4000a19fu, - 0xa04ac020u, - 0xf091020eu, - 0x383c129u, - 0xad80ac68u, - 0xc021f11du, - 0xf0914000u, - 0xa193a07eu, - 0xc020f091u, - 0xb2684100u, - 0xc022f091u, - 0x2ff03ffu, - 0xad7fac74u, - 0xc531f19du, - 0xf0914000u, - 0xa193a07eu, - 0x930180u, - 0xc030f091u, - 0xad7fac48u, - 0xf01df091u, - 0x4200a59fu, - 0xa44ac024u, - 0xf091d0a2u, - 0xf091ad80u, - 0xac0cc129u, - 0xf11df091u, - 0x4000a19fu, - 0xa04cc020u, - 0xf091c023u, - 0xc030f091u, - 0xc022f091u, - 0xbc68f05du, - 0xf0914000u, - 0xa193a07eu, - 0xd020f091u, - 0xb26a4100u, - 0xd0a2f091u, - 0xad7faceau, - 0xc021f19du, - 0xf0914100u, - 0xa39fa24cu, - 0xc022f091u, - 0xc131c032u, - 0xf0914200u, - 0xa59fa450u, - 0xc024f091u, - 0x4030500u, - 0xad80ac0cu, - 0xc02df19du, - 0xf0914200u, - 0xa59fa450u, - 0xc024f091u, - 0x4fe05ffu, - 0xc02dc034u, - 0xf091a59fu, - 0xa44ac024u, - 0xf091c531u, - 0xd034f091u, - 0xc020f091u, - 0xc471c030u, - 0xf091ad7fu, - 0xac484000u, - 0xa193a09au, - 0xc020f091u, - 0xc171c030u, - 0xf0914000u, - 0xa19fa04au, - 0xc020f091u, - 0xad80ac68u, - 0xc021f19du, - 0xf0914000u, - 0xa19fa052u, - 0xc020f091u, - 0xc021e11du, - 0xbc68f05du, - 0xf0914000u, - 0xa19fa052u, - 0xc031c030u, - 0xf0914000u, - 0xa193a09au, - 0xc030f091u, - 0xf0d1f091u, - 0x4000a19fu, - 0xa050c020u, - 0xf0910600u, - 0x71fc329u, - 0xc231e18fu, - 0xf0910633u, - 0x700c72bu, - 0xc121c030u, - 0xf091f0d1u, - 0xf0914000u, - 0xa19fa050u, - 0xc020f091u, - 0xc229e109u, - 0xf091c031u, - 0xc030f091u, - 0xf0d1f091u, - 0x4300c026u, - 0xf091b268u, - 0x4100c0a6u, - 0xf091d1a6u, - 0xf091e022u, - 0xf091c229u, - 0xf0d1f091u, - 0x4000a19fu, - 0xa0560280u, - 0x300d030u, - 0xf091ad9au, - 0xacaaf05du, - 0xf091ad93u, - 0xacb4f05du, - 0xf091ad98u, - 0xaca4f05du, - 0xf091ad96u, - 0xac26f05du, - 0xf0914100u, - 0xa39fa256u, - 0xad8fac8cu, - 0x27ff05du, - 0x3ff4300u, - 0xa79fa656u, - 0xc026f091u, - 0xc021f0d1u, - 0xf0910000u, - 0x1004000u, - 0xa1a0a078u, - 0xc030f091u, - 0x4000a19fu, - 0xa050d020u, - 0xf091ad81u, - 0xac88cc3bu, - 0xf11df091u, - 0xc0aaf091u, - 0xb0684000u, - 0x2800300u, - 0xd030f091u, - 0x127ad03eu, - 0xf091ffafu, - 0xb00ad8cu, - 0xac44f05du, - 0xf091e00au, - 0xf091154au, - 0xad84acf8u, - 0xf05df091u, - 0xf0afd02eu, - 0xf091ba6au, - 0x4500d0aau, - 0xf091b06au, - 0x4000c030u, - 0xf0914100u, - 0xa3a0a278u, - 0xc032f091u, - 0x4000a19fu, - 0xa050d020u, - 0xf091ad81u, - 0xacf6cd3bu, - 0xf11df091u, - 0xc0aaf091u, - 0xc271b068u, - 0x40000280u, - 0x300d030u, - 0xf091127au, - 0xd03ef091u, - 0xffaf0b01u, - 0xad8cac44u, - 0xf05df091u, - 0xe00af091u, - 0x154aad84u, - 0xacf8f05du, - 0xf091f0afu, - 0xd02ef091u, - 0xba6a4500u, - 0xd0aaf091u, - 0xc273b06au, - 0x4000c030u, - 0xf0914100u, - 0xa3a0a278u, - 0xd022f091u, - 0xc521d032u, - 0xf091f0d1u, - 0xc123aba0u, - 0xaa50ad81u, - 0xac16f05du, - 0x4500f0d1u, - 0xf091aba0u, - 0xaa58ad81u, - 0xac16f05du, - 0x4500f0d1u, - 0xf091aba0u, - 0xaa60ad81u, - 0xac16f05du, - 0x4500f0d1u, - 0xf091aaaau, - 0x5555ffffu, - 0x101u, - 0x2020404u, - 0x8081010u, - 0x20204040u, - 0x80800000u, - 0x4000a19fu, - 0xa0700080u, - 0x100c030u, - 0xf0910000u, - 0x100c130u, - 0xf0914000u, - 0xa1a6a000u, - 0x20100u, - 0xad90ac4eu, - 0xf05df091u, - 0x8020e11bu, - 0xf0914100u, - 0xa39fa270u, - 0xad8fac7eu, - 0x200f05du, - 0x303ad83u, - 0xacc0f01du, - 0xf0914000u, - 0xa18ea000u, - 0x103u, - 0xc03ef091u, - 0xffafc03eu, - 0xf931ffafu, - 0x4100a3a6u, - 0xa2000002u, - 0x100ad83u, - 0xace0f05du, - 0xf091f0afu, - 0xc02ef039u, - 0xc03ef931u, - 0xffaf0002u, - 0x100ad84u, - 0xac4ef05du, - 0xf091f0afu, - 0xc02ef039u, - 0xc03ef931u, - 0xffaf0002u, - 0x100ad84u, - 0xac9ef05du, - 0xf0914100u, - 0xa382a22au, - 0xf0afc02eu, - 0xf039c03eu, - 0xf931ffafu, - 0x20100u, - 0xad83acfeu, - 0xf05df091u, - 0xc2f30482u, - 0x544cab3u, - 0xe1dff091u, - 0xf0afc02eu, - 0xf239c03eu, - 0xf933ffafu, - 0x20100u, - 0x4000a1a6u, - 0xa000ad83u, - 0xace0f05du, - 0xf091f0afu, - 0xc02ef039u, - 0x2020300u, - 0xd181f0afu, - 0xc02ef091u, - 0xdf71ad82u, - 0xac94c021u, - 0xf19df091u, - 0x4100a39fu, - 0xa270d022u, - 0xf0910400u, - 0x501ca2bu, - 0xe11ff091u, - 0x4000a19fu, - 0xa0700400u, - 0x502d020u, - 0xf091ca23u, - 0xe030f091u, - 0xad83acc0u, - 0xf01df091u, - 0x4000a100u, - 0xa0000000u, - 0x180ad91u, - 0xac20f05du, - 0xf0914001u, - 0xa100a000u, - 0x180u, - 0xad91ac20u, - 0xf05df091u, - 0x4002a100u, - 0xa0000000u, - 0x180ad91u, - 0xac20f05du, - 0xf0914003u, - 0xa100a000u, - 0x180u, - 0xad91ac20u, - 0xf05df091u, - 0x4100a39fu, - 0xa270ad8fu, - 0xac8c027fu, - 0xf05d03ffu, - 0xad80acacu, - 0xa79fa6a4u, - 0xf05df091u, - 0xf0d1f091u, - 0xdc81d020u, - 0xf091d032u, - 0xf091c2f1u, - 0xc2f31676u, - 0xcfb1e1efu, - 0xf091f0d1u, - 0xf0910000u, - 0xb870u, - 0xdc81d022u, - 0xf0910000u, - 0x4500ab83u, - 0xaafad030u, - 0xf091c2f1u, - 0x1670cfb7u, - 0xe1f5f091u, - 0xb078e020u, - 0xf091ce33u, - 0xe191f091u, - 0xc2f11670u, - 0xcfb7e1efu, - 0xf091f0d1u, - 0xf0914100u, - 0xa39fa270u, - 0xad8fac7eu, - 0x200f05du, - 0x303c0b2u, - 0xf931e067u, - 0x1b870u, - 0xdc8102aau, - 0x3aa0000u, - 0xd030f091u, - 0xc173c2f1u, - 0x1670cfb7u, - 0xe1f3f091u, - 0xb07802aau, - 0x3aae020u, - 0xf091ce33u, - 0xe191c173u, - 0xc2f11670u, - 0xcfb7e1efu, - 0xf091f0d1u, - 0xf0914100u, - 0xa39fa270u, - 0xad8fac7eu, - 0x200f05du, - 0x303c0b2u, - 0xf931e067u, - 0x1b870u, - 0xdc8102aau, - 0x3aa0455u, - 0x5550000u, - 0xd030f091u, - 0xe0b0f091u, - 0xc4f11670u, - 0xcfb7e1f1u, - 0xf091b078u, - 0xf020f091u, - 0xcf33e199u, - 0xf091f0a0u, - 0xf091cf35u, - 0xe18fc4f1u, - 0x1670cfb7u, - 0xe1e7f091u, - 0xf0d1f091u, - 0x4100a39fu, - 0xa270ad8fu, - 0xac7e0200u, - 0xf05d0303u, - 0xc0b2f931u, - 0xe0670001u, - 0x104d4000u, - 0xa1a8a016u, - 0xc010f091u, - 0x4000a1a8u, - 0xa01ac031u, - 0xc030f091u, - 0x4000a1a8u, - 0xa018a3a0u, - 0xa2381072u, - 0xc030f091u, - 0xad85ac6eu, - 0xc020f091u, - 0xb068c020u, - 0xf09102ffu, - 0x3ffc531u, - 0xf11d4000u, - 0xa1a8a020u, - 0xad8cacb6u, - 0xf05d0440u, - 0x4000a1a8u, - 0xa016e000u, - 0xf091154au, - 0xad85ac98u, - 0xf05d4000u, - 0xa1a8a018u, - 0xc021e19du, - 0xf091c020u, - 0xf091ad85u, - 0xac1cf01du, - 0xc2714000u, - 0xa1a8a01au, - 0xc020f091u, - 0xf0d1c021u, - 0x4100a3a8u, - 0xa21ad022u, - 0xf091c121u, - 0xc032f091u, - 0xa1a8a018u, - 0xad85ac62u, - 0xf01d4000u, - 0x4000a1a0u, - 0xa0360000u, - 0xc010f091u, - 0x100u, - 0x4000a1a8u, - 0xa008c030u, - 0xf091c0b0u, - 0xf091c130u, - 0xf091c1b0u, - 0xf091c230u, - 0xf091a1a8u, - 0xa012c010u, - 0xf0914000u, - 0xa19fa058u, - 0xc030f091u, - 0xc0b0f091u, - 0xc015800u, - 0xad08ac02u, - 0xf05df091u, - 0xc015e00u, - 0xad08ac02u, - 0xf05df091u, - 0x1c4d5300u, - 0xad08ac02u, - 0xf05df091u, - 0xad8aac1au, - 0xf05df091u, - 0xc085900u, - 0xad5caceeu, - 0xf05df091u, - 0x1022ad86u, - 0xac32c239u, - 0xf11df091u, - 0x4000a1a8u, - 0xa00e0200u, - 0x340d030u, - 0xf091ad89u, - 0xac0cf01du, - 0xf091ad5cu, - 0xaceef05du, - 0xf0910c02u, - 0x5900ad5du, - 0xac0af05du, - 0xf091ad86u, - 0xacc41022u, - 0xad5caceeu, - 0xf05df091u, - 0xad86acc4u, - 0xc739f11du, - 0xf0910c08u, - 0x5900ad5du, - 0xac0af05du, - 0xf0911022u, - 0xad86acc4u, - 0xc639f11du, - 0xf0910c04u, - 0x5900ad5du, - 0xac0af05du, - 0xf0911022u, - 0xad86acc4u, - 0xc539f11du, - 0xf0910c06u, - 0x5900ad5du, - 0xac0af05du, - 0xf0911022u, - 0xad86acc4u, - 0xc439f11du, - 0xf0910c00u, - 0x5900ad5du, - 0xac0af05du, - 0xf0911022u, - 0x1f084a8u, - 0x200ad86u, - 0xacd88931u, - 0xf11df091u, - 0x4000a1a8u, - 0xa00ec020u, - 0xf0910200u, - 0x304c121u, - 0xc030f091u, - 0x4030500u, - 0xad4fac6au, - 0xf05d0600u, - 0xb8704300u, - 0xa7a8a608u, - 0xc036f931u, - 0x100u, - 0xc1b0f091u, - 0xc015c00u, - 0xc0d5d00u, - 0x4000a1a8u, - 0xa00a0000u, - 0x100c030u, - 0xf0912302u, - 0x4300a79fu, - 0xa6e0e026u, - 0xf09102ffu, - 0x3ffad87u, - 0xac48c633u, - 0xf11df091u, - 0xb26ce0a6u, - 0xf0914400u, - 0xa9a8a808u, - 0xc028f039u, - 0xad8bac58u, - 0xf05d4101u, - 0xad87ac16u, - 0xf01df127u, - 0xc045800u, - 0x8c24000u, - 0xa1a8a00cu, - 0x9f01e0u, - 0xc030f091u, - 0x826103cu, - 0x4000a1a8u, - 0xa0100010u, - 0x100c030u, - 0xf091ad5cu, - 0xaceef05du, - 0xf091ad87u, - 0xace8e98fu, - 0xf091f69du, - 0xf091ad87u, - 0xaca6f01du, - 0xf0914000u, - 0xa1a8a00eu, - 0xc020f091u, - 0x2000308u, - 0xc121c030u, - 0xf091ad89u, - 0xac0cf01du, - 0x1ad08u, - 0xac02f05du, - 0xf091ad87u, - 0xac6e4000u, - 0xa1a8a010u, - 0xc020f091u, - 0xdf71c030u, - 0xf091c021u, - 0xf19df091u, - 0x826103cu, - 0x4000a1a8u, - 0xa00ec020u, - 0xf0910200u, - 0x302c121u, - 0xc030f091u, - 0xad89ac0cu, - 0xf01df091u, - 0x2301ad87u, - 0xacf4fa9du, - 0xf0912300u, - 0x100c0243u, - 0x8930e103u, - 0xf0914000u, - 0xa1a8a00cu, - 0xe020f091u, - 0xb06ce0a0u, - 0xf0910000u, - 0x120ca01u, - 0xa1a8a00au, - 0xc020f091u, - 0x4000a1a6u, - 0xa000ad1cu, - 0xac7cf05du, - 0xf091ad28u, - 0xacf4f05du, - 0xf0911030u, - 0x1232c531u, - 0xe105f091u, - 0x62044000u, - 0xa1a8a00cu, - 0xc020f091u, - 0xb068e0a0u, - 0xf091c865u, - 0xc020f091u, - 0xb0684001u, - 0x4100a3a6u, - 0xa220c020u, - 0xf091d022u, - 0xf091ad89u, - 0xacaecd31u, - 0xf19df091u, - 0xc2f1c2f3u, - 0xdf75ad88u, - 0xac5eca25u, - 0xf19df091u, - 0x103a0200u, - 0x3040200u, - 0x300c101u, - 0x2240300u, - 0xc511e405u, - 0xf091106au, - 0x4000a1a8u, - 0xa00ad020u, - 0xf091c030u, - 0xf091ad88u, - 0xacbcc511u, - 0xf29df091u, - 0x4000a1a8u, - 0xa0120001u, - 0xc010f091u, - 0x6310ad5du, - 0xac0af05du, - 0xf0916302u, - 0x4000a1a8u, - 0xa00cc020u, - 0xf091c471u, - 0xc030f091u, - 0xb068c020u, - 0xf09102ffu, - 0x3ffad87u, - 0xac60c531u, - 0xf19df091u, - 0x4000a1a8u, - 0xa008c020u, - 0xf8394300u, - 0xa7a8a612u, - 0xc006f091u, - 0xad87ac0eu, - 0x8020f11du, - 0xf0910000u, - 0x6305ad8cu, - 0xaca0f05du, - 0xf091ad47u, - 0xac60ea87u, - 0xf091ad47u, - 0xac70f05du, - 0xf0910c00u, - 0x53000c00u, - 0x1400ad8cu, - 0xac4cf05du, - 0xf0910c01u, - 0x5800ad08u, - 0xac02f05du, - 0xf091ad55u, - 0xac7af05du, - 0xf091ad59u, - 0xac4cf05du, - 0xf0914000u, - 0xa1a8a008u, - 0xc020f091u, - 0xc021e10fu, - 0xf091c020u, - 0xf439ad51u, - 0xac2cf05du, - 0xf0910c00u, - 0x5800ad08u, - 0xac02f05du, - 0xf0914000u, - 0xa1a8a00eu, - 0xc020f091u, - 0xc021e119u, - 0xf091ad89u, - 0xacdef05du, - 0xf091c021u, - 0xe18bf091u, - 0xad85aca4u, - 0xf01df091u, - 0x4000a1a8u, - 0xa00ec020u, - 0xf091f0d1u, - 0xc0211470u, - 0x1672147eu, - 0x4000a19fu, - 0xa058c030u, - 0xf091d0b0u, - 0xf0914000u, - 0xa1a8a00eu, - 0xc020f091u, - 0x2000301u, - 0xc121c030u, - 0xf091ad89u, - 0xac0cf01du, - 0x102ffu, - 0x3ffad8au, - 0xac164000u, - 0xa1a0a036u, - 0xc000f091u, - 0x8170c010u, - 0xf0910203u, - 0x8812f21du, - 0xf0914000u, - 0xa1a8a016u, - 0xd000f091u, - 0x1549ad8cu, - 0xac44f05du, - 0xf0910200u, - 0x300f0d1u, - 0xc123110du, - 0x4000u, - 0xa1a8a014u, - 0x10au, - 0xc030f091u, - 0x4e0120u, - 0xad5dac0au, - 0xf05df091u, - 0xe1f7df71u, - 0x1082a0u, - 0x1c485300u, - 0x20100u, - 0xad5caceeu, - 0xf05df091u, - 0xe1f7df71u, - 0x1c4d5300u, - 0x104d0c01u, - 0x5e000964u, - 0xad5caceeu, - 0xf05df091u, - 0xe5f7f091u, - 0xad8cac5eu, - 0xf05df091u, - 0xc905200u, - 0xad5caceeu, - 0xf05df091u, - 0xc041600u, - 0xc011400u, - 0xad5dac0au, - 0xf05df091u, - 0x826103cu, - 0xc005800u, - 0xad5dac0au, - 0xf05df091u, - 0xc005900u, - 0xad5dac0au, - 0xf05df091u, - 0xc005e00u, - 0xad5dac0au, - 0xf05df091u, - 0xad8aacd2u, - 0x96a5f19du, - 0xf0910c04u, - 0x16000c01u, - 0x1400ad5du, - 0xac0af05du, - 0xf091100bu, - 0x102f091u, - 0x826103cu, - 0xad8bac20u, - 0x2100300u, - 0xc131f19du, - 0xf09109c8u, - 0xad5dac0au, - 0xf05df091u, - 0xe5f7f091u, - 0x20003ffu, - 0x1022ad8bu, - 0xac54c239u, - 0xf11df091u, - 0x14684800u, - 0x4904ad5du, - 0xac0af05du, - 0xf091ad8au, - 0xacfcdf73u, - 0xf19df091u, - 0xad8cac4cu, - 0xf05df091u, - 0xad8bacdau, - 0xf05df091u, - 0x4000a1a8u, - 0xa016c000u, - 0xf0911548u, - 0xad8aac2cu, - 0x4000a1a8u, - 0xa014c020u, - 0xf091df71u, - 0xc030f091u, - 0xf19df091u, - 0xf0d1f091u, - 0xc03ef931u, - 0xffafad08u, - 0xac0af05du, - 0xc031126cu, - 0x800100u, - 0x2e0c4200u, - 0xa59fa4c0u, - 0x12741142u, - 0x2c432d44u, - 0x12721141u, - 0x2e08u, - 0x22c06u, - 0x202c02u, - 0x3812cc7u, - 0xad77acd4u, - 0xf05d4100u, - 0xb2702200u, - 0x21202003u, - 0xf091b270u, - 0xf0afc02eu, - 0xf03908c1u, - 0xf133b270u, - 0xba70f121u, - 0xd020f091u, - 0xf023f423u, - 0xf00c523u, - 0xe193f13bu, - 0xdfaaf091u, - 0xb26a4100u, - 0xb072f121u, - 0xf100e00u, - 0x8c2f0d1u, - 0xf0910ca8u, - 0x5a00ad08u, - 0xac02f05du, - 0xf0910c28u, - 0x5a000c01u, - 0x5800ad5du, - 0xac0af05du, - 0xf0910c00u, - 0x53000c00u, - 0x5800ad08u, - 0xac02f05du, - 0xf091ad5du, - 0xac0af05du, - 0xf0910c00u, - 0x5900ad08u, - 0xac02f05du, - 0xf0910c08u, - 0x5c000c00u, - 0x5d000c04u, - 0x5800ad08u, - 0xac02f05du, - 0xf0910c04u, - 0x16000c01u, - 0x14000c01u, - 0x15000c02u, - 0x59006102u, - 0xf0d1f091u, - 0xad8bacdau, - 0xf05df091u, - 0xc025f00u, - 0xad8cac5eu, - 0xf05df091u, - 0x2604f0d1u, - 0xf091ad46u, - 0xac4af05du, - 0xf0910c01u, - 0x5e006301u, - 0xad08ac02u, - 0xf05df091u, - 0x6300ad08u, - 0xac02f05du, - 0xf09148ffu, - 0x49ff6304u, - 0xad08ac02u, - 0xf05df091u, - 0x6318ad08u, - 0xac02f05du, - 0xf0916206u, - 0xc441000u, - 0xf0d1f091u, - 0x100u, - 0x4000a1a6u, - 0xa0000401u, - 0x500ad8cu, - 0xacb6f01du, - 0xf091c030u, - 0xf091c2f1u, - 0x9f74e1f7u, - 0xf091f0d1u, - 0xf0912300u, - 0xad8dac4eu, - 0xf05df091u, - 0xe113f091u, - 0x4100a39fu, - 0xa256ad8fu, - 0xac7e0200u, - 0xf05d0310u, - 0x2301ad8du, - 0xac4ef05du, - 0xf091e113u, - 0xf0914100u, - 0xa39fa256u, - 0xad8fac7eu, - 0x200f05du, - 0x3202302u, - 0xad8dac4eu, - 0xf05df091u, - 0xe113f091u, - 0x4100a39fu, - 0xa256ad8fu, - 0xac7e0200u, - 0xf05d0340u, - 0x2303ad8du, - 0xac4ef05du, - 0xf091e113u, - 0xf0914100u, - 0xa39fa256u, - 0xad8fac7eu, - 0x200f05du, - 0x380ad80u, - 0xacaca79fu, - 0xa6aef05du, - 0xf091f0d1u, - 0xf0914100u, - 0xa3a6a200u, - 0x22002140u, - 0x2003f091u, - 0x4100a38fu, - 0xa2a0ad8eu, - 0xac5ef05du, - 0xf091ad8du, - 0xacc8f19du, - 0xf091c2f3u, - 0xa78fa6bau, - 0x1276c5b3u, - 0xe1e5f091u, - 0x4000a18fu, - 0xa0a0ad8du, - 0xacf0f05du, - 0xf091ad8du, - 0xacc8f19du, - 0xf091c2f1u, - 0xa78fa6bau, - 0x1276c5b1u, - 0xe1e5f091u, - 0x4000a19fu, - 0xa056c020u, - 0xf091c139u, - 0xe197f091u, - 0x80304100u, - 0xa3a6a200u, - 0x22002140u, - 0x2002f091u, - 0xf0d18020u, - 0xe06d0001u, - 0x4100a3a6u, - 0xa2002200u, - 0x21402003u, - 0xf091f0d1u, - 0xf0914100u, - 0xa3a6a200u, - 0x22002140u, - 0x2002f091u, - 0xf0d1f091u, - 0xc020f091u, - 0x4100a3a6u, - 0xa2800200u, - 0x340dd83u, - 0xc032f091u, - 0xc2f31272u, - 0xc5b7e1f5u, - 0xf0914100u, - 0xa3a6a280u, - 0x22002140u, - 0x2002f091u, - 0x4100a3a7u, - 0xa2002200u, - 0x21402003u, - 0xf0914100u, - 0xa3a6a280u, - 0x4200a5a7u, - 0xa4000000u, - 0x140dc83u, - 0xc022f091u, - 0xd024f091u, - 0xc131e193u, - 0xf091c2f3u, - 0xc2f51072u, - 0xc0b7e1e9u, - 0x8030f0d1u, - 0xf091e07fu, - 0x1c022u, - 0xf0911268u, - 0x2e002e04u, - 0x2e082e0cu, - 0x2e102e14u, - 0x2e182e1cu, - 0x2e202e24u, - 0x2e282e2cu, - 0x2e302e34u, - 0x2e382e3cu, - 0xad8eac90u, - 0xf05df091u, - 0xf0d1f091u, - 0xad8fac7au, - 0x2a80ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912a84u, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2a88ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912a8cu, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2a90ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912a94u, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2a98ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912a9cu, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2aa0ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912aa4u, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2aa8ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912aacu, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2ab0ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912ab4u, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x2ab8ca31u, - 0xf19df091u, - 0xcf33f19du, - 0xf0912abcu, - 0xca31f19du, - 0xf091cf33u, - 0xf19df091u, - 0x8030f0d1u, - 0xf091e07bu, - 0x1e022u, - 0xf091c525u, - 0xd032f091u, - 0xf0d1f091u, - 0xe022f091u, - 0xc52dd032u, - 0xf091f0d1u, - 0xf0910000u, - 0x0u, - 0xcc33aaaau, - 0x5555ffffu, - 0x101u, - 0x2020404u, - 0x8081010u, - 0x20204040u, - 0x80800000u, - 0x2000000u, - 0x4100u, - 0xa38fa2bcu, - 0xc022f091u, - 0xad90ac36u, - 0xc021f11du, - 0xf0914100u, - 0xa39fa270u, - 0x800100u, - 0xc032f091u, - 0x4100a38fu, - 0xa2bac022u, - 0xf0390000u, - 0x101ad91u, - 0xac20f05du, - 0xf0914100u, - 0xa38fa2bcu, - 0xc022f091u, - 0xdf71c032u, - 0xf0914100u, - 0xa38fa2bau, - 0xc022f039u, - 0x20100u, - 0xd081e291u, - 0xf0911040u, - 0x81700104u, - 0x8490e28fu, - 0xf0915048u, - 0xc032f931u, - 0x1f0d1u, - 0x80204100u, - 0xa39fa270u, - 0xad8fac8cu, - 0x27ff05du, - 0x3ffe06bu, - 0x0u, - 0x2ffu, - 0x3fed1a9u, - 0x4500ab90u, - 0xaa4ac03au, - 0xf931c0bau, - 0xf091ad92u, - 0xaca0f05du, - 0xf091c02au, - 0xf039c0aau, - 0xf091ad93u, - 0xac0af05du, - 0xf0914100u, - 0xa38fa2a0u, - 0xc02af039u, - 0xc0aaf091u, - 0xad92ac3cu, - 0xf05df091u, - 0xc2f3048fu, - 0x5baad90u, - 0xac80cab3u, - 0xf19df091u, - 0x4100a39fu, - 0xa270d022u, - 0xf0910400u, - 0x501ca2bu, - 0xe1870000u, - 0xf0d1f091u, - 0xe07b0001u, - 0xdc81d020u, - 0xf091d032u, - 0xf091c2f1u, - 0xc2f31676u, - 0xcfb1e1efu, - 0xf091f0d1u, - 0xf091dc81u, - 0x4100a3a6u, - 0xa200d020u, - 0xf091d032u, - 0xf091c2f1u, - 0xc2f31676u, - 0xcfb1e1e9u, - 0xf091f0d1u, - 0xf091dc81u, - 0x4100a3a6u, - 0xa200d022u, - 0xf091d030u, - 0xf091c2f1u, - 0xc2f31676u, - 0xcfb1e1e9u, - 0xf091f0d1u, - 0xf0910000u, - 0x2578u, - 0x2020006eu, - 0x4500ab91u, - 0xaa16c03au, - 0xf931c0bau, - 0xf091ad91u, - 0xac4e4200u, - 0xa5a6a400u, - 0x12421340u, - 0x8933f19du, - 0xf091ad91u, - 0xac981274u, - 0xc5b1f11du, - 0xf091ad91u, - 0xac6e4200u, - 0xa5a6a400u, - 0x12421340u, - 0x8933f19du, - 0xf091ad91u, - 0xac981274u, - 0xc5b1f11du, - 0xf0911240u, - 0xad91aca6u, - 0x8922f19du, - 0xf0910202u, - 0x300dd81u, - 0xa593a47eu, - 0x1274c591u, - 0xe29df091u, - 0xa58fa49au, - 0x1276c595u, - 0xe291f091u, - 0x2020300u, - 0xd181ad91u, - 0xacfaf01du, - 0xf0914100u, - 0xa3a6a200u, - 0x20100u, - 0xad90acbcu, - 0xf05df091u, - 0x4500ab91u, - 0xaa16c02au, - 0xf0390002u, - 0x100ad90u, - 0xac4ef05du, - 0xf0910002u, - 0x1004000u, - 0xa1a6a000u, - 0x4500ab91u, - 0xaa16c02au, - 0xf239ad90u, - 0xacbcf05du, - 0xf0914500u, - 0xab91aa16u, - 0xc02af039u, - 0x2020300u, - 0xd1814500u, - 0xab91aa16u, - 0xc0aaf091u, - 0xdf71c03au, - 0xf931c0bau, - 0xf091ad91u, - 0xac2ec021u, - 0xf19df091u, - 0x4100a39fu, - 0xa270d022u, - 0xf0910400u, - 0x501ad92u, - 0xac34ca2bu, - 0xf19d0000u, - 0xf0d1f091u, - 0xad92ac30u, - 0xf01d0001u, - 0xb8705440u, - 0xdc81d022u, - 0xf0910000u, - 0xd030f091u, - 0xc2f11670u, - 0xcfb7e1f5u, - 0xf091b078u, - 0x5044e020u, - 0xf091ce33u, - 0xe191f091u, - 0xc2f11670u, - 0xcfb7e1efu, - 0xf091f0d1u, - 0xf0914200u, - 0xa59fa470u, - 0xf024f091u, - 0x101u, - 0xc027c034u, - 0xf091c0b4u, - 0xf931c124u, - 0xf091c171u, - 0xc134f091u, - 0xd1b4f091u, - 0xe234f091u, - 0xe0510001u, - 0xb8705440u, - 0xdc8102aau, - 0x3aa0000u, - 0xd030f091u, - 0xc173c2f1u, - 0x1670cfb7u, - 0xe1f3f091u, - 0xb0785044u, - 0x2aa03aau, - 0xe020f091u, - 0xce33e191u, - 0xc173c2f1u, - 0x1670cfb7u, - 0xe1eff091u, - 0xf0d1f091u, - 0x4200a59fu, - 0xa470f024u, - 0xf0910000u, - 0x101c027u, - 0xc034f091u, - 0xc0b4f931u, - 0xc124f091u, - 0xc171c134u, - 0xf091d1b4u, - 0xf091e234u, - 0xf091e051u, - 0x1b870u, - 0x5440dc81u, - 0x2aa03aau, - 0x4550555u, - 0xd030u, - 0xf091e0b0u, - 0xf091c4f1u, - 0x1670cfb7u, - 0xe1f1f091u, - 0xb0785044u, - 0xf020f091u, - 0xcf33e199u, - 0xf091f0a0u, - 0xf091cf35u, - 0xe18fc4f1u, - 0x1670cfb7u, - 0xe1e7f091u, - 0xf0d1f091u, - 0x4200a59fu, - 0xa470f024u, - 0xf0910000u, - 0x101c027u, - 0xc034f091u, - 0xc0b4f931u, - 0xc124f091u, - 0xc171c134u, - 0xf091d1b4u, - 0xf091e234u, - 0xf091e051u, - 0x19380u, - 0x80c80002u, - 0x8cc60080u, - 0x82440001u, - 0x81fa0200u, - 0x820a0400u, - 0x821a0800u, - 0xffff0000u, - 0x80c8u, - 0x28cc6u, - 0x808244u, - 0x181fau, - 0x200820au, - 0x400ffffu, - 0x4000a196u, - 0xa00c00abu, - 0x1aa8f71u, - 0x927188b0u, - 0xf191f091u, - 0xa5015bu, - 0x2a5035au, - 0xcf73d273u, - 0xc931f191u, - 0xf0910054u, - 0x30001aau, - 0x2aa8d01u, - 0x91b0f191u, - 0xf09100c6u, - 0x1230600u, - 0x70002a5u, - 0x35a0420u, - 0x5c9ce03u, - 0xc731f191u, - 0xf0910a08u, - 0x601fcu, - 0x897988b0u, - 0xf191f091u, - 0xa080000u, - 0x10602ffu, - 0x3fcc97bu, - 0xc931f191u, - 0xf0910a08u, - 0x60300u, - 0x1fc0209u, - 0x8d0991b0u, - 0xf191f091u, - 0xa080000u, - 0x1060600u, - 0x70002ffu, - 0x3fc0400u, - 0x509ce0bu, - 0xc731f191u, - 0xf091005au, - 0x40001a5u, - 0x24b8d11u, - 0x91b0f191u, - 0xf091001bu, - 0x1fe0600u, - 0x70002a5u, - 0x35a0489u, - 0x55cce13u, - 0xc731f191u, - 0xf0910a08u, - 0x5a0300u, - 0x1a5024au, - 0x8d1991b0u, - 0xf191f091u, - 0xa080055u, - 0x1aa0600u, - 0x70002aau, - 0x3550454u, - 0x5aace1bu, - 0xc731f191u, - 0xf09100a0u, - 0x30001aau, - 0x2f08d29u, - 0x91b0f191u, - 0xf09100a1u, - 0x1400600u, - 0x70002a5u, - 0x35a04f9u, - 0x560ce2bu, - 0xc731f191u, - 0xf09100fau, - 0x30001aau, - 0x2f08d21u, - 0x91b0f191u, - 0xf09100fdu, - 0x17a0600u, - 0x70002a5u, - 0x35a04f9u, - 0x560ce23u, - 0xc731f191u, - 0xf0910080u, - 0x2000101u, - 0x8b518d30u, - 0xf191f091u, - 0x10100u, - 0x4000500u, - 0x2000301u, - 0xc843ce31u, - 0xf191f091u, - 0xae00080u, - 0x2000101u, - 0x8b598d30u, - 0xf191f091u, - 0xa080001u, - 0x1008949u, - 0x8530f191u, - 0xf0910001u, - 0x1000400u, - 0x5000200u, - 0x301c84bu, - 0xce31f191u, - 0xf0910a08u, - 0x101u, - 0x2000300u, - 0xc94bc631u, - 0xf191f091u, - 0x400200u, - 0x1808861u, - 0x8d30f191u, - 0xf0910000u, - 0x1800400u, - 0x5000201u, - 0x300c863u, - 0xce31f191u, - 0xf0910a00u, - 0x400200u, - 0x1808869u, - 0x8d30f191u, - 0xf0910a08u, - 0x800100u, - 0x88698d30u, - 0xf191f091u, - 0xa000000u, - 0x1800400u, - 0x5000201u, - 0x300c86bu, - 0xce31f191u, - 0xf0910a08u, - 0x800100u, - 0x4000500u, - 0x2000300u, - 0xc86bce31u, - 0xf191f091u, - 0x808738u, - 0xf111f091u, - 0x5a0300u, - 0x1aa02f0u, - 0x8d319190u, - 0xf191f091u, - 0x5c013au, - 0x6000700u, - 0x2a5035au, - 0x4f90560u, - 0xce33c711u, - 0xf191f091u, - 0xa5015bu, - 0xa5a5a45au, - 0xf7e5f8a5u, - 0xc4b5f191u, - 0xf0918030u, - 0xf0d18020u, - 0x4000a19fu, - 0xa056c020u, - 0xf0910202u, - 0x300c121u, - 0xc030f091u, - 0xf091e065u, - 0x14400u, - 0xa9a8a802u, - 0x4000504u, - 0x2ff03e0u, - 0xc005400u, - 0x822103cu, - 0xc129c131u, - 0xe177f091u, - 0xe003f091u, - 0x822103cu, - 0xc038f091u, - 0xf091f091u, - 0xf091f091u, - 0xf091f091u, - 0xf091f091u, - 0xf091f091u, - 0x822123cu, - 0xd038f091u, - 0xc111c038u, - 0xf091e21fu, - 0xf0910200u, - 0x304c129u, - 0xc231e113u, - 0xf0914100u, - 0xa39fa256u, - 0xad8fac7eu, - 0x210f05du, - 0x300f091u, - 0xc405000u, - 0xad97acecu, - 0x2bc03dau, - 0x400aa1bcu, - 0xa0def131u, - 0xc531f19du, - 0x410aa3bcu, - 0xa2d0f031u, - 0x10701272u, - 0xc531f19du, - 0x10401241u, - 0x8930f19du, - 0x4100a3a6u, - 0xa2004206u, - 0xa578a49au, - 0xc032f935u, - 0xc022f091u, - 0x2780396u, - 0xc531f19du, - 0xf091c022u, - 0xf4394306u, - 0xa778a690u, - 0x10741276u, - 0xc131f19du, - 0x10421243u, - 0x8130f19du, - 0x4100a3a6u, - 0xa200a523u, - 0xa4454201u, - 0xa7cda6efu, - 0x430ba912u, - 0xa834440fu, - 0xabedaac0u, - 0x450f08d4u, - 0xf9354000u, - 0xa1a6a008u, - 0x10701272u, - 0xc131f19du, - 0x10401241u, - 0x8130f19du, - 0x4100a3a6u, - 0xa200c022u, - 0xf0910223u, - 0x341c531u, - 0xf19df091u, - 0xc0a2f091u, - 0x2cd03ebu, - 0xc531f19du, - 0xf091c122u, - 0xf0910212u, - 0x33fc531u, - 0xf19df091u, - 0xc1a2f091u, - 0x2ed03cfu, - 0xc531f19du, - 0xa500a400u, - 0xa700a600u, - 0xa900a800u, - 0xab00aa00u, - 0x8c4f439u, - 0x4000a1a6u, - 0xa0081070u, - 0x1272c131u, - 0xf19d4001u, - 0xa123a040u, - 0x10701274u, - 0xc131f19du, - 0x10401242u, - 0x8130f19du, - 0x400ba1cdu, - 0xa0e01070u, - 0x1276c131u, - 0xf19d1040u, - 0x12438130u, - 0xf19d400fu, - 0xa112a030u, - 0x10701278u, - 0xc131f19du, - 0x10401244u, - 0x8130f19du, - 0x400fa1edu, - 0xa0c01070u, - 0x127ac131u, - 0xf19d1040u, - 0x12458130u, - 0xe113f091u, - 0x4100a39fu, - 0xa256ad8fu, - 0xac7e0220u, - 0xf05d0300u, - 0x4000a198u, - 0xa08a0100u, - 0xff0200u, - 0x9076860u, - 0x8d31f191u, - 0xf0918140u, - 0x8172e5f3u, - 0xf09102ffu, - 0x68608d31u, - 0xf191f091u, - 0x2000300u, - 0xff01ffu, - 0x4000500u, - 0x90f6960u, - 0xce33f191u, - 0xf091c141u, - 0xc175e5f3u, - 0xf09104ffu, - 0x5ff6960u, - 0xce33f191u, - 0xf0910100u, - 0x201u, - 0x9076840u, - 0x8d31f191u, - 0xf0918170u, - 0x8942e5f3u, - 0xf0910200u, - 0x3000000u, - 0x1000400u, - 0x501090fu, - 0x6940ce33u, - 0xf191f091u, - 0xc171c945u, - 0xe5f3f091u, - 0x8030f0d1u, - 0x80204000u, - 0xa19fa056u, - 0xc020f091u, - 0x2010300u, - 0xc121c030u, - 0xf091f091u, - 0xe0650001u, - 0x4000a19au, - 0xa0920100u, - 0x1a599u, - 0xa42ef015u, - 0xf0910102u, - 0x88b0f191u, - 0xf0910100u, - 0x3e019u, - 0xf0910104u, - 0x88b0f191u, - 0xf0910100u, - 0x5a599u, - 0xa4420a04u, - 0xf115f091u, - 0x10388b0u, - 0xf191f091u, - 0x1000004u, - 0xe05df091u, - 0x10688b0u, - 0xf191f091u, - 0x1000007u, - 0xa599a458u, - 0xa08f215u, - 0xf0910108u, - 0x88b0f191u, - 0xf0910100u, - 0x9a599u, - 0xa46e0a02u, - 0xf395f091u, - 0x10a88b0u, - 0xf191f091u, - 0x100000bu, - 0xa599a49au, - 0xa01f415u, - 0xf0910101u, - 0x88b0f191u, - 0xf0910100u, - 0x2a598u, - 0xa4b6f015u, - 0xf0910105u, - 0x88b0f191u, - 0xf0910100u, - 0x6a598u, - 0xa4ec0a0au, - 0xf195f091u, - 0x10788b0u, - 0xf191f091u, - 0x1000008u, - 0xa599a402u, - 0xa07f295u, - 0xf0910109u, - 0x88b0f191u, - 0xf0910100u, - 0xaa599u, - 0xa4180a0du, - 0xf315f091u, - 0x10c88b0u, - 0xf191f091u, - 0x90e0000u, - 0x10fa599u, - 0xa4acf015u, - 0xf091010bu, - 0x88b0f191u, - 0xf0910100u, - 0xc0a08u, - 0xe25bf091u, - 0x8170f595u, - 0xf09188b0u, - 0xf191f091u, - 0x100u, - 0x2ff037fu, - 0x14704200u, - 0xa5a8a402u, - 0xe034f091u, - 0xa199a0f2u, - 0xf051f091u, - 0xa5a8a402u, - 0xe024f091u, - 0xb06c9930u, - 0xf191f091u, - 0x99b1f191u, - 0xf091ad9au, - 0xac8af01du, - 0xf0910601u, - 0x8320a19au, - 0xa006f051u, - 0xf0910640u, - 0x8721f0d1u, - 0xf0910602u, - 0x8320a19au, - 0xa01af051u, - 0xf0910620u, - 0x8721f0d1u, - 0xf0910604u, - 0x8320a19au, - 0xa02ef051u, - 0xf0910610u, - 0x8721f0d1u, - 0xf0910608u, - 0x8320a19au, - 0xa042f051u, - 0xf0910608u, - 0x8721f0d1u, - 0xf0910610u, - 0x8320a19au, - 0xa056f051u, - 0xf0910604u, - 0x8721f0d1u, - 0xf0910620u, - 0x8320a19au, - 0xa06af051u, - 0xf0910602u, - 0x8721f0d1u, - 0xf0910640u, - 0x8320147cu, - 0xad9aac80u, - 0xf05df091u, - 0x6018721u, - 0xf0d1f091u, - 0x6808320u, - 0xbc6cf0d1u, - 0xf091f091u, - 0x8030f0d1u, - 0x80204000u, - 0xa19fa056u, - 0xc020f091u, - 0x2040300u, - 0xc121c030u, - 0xf091e06bu, - 0x14000u, - 0xa1a8a000u, - 0x107ec030u, - 0xf0914100u, - 0xa39da2f6u, - 0x4000a19du, - 0xa0f61070u, - 0x4200a5a8u, - 0xa402c034u, - 0xf091a055u, - 0x10510155u, - 0x88b0f193u, - 0xf091a0aau, - 0x105101aau, - 0x88b0f193u, - 0xf091a155u, - 0x10500155u, - 0x88b0f193u, - 0xf091a1aau, - 0x105001aau, - 0x88b0f193u, - 0xf091a15au, - 0xa0a51070u, - 0x25a03a5u, - 0xc931f193u, - 0xf091a1a5u, - 0xa05a1070u, - 0x2a5035au, - 0xc931f193u, - 0xf0914200u, - 0xa5a8a402u, - 0xe024f091u, - 0xb06ca255u, - 0xa455a655u, - 0xa855aa55u, - 0xac55ae55u, - 0xa3aaa5aau, - 0xa7aaa9aau, - 0xabaaadaau, - 0xafaa0155u, - 0x105388b0u, - 0xf191f091u, - 0x105588b0u, - 0xf191f091u, - 0x105788b0u, - 0xf191f091u, - 0x105988b0u, - 0xf191f091u, - 0x105b88b0u, - 0xf191f091u, - 0x105d88b0u, - 0xf191f091u, - 0x105f88b0u, - 0xf191f091u, - 0x1aa1052u, - 0x88b0f191u, - 0xf0911054u, - 0x88b0f191u, - 0xf0911056u, - 0x88b0f191u, - 0xf0911058u, - 0x88b0f191u, - 0xf091105au, - 0x88b0f191u, - 0xf091105cu, - 0x88b0f191u, - 0xf091105eu, - 0x88b0f191u, - 0xf091a2aau, - 0xa4aaa6aau, - 0xa8aaaaaau, - 0xacaaaeaau, - 0xa355a555u, - 0xa755a955u, - 0xab55ad55u, - 0xaf5501aau, - 0x105388b0u, - 0xf191f091u, - 0x105588b0u, - 0xf191f091u, - 0x105788b0u, - 0xf191f091u, - 0x105988b0u, - 0xf191f091u, - 0x105b88b0u, - 0xf191f091u, - 0x105d88b0u, - 0xf191f091u, - 0x105f88b0u, - 0xf191f091u, - 0x1551052u, - 0x88b0f191u, - 0xf0911054u, - 0x88b0f191u, - 0xf0911056u, - 0x88b0f191u, - 0xf0911058u, - 0x88b0f191u, - 0xf091105au, - 0x88b0f191u, - 0xf091105cu, - 0x88b0f191u, - 0xf091105eu, - 0x88b0a35au, - 0xa2a5a55au, - 0xa4a5a75au, - 0xa6a5a95au, - 0xa8a5ab5au, - 0xaaa5ad5au, - 0xaca5af5au, - 0xaea5025au, - 0x3a51072u, - 0xc931f191u, - 0xf0911074u, - 0xc931f191u, - 0xf0911076u, - 0xc931f191u, - 0xf0911078u, - 0xc931f191u, - 0xf091107au, - 0xc931f191u, - 0xf091107eu, - 0xc931f191u, - 0xf091a3a5u, - 0xa25aa5a5u, - 0xa45aa7a5u, - 0xa65aa9a5u, - 0xa85aaba5u, - 0xaa5aada5u, - 0xac5aafa5u, - 0xae5a02a5u, - 0x35a1072u, - 0xc931f191u, - 0xf0911074u, - 0xc931f191u, - 0xf0911076u, - 0xc931f191u, - 0xf0911078u, - 0xc931f191u, - 0xf091107au, - 0xc931f191u, - 0xf091107eu, - 0xc931f191u, - 0xf0910055u, - 0x11481249u, - 0x134a144bu, - 0x154c164du, - 0x174e80b0u, - 0xf191f091u, - 0x8531f191u, - 0xf09189b2u, - 0xf191f091u, - 0x8e33f191u, - 0xf09192b4u, - 0xf191f091u, - 0x9735f191u, - 0xf0919bb6u, - 0xf191f091u, - 0xaa1148u, - 0x1249134au, - 0x144b154cu, - 0x164d174eu, - 0x80b0f191u, - 0xf0918531u, - 0xf191f091u, - 0x89b2f191u, - 0xf0918e33u, - 0xf191f091u, - 0x92b4f191u, - 0xf0919735u, - 0xf191f091u, - 0x9bb6f191u, - 0xf091005au, - 0x1a51268u, - 0x146a166cu, - 0xc131f191u, - 0xf091c633u, - 0xf191f091u, - 0xcb35f191u, - 0xf09100a5u, - 0x15a1268u, - 0x146a166cu, - 0xc131f191u, - 0xf091c633u, - 0xf191f091u, - 0xcb35f191u, - 0xf09109aau, - 0x1aa080bu, - 0x101c88b0u, - 0xf191f091u, - 0x9550155u, - 0x80b101cu, - 0x88b0f191u, - 0xf0910808u, - 0x101c4200u, - 0xa5a8a402u, - 0xc014f091u, - 0xa0a010au, - 0x808101cu, - 0x88b0f191u, - 0xf0910a05u, - 0x1050808u, - 0x101c88b0u, - 0xf191f091u, - 0x4200a5a8u, - 0xa402c024u, - 0xf0911a48u, - 0x80304000u, - 0xa1a8a000u, - 0xd020f091u, - 0xbe6af0d1u, - 0x80204000u, - 0xa19fa056u, - 0xc020f091u, - 0x2080300u, - 0xc121c030u, - 0xf091e05bu, - 0x10000u, - 0x9e20u, - 0x9e600000u, - 0x9ea0u, - 0x9ee00000u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x20002u, - 0x20002u, - 0x20002u, - 0x20002u, - 0x202fau, - 0x201fec1u, - 0x3f40000u, - 0x0u, - 0xffff0000u, - 0xffff0000u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x9f70ffffu, - 0x0u, - 0x9f56u, - 0xf00000u, - 0x0u, - 0x0u, - 0x0u, - 0x4000102u, - 0x506u, - 0x8000000u, - 0x2000000u, - 0xbbccddeeu, - 0x0u, - 0x0u, - 0x0u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xa8200080u, - 0xffffa820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x80a820u, - 0x800000u, - 0x7e7e1e1eu, - 0xaa5500ffu, - 0x3e3e9e9eu, - 0x7e7effffu, - 0x0u, - 0x0u, - 0x9009f5cu, - 0x0u, - 0xa009f60u, - 0x0u, - 0x9f64u, - 0x0u, - 0x8009f68u, - 0x0u, - 0x8009f6cu, - 0x0u, - 0x1u, - 0x204080fu, - 0x1017181bu, - 0x1d1e1f23u, - 0x25262729u, - 0x2a2b2c2du, - 0x2e313233u, - 0x34353639u, - 0x3a3c4345u, - 0x4647494au, - 0x4b4c4d4eu, - 0x51525354u, - 0x5556595au, - 0x5c636566u, - 0x67696a6bu, - 0x6c6d6e71u, - 0x72737475u, - 0x76797a7cu, - 0x80818284u, - 0x888f9097u, - 0x989b9d9eu, - 0x9fa3a5a6u, - 0xa7a9aaabu, - 0xacadaeb1u, - 0xb2b3b4b5u, - 0xb6b9babcu, - 0xc3c5c6c7u, - 0xc9cacbccu, - 0xcdced1d2u, - 0xd3d4d5d6u, - 0xd9dadce0u, - 0xe1e2e4e8u, - 0xefff8000u, - 0x0u, - 0x139u, - 0x0u, - 0xffffu, - 0xffff0000u, - 0x1u, - 0x2030405u, - 0x6070809u, - 0xa0b0c0du, - 0xe0f0000u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0xa1d0u, - 0x0u, - 0x0u, - 0x0u, - 0xa1e0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u, - 0x0u -}; - -size_t socal_ucode_size = sizeof (socal_ucode); diff --git a/usr/src/uts/sun4u/Makefile.sun4u b/usr/src/uts/sun4u/Makefile.sun4u index f170d03d11..0979312bb1 100644 --- a/usr/src/uts/sun4u/Makefile.sun4u +++ b/usr/src/uts/sun4u/Makefile.sun4u @@ -376,7 +376,6 @@ DRV_KMODS += trapstat DRV_KMODS += rmc_comm DRV_KMODS += rmcadm DRV_KMODS += rmclomv -DRV_KMODS += sf DRV_KMODS += nxge DRV_KMODS += mem_cache diff --git a/usr/src/uts/sun4u/sf/Makefile b/usr/src/uts/sun4u/sf/Makefile deleted file mode 100644 index 2f15513819..0000000000 --- a/usr/src/uts/sun4u/sf/Makefile +++ /dev/null @@ -1,96 +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 -# -# -# uts/sun4u/sf/Makefile -# -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# Copyright (c) 2011 Bayard G. Bell. All rights reserved. -# -# This makefile drives the production of the sf driver kernel module. -# -# sun4u architecture dependent -# - -# -# Path to the base of the uts directory tree (usually /usr/src/uts). -# -UTSBASE = ../.. - -# -# Define the module and object file sets. -# -MODULE = sf -OBJECTS = $(SF_OBJS:%=$(OBJS_DIR)/%) -ROOTMODULE = $(ROOT_PSM_DRV_DIR)/$(MODULE) -CONF_SRCDIR = $(UTSBASE)/sun/io/scsi/adapters - - -# -# Include common rules. -# -include $(UTSBASE)/sun4u/Makefile.sun4u - -# -# Define targets -# -ALL_TARGET = $(BINARY) $(SRC_CONFFILE) -INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE) - -# -# Overrides -# -CFLAGS += $(CCVERBOSE) - -# -# Define dependency on scsi -# -LDFLAGS += -N misc/scsi - -# -# For now, disable these warnings; maintainers should endeavor -# to investigate and remove these for maximum coverage. -# Please do not carry these forward to new Makefiles. -# - -CERRWARN += -_gcc=-Wno-unused-value -CERRWARN += -_gcc=-Wno-parentheses -CERRWARN += $(CNOWARN_UNINIT) - -# -# Default build targets. -# -.KEEP_STATE: - -def: $(DEF_DEPS) - -all: $(ALL_DEPS) - -clean: $(CLEAN_DEPS) - -clobber: $(CLOBBER_DEPS) - -install: $(INSTALL_DEPS) - -# -# Include common targets. -# -include $(UTSBASE)/sun4u/Makefile.targ |