#ifndef _DMI_IOCTL_H_ #define _DMI_IOCTL_H_ /*************************************************************************** * * * Copyright 1998 LSI Logic Corporation. All rights reserved. * * * * This file is confidential and a trade secret of LSI Logic. The * * receipt of or possession of this file does not convey any rights to * * reproduce or disclose its contents or to manufacture, use, or sell * * anything it may describe, in whole, or in part, without the specific * * written consent of LSI Logic Corporation. * * * ***************************************************************************/ /* Name: DMI_IOCTL.H * Title: Solaris O/S Character mode IOCTL definitions * Programmer: Russell A. Johnson * Creation Date: May 26, 1998 * * Version History * --------------- * * Date Who? Description * -------- ---- ------------------------------------------------------- #BeginRevision * 05/17/00 RAJ Added bus mode support for fibre channel devices. * 12/19/99 RAJ Added new flags for scsi-3 options. * 11/09/98 RAJ Changed copyright notice to LSI Logic. #EndRevision * Version 4.02.01 * 07/22/98 RAJ Added some more data to the DMI data structure. This * includes the PCI bus number, device number, and function * number. Also added a major version number for the data * structure. That version number indicates major changes. * When it changes then the entire data format may have * changed. See the comments below for more details. #EndRevision * Version 4.00.04 * 05/26/98 RAJ Initial version. #EndRevision * #BeginDescription * * This file contains the Solaris 2.6 character mode driver interface * definitions needed in order to provide IOCTL's for our SCSI HBA driver. * #EndDescription * *------------------------------------------------------------------------- */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * HEADER FILE DEPENDANCIES *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * * This file is dependent on the following files: * * SALIOS.H - type defintions UINT8, UINT16, UINT32, UINT64 */ /* The following data is for our character mode ioctl interface. Per the * Solaris standard mechanism, we define SYMIOCTL as a unique number in the * upper 8 bits and a command value in the lower 8 bits. */ #define SYMIOCTL ('H' << 8) #define SYMIOCTL_GET_DMI_DATA (SYMIOCTL | 1) #define SYMIOCTL_GET_TIMERS (SYMIOCTL | 2) #define SYMIOCTL_UPDATE_FLASH (SYMIOCTL | 3) #define SYMIOCTL_RESET_ADAPTER (SYMIOCTL | 4) #define SYMIOCTL_GET_PROPERTY (SYMIOCTL | 5) #define SYMIOCTL_PASS_THRU (SYMIOCTL | 6) #define SYMIOCTL_REG_ACCESS (SYMIOCTL | 7) #define SYMIOCTL_EVENT_QUERY (SYMIOCTL | 8) #define SYMIOCTL_EVENT_ENABLE (SYMIOCTL | 9) #define SYMIOCTL_EVENT_REPORT (SYMIOCTL | 10) #define SYMIOCTL_GET_PCI_INFO (SYMIOCTL | 11) #define SYMIOCTL_BTDH_MAPPING (SYMIOCTL | 12) #define SYMIOCTL_DIAG_ACTION (SYMIOCTL | 13) #define SYMIOCTL_PASS_THRU_TIMEOUT (SYMIOCTL | 14) /* The following are our ioctl() return status values. If everything went * well, we return good status. If the buffer length sent to us is too short * we return a status to tell the user. */ #define SYMIOCTL_STATUS_GOOD 0 #define SYMIOCTL_STATUS_LEN_TOO_SHORT 1 /* The data structures defined in this file are marked with a data structure * length and data structure version. The length value is the first value in * the structure and is used to make sure the buffer is large enough for * communication between the driver and the application. The version number is * a major version number. If the data structure changes and only has a new * element appended, then the version number will remain the same but the * length will increase. If the data structure changes in any other way, such * as re-arranging all of its elements, then the version number will increase. * * The following macro defines the current version number of the data * structure. */ #define SYMHI_DMI_DATA_VERSION 1 /* The following is the SYMIOCTL_GET_DMI_DATA data structure. This data * structure is setup so that we hopefully are properly aligned for both 32-bit * and 64-bit mode applications. * * StructureLength - This value is the amount of data the caller has allocated * for the structure when they first call us. After we have filled in the * structure, this indicates the length our data structure is. * * MajorVersion - This value is used by the driver to tell the application what * version of the data structure is being provided. It only changes if the * data ordering of the data below is changed. * * MinSyncPeriodNs - This is the minimum period in nano-seconds (ns) that we * will negotiate for on this adapter. The smaller value the faster * synchronous speed except if this value is zero then asynchronous transfers * is all we support. * * MaxWidth - This value indicates the maximum width this bus can be used as. * If the PciDeviceId indicates a width capability of 16 devices and this is * set to 8 devices then the PCI Subsystem ID value has limited our use of this * adapter to 8 devices. This value also indicates the number of valid * elements in the DevSpeed[] and DevWidth[] array's. * * HostScsiId - This is the host adapter SCSI ID being used by this adapter. * * PciBusNumber - The number of the PCI bus this adapter is on. If for some * reason the driver is unable to determine the bus number, device number, or * function number, these values will be set to 0xFF. * * PciDeviceNumber - The PCI device number for this device. * * PciFunctionNumber - The PCI function number for this device. * * PciDeviceId - This is the PCI device ID from PCI configuration space for * this adapter. * * PciRevision - This is the PCI revision value from PCI configuration space * for this adapter. * * HwBusMode - This value indicates the mode the bus is currently in. See the * SYM_HW_BUS_MODE_xx macros. * * DevSpeed - This array is indexed by the target ID and indicates the * currently negotiated synchronous speed in nano-seconds (ns). A value of * zero ns indicates asynchronous mode. * * DevWidth - This array is indexed by the target ID and indicates the * currently negotiated width in bits. A value of 8 indicates narrow mode, a * value of 16 indicates wide. * * DriverVersion - This is an ascii null-terminated string indicating the * version of this driver. * * DevFlags - This array is indexed by the target ID and indicates the * currently negotiated options such as DT and async protection capabilities. */ #pragma pack(1) typedef struct _SYMHI_DMI_DATA { /* Offset */ UINT32 StructureLength; /* 0x00..0x03 */ UINT32 Reserved1; /* 0x04..0x07 */ UINT32 MajorVersion; /* 0x08..0x0B */ UINT16 MinSyncPeriodNs; /* 0x0C..0x0D */ UINT8 MaxWidth; /* 0x0E */ UINT8 HostScsiId; /* 0x0F */ UINT8 PciBusNumber; /* 0x10 */ UINT8 PciDeviceNumber; /* 0x11 */ UINT8 PciFunctionNumber; /* 0x12 */ UINT8 Reserved2; /* 0x13 */ UINT16 PciDeviceId; /* 0x14..0x15 */ UINT8 PciRevision; /* 0x16 */ UINT8 HwBusMode; /* 0x17 */ UINT8 Reserved3[8]; /* 0x18..0x1F */ #if defined TARGET_MPTx /* MPI adapters can have many more devices per SCSI bus than non-MPI * adapters. */ UINT16 DevSpeed[256]; /* 0x20..0x21F */ UINT8 DevWidth[256]; /* 0x220..0x31F */ UINT32 DevFlags[256]; /* 0x320..0x71F */ char DriverVersion[80]; /* 0x720..0x76F */ #elif defined TARGET_HIHW || defined TARGET_SRHW UINT16 DevSpeed[16]; /* 0x20..0x3F */ UINT8 DevWidth[16]; /* 0x40..0x4F */ char DriverVersion[80]; /* 0x50..0x9F */ UINT32 DevFlags[16]; /* 0xA0..0xDF */ #else #error "Unknown hardware type" #endif /* defined TARGET_xxx */ } SYMHI_DMI_DATA, * PTR_SYMHI_DMI_DATA; #pragma pack() /* The following are definitions for the value of HwBusMode in the * SYMHI_DMI_DATA data structure. * * SYM_HW_BUS_MODE_UNKNOWN - The bus mode is not known yet * SYM_HW_BUS_MODE_SINGLE - The bus is in single ended mode * SYM_HW_BUS_MODE_HVD - The bus is in high voltage differential mode * SYM_HW_BUS_MODE_LVD - The bus is in low voltage differential mode * SYM_HW_BUS_MODE_FC - The bus is a fibre channel bus */ #define SYM_HW_BUS_MODE_UNKNOWN (0x00) #define SYM_HW_BUS_MODE_SINGLE (0x01) #define SYM_HW_BUS_MODE_HVD (0x02) #define SYM_HW_BUS_MODE_LVD (0x03) #define SYM_HW_BUS_MODE_FC (0x04) /* The following are definitions for the DevFlags[] array. Each bit is set * only when the feature is currently in use for the given device. * * SYM_DEV_DT - Set when Dual Transfers (ie. dual edge clock in use) enabled * SYM_DEV_ASYNC_PROT - Set when asynchronous phase protection is enabled */ #define SYM_DEV_DT (0x00000001) #define SYM_DEV_ASYNC_PROT (0x00000002) #pragma pack(1) typedef struct _SYM_UPDATE_FLASH { UINT64 PtrBuffer; UINT32 ImageChecksum; UINT32 ImageOffset; UINT32 ImageSize; UINT32 ImageType; } SYM_UPDATE_FLASH, * PTR_SYM_UPDATE_FLASH; #pragma pack() #pragma pack(1) typedef struct _SYM_GET_PROPERTY { UINT64 PtrName; UINT64 PtrBuffer; UINT32 NameLen; UINT32 BufferLen; UINT32 PropertyLen; } SYM_GET_PROPERTY, * PTR_SYM_GET_PROPERTY; #pragma pack() #define SYM_PASS_THRU_NONE 0 #define SYM_PASS_THRU_READ 1 #define SYM_PASS_THRU_WRITE 2 #define SYM_PASS_THRU_BOTH 3 #pragma pack(1) typedef struct _SYM_PASS_THRU { UINT64 PtrRequest; UINT64 PtrReply; UINT64 PtrData; UINT32 RequestSize; UINT32 ReplySize; UINT32 DataSize; UINT32 DataDirection; UINT64 PtrDataOut; UINT32 DataOutSize; } SYM_PASS_THRU, * PTR_SYM_PASS_THRU; #pragma pack() #pragma pack(1) typedef struct _SYM_PASS_THRU_TIMEOUT { UINT64 PtrRequest; UINT64 PtrReply; UINT64 PtrData; UINT32 RequestSize; UINT32 ReplySize; UINT32 DataSize; UINT32 DataDirection; UINT64 PtrDataOut; UINT32 DataOutSize; UINT32 Timeout; } SYM_PASS_THRU_TIMEOUT, * PTR_SYM_PASS_THRU_TIMEOUT; #pragma pack() #define REG_IO_READ 1 #define REG_IO_WRITE 2 #define REG_MEM_READ 3 #define REG_MEM_WRITE 4 #pragma pack(1) typedef struct _SYM_REG_ACCESS { UINT32 Command; UINT32 RegOffset; UINT32 RegData; } SYM_REG_ACCESS, * PTR_SYM_REG_ACCESS; #pragma pack() #pragma pack(1) typedef struct _SYM_EVENT_QUERY { UINT32 Entries; UINT32 Types; } SYM_EVENT_QUERY, * PTR_SYM_EVENT_QUERY; #pragma pack() #pragma pack(1) typedef struct _SYM_EVENT_ENABLE { UINT32 Types; } SYM_EVENT_ENABLE, * PTR_SYM_EVENT_ENABLE; #pragma pack() #if defined TARGET_MPT2 #define EVENT_ENTRY_NUM 48 #else #define EVENT_ENTRY_NUM 2 #endif #pragma pack(1) typedef struct _SYM_EVENT_ENTRY { UINT32 Type; UINT32 Number; UINT32 Data[EVENT_ENTRY_NUM]; } SYM_EVENT_ENTRY, * PTR_SYM_EVENT_ENTRY; #pragma pack() #pragma pack(1) typedef struct _SYM_EVENT_REPORT { UINT32 Size; SYM_EVENT_ENTRY Events[1]; } SYM_EVENT_REPORT, * PTR_SYM_EVENT_REPORT; #pragma pack() #pragma pack(1) typedef struct _SYM_PCI_INFO { UINT32 BusNumber; UINT8 DeviceNumber; UINT8 FunctionNumber; UINT16 InterruptVector; UINT8 PciHeader[256]; } SYM_PCI_INFO, * PTR_SYM_PCI_INFO; #pragma pack() #pragma pack(1) typedef struct _SYM_BTDH_MAPPING { UINT16 TargetID; UINT16 Bus; UINT16 DevHandle; UINT16 Reserved; } SYM_BTDH_MAPPING, * PTR_SYM_BTDH_MAPPING; #pragma pack() #pragma pack(1) typedef struct _SYM_DIAG_ACTION { UINT32 Action; UINT32 Length; UINT64 PtrDiagAction; UINT32 ReturnCode; } SYM_DIAG_ACTION, * PTR_SYM_DIAG_ACTION; #pragma pack() #define FW_DIAGNOSTIC_BUFFER_COUNT (3) #define FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) #define MPI_FW_DIAG_NEW (0x806E6577) #define MPI_FW_DIAG_TYPE_REGISTER (0x00000001) #define MPI_FW_DIAG_TYPE_UNREGISTER (0x00000002) #define MPI_FW_DIAG_TYPE_QUERY (0x00000003) #define MPI_FW_DIAG_TYPE_READ_BUFFER (0x00000004) #define MPI_FW_DIAG_TYPE_RELEASE (0x00000005) #define MPI_FW_DIAG_INVALID_UID (0x00000000) #define MPI_FW_DIAG_ERROR_SUCCESS (0x00000000) #define MPI_FW_DIAG_ERROR_FAILURE (0x00000001) #define MPI_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) #define MPI_FW_DIAG_ERROR_POST_FAILED (0x00000010) #define MPI_FW_DIAG_ERROR_INVALID_UID (0x00000011) #define MPI_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) #define MPI_FW_DIAG_ERROR_NO_BUFFER (0x00000013) #define MPI_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) #pragma pack(1) typedef struct _MPI_FW_DIAG_REGISTER { UINT8 TraceLevel; UINT8 BufferType; UINT16 Flags; UINT32 ExtendedType; UINT32 ProductSpecific[4]; UINT32 RequestedBufferSize; UINT32 UniqueId; } MPI_FW_DIAG_REGISTER, * PTR_MPI_FW_DIAG_REGISTER; #pragma pack() #pragma pack(1) typedef struct _MPI_FW_DIAG_UNREGISTER { UINT32 UniqueId; } MPI_FW_DIAG_UNREGISTER, * PTR_MPI_FW_DIAG_UNREGISTER; #pragma pack() #define MPI_FW_DIAG_FLAG_APP_OWNED (0x0001) #define MPI_FW_DIAG_FLAG_BUFFER_VALID (0x0002) #define MPI_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) #pragma pack(1) typedef struct _MPI_FW_DIAG_QUERY { UINT8 TraceLevel; UINT8 BufferType; UINT16 Flags; UINT32 ExtendedType; UINT32 ProductSpecific[4]; UINT32 TotalBufferSize; UINT32 DriverAddedBufferSize; UINT32 UniqueId; } MPI_FW_DIAG_QUERY, * PTR_MPI_FW_DIAG_QUERY; #pragma pack() #pragma pack(1) typedef struct _MPI_FW_DIAG_RELEASE { UINT32 UniqueId; } MPI_FW_DIAG_RELEASE, * PTR_MPI_FW_DIAG_RELEASE; #pragma pack() #define MPI_FW_DIAG_FLAG_REREGISTER (0x0001) #define MPI_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) #pragma pack(1) typedef struct _MPI_FW_DIAG_READ_BUFFER { UINT8 Status; UINT8 Reserved; UINT16 Flags; UINT32 StartingOffset; UINT32 BytesToRead; UINT32 UniqueId; UINT32 DataBuffer[1]; } MPI_FW_DIAG_READ_BUFFER, * PTR_MPI_FW_DIAG_READ_BUFFER; #pragma pack() #endif