Bring in the LSI-supported version of the mps(4) driver.
This involves significant changes to the mps(4) driver, but is not a complete rewrite. Some of the changes in this version of the driver: - Integrated RAID (IR) support. - Support for WarpDrive controllers. - Support for SCSI protection information (EEDP). - Support for TLR (Transport Level Retries), needed for tape drives. - Improved error recovery code. - ioctl interface compatible with LSI utilities. mps.4: Update the mps(4) driver man page somewhat for the driver changes. The list of supported hardware still needs to be updated to reflect the full list of supported cards. conf/files: Add the new driver files. mps/mpi/*: Updated version of the MPI header files, with a BSD style copyright. mps/*: See above for a description of the new driver features. modules/mps/Makefile: Add the new mps(4) driver files. Submitted by: Kashyap Desai <Kashyap.Desai@lsi.com> Reviewed by: ken MFC after: 1 week
This commit is contained in:
parent
276fa791b6
commit
d043c56453
@ -1469,8 +1469,11 @@ dev/mmc/mmcbus_if.m standard
|
||||
dev/mmc/mmcsd.c optional mmcsd
|
||||
dev/mn/if_mn.c optional mn pci
|
||||
dev/mps/mps.c optional mps
|
||||
dev/mps/mps_config.c optional mps
|
||||
dev/mps/mps_mapping.c optional mps
|
||||
dev/mps/mps_pci.c optional mps pci
|
||||
dev/mps/mps_sas.c optional mps
|
||||
dev/mps/mps_sas_lsi.c optional mps
|
||||
dev/mps/mps_table.c optional mps
|
||||
dev/mps/mps_user.c optional mps
|
||||
dev/mpt/mpt.c optional mpt
|
||||
|
@ -1,6 +1,35 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2009 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2.h
|
||||
@ -9,7 +38,7 @@
|
||||
* scatter/gather formats.
|
||||
* Creation Date: June 21, 2006
|
||||
*
|
||||
* mpi2.h Version: 02.00.14
|
||||
* mpi2.h Version: 02.00.18
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -58,6 +87,15 @@
|
||||
* Added MSI-x index mask and shift for Reply Post Host
|
||||
* Index register.
|
||||
* Added function code for Host Based Discovery Action.
|
||||
* 02-10-10 02.00.15 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* Added define for MPI2_FUNCTION_PWR_MGMT_CONTROL.
|
||||
* Added defines for product-specific range of message
|
||||
* function codes, 0xF0 to 0xFF.
|
||||
* 05-12-10 02.00.16 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* Added alternative defines for the SGE Direction bit.
|
||||
* 08-11-10 02.00.17 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* 11-10-10 02.00.18 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* Added MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR define.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -83,7 +121,7 @@
|
||||
#define MPI2_VERSION_02_00 (0x0200)
|
||||
|
||||
/* versioning for this MPI header set */
|
||||
#define MPI2_HEADER_VERSION_UNIT (0x0E)
|
||||
#define MPI2_HEADER_VERSION_UNIT (0x12)
|
||||
#define MPI2_HEADER_VERSION_DEV (0x00)
|
||||
#define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00)
|
||||
#define MPI2_HEADER_VERSION_UNIT_SHIFT (8)
|
||||
@ -476,8 +514,6 @@ typedef union _MPI2_REPLY_DESCRIPTORS_UNION
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Message Functions
|
||||
* 0x80 -> 0x8F reserved for private message use per product
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
@ -508,6 +544,9 @@ typedef union _MPI2_REPLY_DESCRIPTORS_UNION
|
||||
#define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) /* Target Command Buffer Post List */
|
||||
#define MPI2_FUNCTION_RAID_ACCELERATOR (0x2C) /* RAID Accelerator */
|
||||
#define MPI2_FUNCTION_HOST_BASED_DISCOVERY_ACTION (0x2F) /* Host Based Discovery Action */
|
||||
#define MPI2_FUNCTION_PWR_MGMT_CONTROL (0x30) /* Power Management Control */
|
||||
#define MPI2_FUNCTION_MIN_PRODUCT_SPECIFIC (0xF0) /* beginning of product-specific range */
|
||||
#define MPI2_FUNCTION_MAX_PRODUCT_SPECIFIC (0xFF) /* end of product-specific range */
|
||||
|
||||
|
||||
|
||||
@ -922,6 +961,9 @@ typedef struct _MPI2_MPI_SGE_UNION
|
||||
#define MPI2_SGE_FLAGS_IOC_TO_HOST (0x00)
|
||||
#define MPI2_SGE_FLAGS_HOST_TO_IOC (0x04)
|
||||
|
||||
#define MPI2_SGE_FLAGS_DEST (MPI2_SGE_FLAGS_IOC_TO_HOST)
|
||||
#define MPI2_SGE_FLAGS_SOURCE (MPI2_SGE_FLAGS_HOST_TO_IOC)
|
||||
|
||||
/* Address Size */
|
||||
|
||||
#define MPI2_SGE_FLAGS_32_BIT_ADDRESSING (0x00)
|
||||
@ -1046,11 +1088,11 @@ typedef struct _MPI2_IEEE_SGE_UNION
|
||||
/* Data Location Address Space */
|
||||
|
||||
#define MPI2_IEEE_SGE_FLAGS_ADDR_MASK (0x03)
|
||||
#define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR (0x00)
|
||||
#define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR (0x01)
|
||||
#define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR (0x00) /* IEEE Simple Element only */
|
||||
#define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR (0x01) /* IEEE Simple Element only */
|
||||
#define MPI2_IEEE_SGE_FLAGS_IOCPLB_ADDR (0x02)
|
||||
#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03)
|
||||
|
||||
#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03) /* IEEE Simple Element only */
|
||||
#define MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR (0x03) /* IEEE Chain Element only */
|
||||
|
||||
/****************************************************************************
|
||||
* IEEE SGE operation Macros
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2009 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_cnfg.h
|
||||
* Title: MPI Configuration messages and pages
|
||||
* Creation Date: November 10, 2006
|
||||
*
|
||||
* mpi2_cnfg.h Version: 02.00.13
|
||||
* mpi2_cnfg.h Version: 02.00.17
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -110,6 +139,31 @@
|
||||
* Added Ethernet configuration pages.
|
||||
* 10-28-09 02.00.13 Added MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY.
|
||||
* Added SAS PHY Page 4 structure and defines.
|
||||
* 02-10-10 02.00.14 Modified the comments for the configuration page
|
||||
* structures that contain an array of data. The host
|
||||
* should use the "count" field in the page data (e.g. the
|
||||
* NumPhys field) to determine the number of valid elements
|
||||
* in the array.
|
||||
* Added/modified some MPI2_MFGPAGE_DEVID_SAS defines.
|
||||
* Added PowerManagementCapabilities to IO Unit Page 7.
|
||||
* Added PortWidthModGroup field to
|
||||
* MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS.
|
||||
* Added MPI2_CONFIG_PAGE_SASIOUNIT_6 and related defines.
|
||||
* Added MPI2_CONFIG_PAGE_SASIOUNIT_7 and related defines.
|
||||
* Added MPI2_CONFIG_PAGE_SASIOUNIT_8 and related defines.
|
||||
* 05-12-10 02.00.15 Added MPI2_RAIDVOL0_STATUS_FLAG_VOL_NOT_CONSISTENT
|
||||
* define.
|
||||
* Added MPI2_PHYSDISK0_INCOMPATIBLE_MEDIA_TYPE define.
|
||||
* Added MPI2_SAS_NEG_LINK_RATE_UNSUPPORTED_PHY define.
|
||||
* 08-11-10 02.00.16 Removed IO Unit Page 1 device path (multi-pathing)
|
||||
* defines.
|
||||
* 11-10-10 02.00.17 Added ReceptacleID field (replacing Reserved1) to
|
||||
* MPI2_MANPAGE7_CONNECTOR_INFO and reworked defines for
|
||||
* the Pinout field.
|
||||
* Added BoardTemperature and BoardTemperatureUnits fields
|
||||
* to MPI2_CONFIG_PAGE_IO_UNIT_7.
|
||||
* Added MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING define
|
||||
* and MPI2_CONFIG_PAGE_EXT_MAN_PS structure.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -193,6 +247,7 @@ typedef union _MPI2_CONFIG_EXT_PAGE_HEADER_UNION
|
||||
#define MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING (0x17)
|
||||
#define MPI2_CONFIG_EXTPAGETYPE_SAS_PORT (0x18)
|
||||
#define MPI2_CONFIG_EXTPAGETYPE_ETHERNET (0x19)
|
||||
#define MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING (0x1A)
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
@ -322,7 +377,7 @@ typedef struct _MPI2_CONFIG_REQUEST
|
||||
#define MPI2_CONFIG_ACTION_PAGE_READ_NVRAM (0x06)
|
||||
#define MPI2_CONFIG_ACTION_PAGE_GET_CHANGEABLE (0x07)
|
||||
|
||||
/* values for SGLFlags field are in the SGL section of mpi2.h */
|
||||
/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
|
||||
|
||||
|
||||
/* Config Reply Message */
|
||||
@ -368,14 +423,19 @@ typedef struct _MPI2_CONFIG_REPLY
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2116_1 (0x0064)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2116_2 (0x0065)
|
||||
|
||||
#define MPI2_MFGPAGE_DEVID_SSS6200 (0x007E)
|
||||
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_1 (0x0080)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_2 (0x0081)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_3 (0x0082)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_4 (0x0083)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_5 (0x0084)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_6 (0x0085)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_7 (0x0086)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2208_8 (0x0087)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2308_1 (0x0086)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2308_2 (0x0087)
|
||||
#define MPI2_MFGPAGE_DEVID_SAS2308_3 (0x006E)
|
||||
|
||||
|
||||
|
||||
|
||||
/* Manufacturing Page 0 */
|
||||
@ -541,7 +601,7 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_4
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.PageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_MAN_PAGE_5_PHY_ENTRIES
|
||||
#define MPI2_MAN_PAGE_5_PHY_ENTRIES (1)
|
||||
@ -590,23 +650,31 @@ typedef struct _MPI2_MANPAGE7_CONNECTOR_INFO
|
||||
U32 Pinout; /* 0x00 */
|
||||
U8 Connector[16]; /* 0x04 */
|
||||
U8 Location; /* 0x14 */
|
||||
U8 Reserved1; /* 0x15 */
|
||||
U8 ReceptacleID; /* 0x15 */
|
||||
U16 Slot; /* 0x16 */
|
||||
U32 Reserved2; /* 0x18 */
|
||||
} MPI2_MANPAGE7_CONNECTOR_INFO, MPI2_POINTER PTR_MPI2_MANPAGE7_CONNECTOR_INFO,
|
||||
Mpi2ManPage7ConnectorInfo_t, MPI2_POINTER pMpi2ManPage7ConnectorInfo_t;
|
||||
|
||||
/* defines for the Pinout field */
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8484_L4 (0x00080000)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8484_L3 (0x00040000)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8484_L2 (0x00020000)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8484_L1 (0x00010000)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8470_L4 (0x00000800)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8470_L3 (0x00000400)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8470_L2 (0x00000200)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8470_L1 (0x00000100)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8482 (0x00000002)
|
||||
#define MPI2_MANPAGE7_PINOUT_CONNECTION_UNKNOWN (0x00000001)
|
||||
#define MPI2_MANPAGE7_PINOUT_LANE_MASK (0x0000FF00)
|
||||
#define MPI2_MANPAGE7_PINOUT_LANE_SHIFT (8)
|
||||
|
||||
#define MPI2_MANPAGE7_PINOUT_TYPE_MASK (0x000000FF)
|
||||
#define MPI2_MANPAGE7_PINOUT_TYPE_UNKNOWN (0x00)
|
||||
#define MPI2_MANPAGE7_PINOUT_SATA_SINGLE (0x01)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8482 (0x02)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8486 (0x03)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8484 (0x04)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8087 (0x05)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8643_4I (0x06)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8643_8I (0x07)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8470 (0x08)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8088 (0x09)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8644_4X (0x0A)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8644_8X (0x0B)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8644_16X (0x0C)
|
||||
#define MPI2_MANPAGE7_PINOUT_SFF_8436 (0x0D)
|
||||
|
||||
/* defines for the Location field */
|
||||
#define MPI2_MANPAGE7_LOCATION_UNKNOWN (0x01)
|
||||
@ -619,7 +687,7 @@ typedef struct _MPI2_MANPAGE7_CONNECTOR_INFO
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_MANPAGE7_CONNECTOR_INFO_MAX
|
||||
#define MPI2_MANPAGE7_CONNECTOR_INFO_MAX (1)
|
||||
@ -640,7 +708,7 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_7
|
||||
MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_7,
|
||||
Mpi2ManufacturingPage7_t, MPI2_POINTER pMpi2ManufacturingPage7_t;
|
||||
|
||||
#define MPI2_MANUFACTURING7_PAGEVERSION (0x00)
|
||||
#define MPI2_MANUFACTURING7_PAGEVERSION (0x01)
|
||||
|
||||
/* defines for the Flags field */
|
||||
#define MPI2_MANPAGE7_FLAG_USE_SLOT_INFO (0x00000001)
|
||||
@ -717,6 +785,7 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_1
|
||||
/* IO Unit Page 1 Flags defines */
|
||||
#define MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY (0x00000800)
|
||||
#define MPI2_IOUNITPAGE1_MASK_SATA_WRITE_CACHE (0x00000600)
|
||||
#define MPI2_IOUNITPAGE1_SATA_WRITE_CACHE_SHIFT (9)
|
||||
#define MPI2_IOUNITPAGE1_ENABLE_SATA_WRITE_CACHE (0x00000000)
|
||||
#define MPI2_IOUNITPAGE1_DISABLE_SATA_WRITE_CACHE (0x00000200)
|
||||
#define MPI2_IOUNITPAGE1_UNCHANGED_SATA_WRITE_CACHE (0x00000400)
|
||||
@ -724,15 +793,13 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_1
|
||||
#define MPI2_IOUNITPAGE1_DISABLE_IR (0x00000040)
|
||||
#define MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING (0x00000020)
|
||||
#define MPI2_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID (0x00000004)
|
||||
#define MPI2_IOUNITPAGE1_MULTI_PATHING (0x00000002)
|
||||
#define MPI2_IOUNITPAGE1_SINGLE_PATHING (0x00000000)
|
||||
|
||||
|
||||
/* IO Unit Page 3 */
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.PageLength at runtime.
|
||||
* one and check the value returned for GPIOCount at runtime.
|
||||
*/
|
||||
#ifndef MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX
|
||||
#define MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX (1)
|
||||
@ -761,7 +828,7 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_3
|
||||
|
||||
/*
|
||||
* Upper layer code (drivers, utilities, etc.) should leave this define set to
|
||||
* one and check Header.PageLength or NumDmaEngines at runtime.
|
||||
* one and check the value returned for NumDmaEngines at runtime.
|
||||
*/
|
||||
#ifndef MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES
|
||||
#define MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES (1)
|
||||
@ -826,15 +893,17 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_7
|
||||
U8 PCIeWidth; /* 0x06 */
|
||||
U8 PCIeSpeed; /* 0x07 */
|
||||
U32 ProcessorState; /* 0x08 */
|
||||
U32 Reserved2; /* 0x0C */
|
||||
U32 PowerManagementCapabilities; /* 0x0C */
|
||||
U16 IOCTemperature; /* 0x10 */
|
||||
U8 IOCTemperatureUnits; /* 0x12 */
|
||||
U8 IOCSpeed; /* 0x13 */
|
||||
U32 Reserved3; /* 0x14 */
|
||||
U16 BoardTemperature; /* 0x14 */
|
||||
U8 BoardTemperatureUnits; /* 0x16 */
|
||||
U8 Reserved3; /* 0x17 */
|
||||
} MPI2_CONFIG_PAGE_IO_UNIT_7, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_7,
|
||||
Mpi2IOUnitPage7_t, MPI2_POINTER pMpi2IOUnitPage7_t;
|
||||
|
||||
#define MPI2_IOUNITPAGE7_PAGEVERSION (0x00)
|
||||
#define MPI2_IOUNITPAGE7_PAGEVERSION (0x02)
|
||||
|
||||
/* defines for IO Unit Page 7 PCIeWidth field */
|
||||
#define MPI2_IOUNITPAGE7_PCIE_WIDTH_X1 (0x01)
|
||||
@ -855,6 +924,13 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_7
|
||||
#define MPI2_IOUNITPAGE7_PSTATE_DISABLED (0x01)
|
||||
#define MPI2_IOUNITPAGE7_PSTATE_ENABLED (0x02)
|
||||
|
||||
/* defines for IO Unit Page 7 PowerManagementCapabilities field */
|
||||
#define MPI2_IOUNITPAGE7_PMCAP_12_5_PCT_IOCSPEED (0x00000400)
|
||||
#define MPI2_IOUNITPAGE7_PMCAP_25_0_PCT_IOCSPEED (0x00000200)
|
||||
#define MPI2_IOUNITPAGE7_PMCAP_50_0_PCT_IOCSPEED (0x00000100)
|
||||
#define MPI2_IOUNITPAGE7_PMCAP_PCIE_WIDTH_CHANGE (0x00000008)
|
||||
#define MPI2_IOUNITPAGE7_PMCAP_PCIE_SPEED_CHANGE (0x00000004)
|
||||
|
||||
/* defines for IO Unit Page 7 IOCTemperatureUnits field */
|
||||
#define MPI2_IOUNITPAGE7_IOC_TEMP_NOT_PRESENT (0x00)
|
||||
#define MPI2_IOUNITPAGE7_IOC_TEMP_FAHRENHEIT (0x01)
|
||||
@ -866,6 +942,11 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_7
|
||||
#define MPI2_IOUNITPAGE7_IOC_SPEED_QUARTER (0x04)
|
||||
#define MPI2_IOUNITPAGE7_IOC_SPEED_EIGHTH (0x08)
|
||||
|
||||
/* defines for IO Unit Page 7 BoardTemperatureUnits field */
|
||||
#define MPI2_IOUNITPAGE7_BOARD_TEMP_NOT_PRESENT (0x00)
|
||||
#define MPI2_IOUNITPAGE7_BOARD_TEMP_FAHRENHEIT (0x01)
|
||||
#define MPI2_IOUNITPAGE7_BOARD_TEMP_CELSIUS (0x02)
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@ -1198,7 +1279,7 @@ typedef struct _MPI2_CONFIG_PAGE_BIOS_3
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.PageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_BIOS_PAGE_4_PHY_ENTRIES
|
||||
#define MPI2_BIOS_PAGE_4_PHY_ENTRIES (1)
|
||||
@ -1272,7 +1353,7 @@ typedef struct _MPI2_RAIDVOL0_SETTINGS
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.PageLength at runtime.
|
||||
* one and check the value returned for NumPhysDisks at runtime.
|
||||
*/
|
||||
#ifndef MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX
|
||||
#define MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX (1)
|
||||
@ -1329,6 +1410,7 @@ typedef struct _MPI2_CONFIG_PAGE_RAID_VOL_0
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION (0x00040000)
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT (0x00020000)
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS (0x00010000)
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_VOL_NOT_CONSISTENT (0x00000080)
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_OCE_ALLOWED (0x00000040)
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_BGI_COMPLETE (0x00000020)
|
||||
#define MPI2_RAIDVOL0_STATUS_FLAG_1E_OFFSET_MIRROR (0x00000000)
|
||||
@ -1451,11 +1533,15 @@ typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_0
|
||||
#define MPI2_PHYSDISK0_INCOMPATIBLE_MAX_LBA (0x03)
|
||||
#define MPI2_PHYSDISK0_INCOMPATIBLE_SATA_EXTENDED_CMD (0x04)
|
||||
#define MPI2_PHYSDISK0_INCOMPATIBLE_REMOVEABLE_MEDIA (0x05)
|
||||
#define MPI2_PHYSDISK0_INCOMPATIBLE_MEDIA_TYPE (0x06)
|
||||
#define MPI2_PHYSDISK0_INCOMPATIBLE_UNKNOWN (0xFF)
|
||||
|
||||
/* PhysDiskAttributes defines */
|
||||
#define MPI2_PHYSDISK0_ATTRIB_MEDIA_MASK (0x0C)
|
||||
#define MPI2_PHYSDISK0_ATTRIB_SOLID_STATE_DRIVE (0x08)
|
||||
#define MPI2_PHYSDISK0_ATTRIB_HARD_DISK_DRIVE (0x04)
|
||||
|
||||
#define MPI2_PHYSDISK0_ATTRIB_PROTOCOL_MASK (0x03)
|
||||
#define MPI2_PHYSDISK0_ATTRIB_SAS_PROTOCOL (0x02)
|
||||
#define MPI2_PHYSDISK0_ATTRIB_SATA_PROTOCOL (0x01)
|
||||
|
||||
@ -1474,7 +1560,7 @@ typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_0
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.PageLength or NumPhysDiskPaths at runtime.
|
||||
* one and check the value returned for NumPhysDiskPaths at runtime.
|
||||
*/
|
||||
#ifndef MPI2_RAID_PHYS_DISK1_PATH_MAX
|
||||
#define MPI2_RAID_PHYS_DISK1_PATH_MAX (1)
|
||||
@ -1527,6 +1613,7 @@ typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_1
|
||||
#define MPI2_SAS_NEG_LINK_RATE_SATA_OOB_COMPLETE (0x03)
|
||||
#define MPI2_SAS_NEG_LINK_RATE_PORT_SELECTOR (0x04)
|
||||
#define MPI2_SAS_NEG_LINK_RATE_SMP_RESET_IN_PROGRESS (0x05)
|
||||
#define MPI2_SAS_NEG_LINK_RATE_UNSUPPORTED_PHY (0x06)
|
||||
#define MPI2_SAS_NEG_LINK_RATE_1_5 (0x08)
|
||||
#define MPI2_SAS_NEG_LINK_RATE_3_0 (0x09)
|
||||
#define MPI2_SAS_NEG_LINK_RATE_6_0 (0x0A)
|
||||
@ -1553,6 +1640,7 @@ typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_1
|
||||
#define MPI2_SAS_PHYINFO_PHY_VACANT (0x80000000)
|
||||
|
||||
#define MPI2_SAS_PHYINFO_PHY_POWER_CONDITION_MASK (0x18000000)
|
||||
#define MPI2_SAS_PHYINFO_SHIFT_PHY_POWER_CONDITION (27)
|
||||
#define MPI2_SAS_PHYINFO_PHY_POWER_ACTIVE (0x00000000)
|
||||
#define MPI2_SAS_PHYINFO_PHY_POWER_PARTIAL (0x08000000)
|
||||
#define MPI2_SAS_PHYINFO_PHY_POWER_SLUMBER (0x10000000)
|
||||
@ -1636,7 +1724,7 @@ typedef struct _MPI2_SAS_IO_UNIT0_PHY_DATA
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SAS_IOUNIT0_PHY_MAX
|
||||
#define MPI2_SAS_IOUNIT0_PHY_MAX (1)
|
||||
@ -1707,7 +1795,7 @@ typedef struct _MPI2_SAS_IO_UNIT1_PHY_DATA
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SAS_IOUNIT1_PHY_MAX
|
||||
#define MPI2_SAS_IOUNIT1_PHY_MAX (1)
|
||||
@ -1798,7 +1886,7 @@ typedef struct _MPI2_SAS_IOUNIT4_SPINUP_GROUP
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* four and check Header.ExtPageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SAS_IOUNIT4_PHY_MAX
|
||||
#define MPI2_SAS_IOUNIT4_PHY_MAX (4)
|
||||
@ -1837,7 +1925,7 @@ typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_4
|
||||
typedef struct _MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS
|
||||
{
|
||||
U8 ControlFlags; /* 0x00 */
|
||||
U8 Reserved1; /* 0x01 */
|
||||
U8 PortWidthModGroup; /* 0x01 */
|
||||
U16 InactivityTimerExponent; /* 0x02 */
|
||||
U8 SATAPartialTimeout; /* 0x04 */
|
||||
U8 Reserved2; /* 0x05 */
|
||||
@ -1857,6 +1945,9 @@ typedef struct _MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS
|
||||
#define MPI2_SASIOUNIT5_CONTROL_SATA_SLUMBER_ENABLE (0x02)
|
||||
#define MPI2_SASIOUNIT5_CONTROL_SATA_PARTIAL_ENABLE (0x01)
|
||||
|
||||
/* defines for PortWidthModeGroup field */
|
||||
#define MPI2_SASIOUNIT5_PWMG_DISABLE (0xFF)
|
||||
|
||||
/* defines for InactivityTimerExponent field */
|
||||
#define MPI2_SASIOUNIT5_ITE_MASK_SAS_SLUMBER (0x7000)
|
||||
#define MPI2_SASIOUNIT5_ITE_SHIFT_SAS_SLUMBER (12)
|
||||
@ -1878,7 +1969,7 @@ typedef struct _MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumPhys at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SAS_IOUNIT5_PHY_MAX
|
||||
#define MPI2_SAS_IOUNIT5_PHY_MAX (1)
|
||||
@ -1896,7 +1987,137 @@ typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_5
|
||||
MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_5,
|
||||
Mpi2SasIOUnitPage5_t, MPI2_POINTER pMpi2SasIOUnitPage5_t;
|
||||
|
||||
#define MPI2_SASIOUNITPAGE5_PAGEVERSION (0x00)
|
||||
#define MPI2_SASIOUNITPAGE5_PAGEVERSION (0x01)
|
||||
|
||||
|
||||
/* SAS IO Unit Page 6 */
|
||||
|
||||
typedef struct _MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS
|
||||
{
|
||||
U8 CurrentStatus; /* 0x00 */
|
||||
U8 CurrentModulation; /* 0x01 */
|
||||
U8 CurrentUtilization; /* 0x02 */
|
||||
U8 Reserved1; /* 0x03 */
|
||||
U32 Reserved2; /* 0x04 */
|
||||
} MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS,
|
||||
MPI2_POINTER PTR_MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS,
|
||||
Mpi2SasIOUnit6PortWidthModGroupStatus_t,
|
||||
MPI2_POINTER pMpi2SasIOUnit6PortWidthModGroupStatus_t;
|
||||
|
||||
/* defines for CurrentStatus field */
|
||||
#define MPI2_SASIOUNIT6_STATUS_UNAVAILABLE (0x00)
|
||||
#define MPI2_SASIOUNIT6_STATUS_UNCONFIGURED (0x01)
|
||||
#define MPI2_SASIOUNIT6_STATUS_INVALID_CONFIG (0x02)
|
||||
#define MPI2_SASIOUNIT6_STATUS_LINK_DOWN (0x03)
|
||||
#define MPI2_SASIOUNIT6_STATUS_OBSERVATION_ONLY (0x04)
|
||||
#define MPI2_SASIOUNIT6_STATUS_INACTIVE (0x05)
|
||||
#define MPI2_SASIOUNIT6_STATUS_ACTIVE_IOUNIT (0x06)
|
||||
#define MPI2_SASIOUNIT6_STATUS_ACTIVE_HOST (0x07)
|
||||
|
||||
/* defines for CurrentModulation field */
|
||||
#define MPI2_SASIOUNIT6_MODULATION_25_PERCENT (0x00)
|
||||
#define MPI2_SASIOUNIT6_MODULATION_50_PERCENT (0x01)
|
||||
#define MPI2_SASIOUNIT6_MODULATION_75_PERCENT (0x02)
|
||||
#define MPI2_SASIOUNIT6_MODULATION_100_PERCENT (0x03)
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check the value returned for NumGroups at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SAS_IOUNIT6_GROUP_MAX
|
||||
#define MPI2_SAS_IOUNIT6_GROUP_MAX (1)
|
||||
#endif
|
||||
|
||||
typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_6
|
||||
{
|
||||
MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */
|
||||
U32 Reserved1; /* 0x08 */
|
||||
U32 Reserved2; /* 0x0C */
|
||||
U8 NumGroups; /* 0x10 */
|
||||
U8 Reserved3; /* 0x11 */
|
||||
U16 Reserved4; /* 0x12 */
|
||||
MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS
|
||||
PortWidthModulationGroupStatus[MPI2_SAS_IOUNIT6_GROUP_MAX]; /* 0x14 */
|
||||
} MPI2_CONFIG_PAGE_SASIOUNIT_6,
|
||||
MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_6,
|
||||
Mpi2SasIOUnitPage6_t, MPI2_POINTER pMpi2SasIOUnitPage6_t;
|
||||
|
||||
#define MPI2_SASIOUNITPAGE6_PAGEVERSION (0x00)
|
||||
|
||||
|
||||
/* SAS IO Unit Page 7 */
|
||||
|
||||
typedef struct _MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS
|
||||
{
|
||||
U8 Flags; /* 0x00 */
|
||||
U8 Reserved1; /* 0x01 */
|
||||
U16 Reserved2; /* 0x02 */
|
||||
U8 Threshold75Pct; /* 0x04 */
|
||||
U8 Threshold50Pct; /* 0x05 */
|
||||
U8 Threshold25Pct; /* 0x06 */
|
||||
U8 Reserved3; /* 0x07 */
|
||||
} MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS,
|
||||
MPI2_POINTER PTR_MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS,
|
||||
Mpi2SasIOUnit7PortWidthModGroupSettings_t,
|
||||
MPI2_POINTER pMpi2SasIOUnit7PortWidthModGroupSettings_t;
|
||||
|
||||
/* defines for Flags field */
|
||||
#define MPI2_SASIOUNIT7_FLAGS_ENABLE_PORT_WIDTH_MODULATION (0x01)
|
||||
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check the value returned for NumGroups at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SAS_IOUNIT7_GROUP_MAX
|
||||
#define MPI2_SAS_IOUNIT7_GROUP_MAX (1)
|
||||
#endif
|
||||
|
||||
typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_7
|
||||
{
|
||||
MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */
|
||||
U8 SamplingInterval; /* 0x08 */
|
||||
U8 WindowLength; /* 0x09 */
|
||||
U16 Reserved1; /* 0x0A */
|
||||
U32 Reserved2; /* 0x0C */
|
||||
U32 Reserved3; /* 0x10 */
|
||||
U8 NumGroups; /* 0x14 */
|
||||
U8 Reserved4; /* 0x15 */
|
||||
U16 Reserved5; /* 0x16 */
|
||||
MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS
|
||||
PortWidthModulationGroupSettings[MPI2_SAS_IOUNIT7_GROUP_MAX]; /* 0x18 */
|
||||
} MPI2_CONFIG_PAGE_SASIOUNIT_7,
|
||||
MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_7,
|
||||
Mpi2SasIOUnitPage7_t, MPI2_POINTER pMpi2SasIOUnitPage7_t;
|
||||
|
||||
#define MPI2_SASIOUNITPAGE7_PAGEVERSION (0x00)
|
||||
|
||||
|
||||
/* SAS IO Unit Page 8 */
|
||||
|
||||
typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_8
|
||||
{
|
||||
MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */
|
||||
U32 Reserved1; /* 0x08 */
|
||||
U32 PowerManagementCapabilities; /* 0x0C */
|
||||
U32 Reserved2; /* 0x10 */
|
||||
} MPI2_CONFIG_PAGE_SASIOUNIT_8,
|
||||
MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_8,
|
||||
Mpi2SasIOUnitPage8_t, MPI2_POINTER pMpi2SasIOUnitPage8_t;
|
||||
|
||||
#define MPI2_SASIOUNITPAGE8_PAGEVERSION (0x00)
|
||||
|
||||
/* defines for PowerManagementCapabilities field */
|
||||
#define MPI2_SASIOUNIT8_PM_HOST_PORT_WIDTH_MOD (0x000001000)
|
||||
#define MPI2_SASIOUNIT8_PM_HOST_SAS_SLUMBER_MODE (0x000000800)
|
||||
#define MPI2_SASIOUNIT8_PM_HOST_SAS_PARTIAL_MODE (0x000000400)
|
||||
#define MPI2_SASIOUNIT8_PM_HOST_SATA_SLUMBER_MODE (0x000000200)
|
||||
#define MPI2_SASIOUNIT8_PM_HOST_SATA_PARTIAL_MODE (0x000000100)
|
||||
#define MPI2_SASIOUNIT8_PM_IOUNIT_PORT_WIDTH_MOD (0x000000010)
|
||||
#define MPI2_SASIOUNIT8_PM_IOUNIT_SAS_SLUMBER_MODE (0x000000008)
|
||||
#define MPI2_SASIOUNIT8_PM_IOUNIT_SAS_PARTIAL_MODE (0x000000004)
|
||||
#define MPI2_SASIOUNIT8_PM_IOUNIT_SATA_SLUMBER_MODE (0x000000002)
|
||||
#define MPI2_SASIOUNIT8_PM_IOUNIT_SATA_PARTIAL_MODE (0x000000001)
|
||||
|
||||
|
||||
|
||||
@ -2187,7 +2408,7 @@ typedef struct _MPI2_SASPHY2_PHY_EVENT
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhyEvents at runtime.
|
||||
* one and check the value returned for NumPhyEvents at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SASPHY2_PHY_EVENT_MAX
|
||||
#define MPI2_SASPHY2_PHY_EVENT_MAX (1)
|
||||
@ -2280,7 +2501,7 @@ typedef struct _MPI2_SASPHY3_PHY_EVENT_CONFIG
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhyEvents at runtime.
|
||||
* one and check the value returned for NumPhyEvents at runtime.
|
||||
*/
|
||||
#ifndef MPI2_SASPHY3_PHY_EVENT_MAX
|
||||
#define MPI2_SASPHY3_PHY_EVENT_MAX (1)
|
||||
@ -2392,7 +2613,7 @@ typedef struct _MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumLogEntries at runtime.
|
||||
*/
|
||||
#ifndef MPI2_LOG_0_NUM_LOG_ENTRIES
|
||||
#define MPI2_LOG_0_NUM_LOG_ENTRIES (1)
|
||||
@ -2442,7 +2663,7 @@ typedef struct _MPI2_CONFIG_PAGE_LOG_0
|
||||
|
||||
/*
|
||||
* Host code (drivers, BIOS, utilities, etc.) should leave this define set to
|
||||
* one and check Header.ExtPageLength or NumPhys at runtime.
|
||||
* one and check the value returned for NumElements at runtime.
|
||||
*/
|
||||
#ifndef MPI2_RAIDCONFIG0_MAX_ELEMENTS
|
||||
#define MPI2_RAIDCONFIG0_MAX_ELEMENTS (1)
|
||||
@ -2642,5 +2863,25 @@ typedef struct _MPI2_CONFIG_PAGE_ETHERNET_1
|
||||
#define MPI2_ETHPG1_MS_DATA_RATE_1GBIT (0x03)
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Extended Manufacturing Config Pages
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Generic structure to use for product-specific extended manufacturing pages
|
||||
* (currently Extended Manufacturing Page 40 through Extended Manufacturing
|
||||
* Page 60).
|
||||
*/
|
||||
|
||||
typedef struct _MPI2_CONFIG_PAGE_EXT_MAN_PS
|
||||
{
|
||||
MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */
|
||||
U32 ProductSpecificInfo; /* 0x08 */
|
||||
} MPI2_CONFIG_PAGE_EXT_MAN_PS,
|
||||
MPI2_POINTER PTR_MPI2_CONFIG_PAGE_EXT_MAN_PS,
|
||||
Mpi2ExtManufacturingPagePS_t, MPI2_POINTER pMpi2ExtManufacturingPagePS_t;
|
||||
|
||||
/* PageVersion should be provided by product-specific code */
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2009 LSI Corporation.
|
||||
* Copyright (c) 2009-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_hbd.h
|
||||
* Title: MPI Host Based Discovery messages and structures
|
||||
* Creation Date: October 21, 2009
|
||||
*
|
||||
* mpi2_hbd.h Version: 02.00.00
|
||||
* mpi2_hbd.h Version: 02.00.01
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -15,6 +44,8 @@
|
||||
* Date Version Description
|
||||
* -------- -------- ------------------------------------------------------
|
||||
* 10-28-09 02.00.00 Initial version.
|
||||
* 08-11-10 02.00.01 Removed PortGroups, DmaGroup, and ControlGroup from
|
||||
* HBD Action request, replaced by AdditionalInfo field.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -48,10 +79,7 @@ typedef struct _MPI2_HBD_ACTION_REQUEST
|
||||
U8 Port; /* 0x25 */
|
||||
U8 MaxConnections; /* 0x26 */
|
||||
U8 MaxRate; /* 0x27 */
|
||||
U8 PortGroups; /* 0x28 */
|
||||
U8 DmaGroup; /* 0x29 */
|
||||
U8 ControlGroup; /* 0x2A */
|
||||
U8 Reserved6; /* 0x2B */
|
||||
U32 AdditionalInfo; /* 0x28 */
|
||||
U16 InitialAWT; /* 0x2C */
|
||||
U16 Reserved7; /* 0x2E */
|
||||
U32 Reserved8; /* 0x30 */
|
||||
|
@ -1,29 +1,58 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
==============================
|
||||
Fusion-MPT MPI 2.0 Header File Change History
|
||||
==============================
|
||||
|
||||
Copyright (c) 2000-2009 LSI Corporation.
|
||||
Copyright (c) 2000-2011 LSI Corporation.
|
||||
|
||||
---------------------------------------
|
||||
Header Set Release Version: 02.00.14
|
||||
Header Set Release Date: 10-28-09
|
||||
Header Set Release Version: 02.00.18
|
||||
Header Set Release Date: 11-10-10
|
||||
---------------------------------------
|
||||
|
||||
Filename Current version Prior version
|
||||
---------- --------------- -------------
|
||||
mpi2.h 02.00.14 02.00.13
|
||||
mpi2_cnfg.h 02.00.13 02.00.12
|
||||
mpi2_init.h 02.00.08 02.00.07
|
||||
mpi2_ioc.h 02.00.13 02.00.12
|
||||
mpi2_raid.h 02.00.04 02.00.04
|
||||
mpi2_sas.h 02.00.03 02.00.02
|
||||
mpi2_targ.h 02.00.03 02.00.03
|
||||
mpi2_tool.h 02.00.04 02.00.04
|
||||
mpi2.h 02.00.18 02.00.17
|
||||
mpi2_cnfg.h 02.00.17 02.00.16
|
||||
mpi2_init.h 02.00.11 02.00.10
|
||||
mpi2_ioc.h 02.00.16 02.00.15
|
||||
mpi2_raid.h 02.00.05 02.00.05
|
||||
mpi2_sas.h 02.00.05 02.00.05
|
||||
mpi2_targ.h 02.00.04 02.00.04
|
||||
mpi2_tool.h 02.00.06 02.00.06
|
||||
mpi2_type.h 02.00.00 02.00.00
|
||||
mpi2_ra.h 02.00.00 02.00.00
|
||||
mpi2_hbd.h 02.00.00
|
||||
mpi2_history.txt 02.00.14 02.00.13
|
||||
mpi2_hbd.h 02.00.01 02.00.01
|
||||
mpi2_history.txt 02.00.18 02.00.17
|
||||
|
||||
|
||||
* Date Version Description
|
||||
@ -72,6 +101,15 @@ mpi2.h
|
||||
* Added MSI-x index mask and shift for Reply Post Host
|
||||
* Index register.
|
||||
* Added function code for Host Based Discovery Action.
|
||||
* 02-10-10 02.00.15 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* Added define for MPI2_FUNCTION_PWR_MGMT_CONTROL.
|
||||
* Added defines for product-specific range of message
|
||||
* function codes, 0xF0 to 0xFF.
|
||||
* 05-12-10 02.00.16 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* Added alternative defines for the SGE Direction bit.
|
||||
* 08-11-10 02.00.17 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* 11-10-10 02.00.18 Bumped MPI2_HEADER_VERSION_UNIT.
|
||||
* Added MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR define.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_cnfg.h
|
||||
@ -171,6 +209,31 @@ mpi2_cnfg.h
|
||||
* Added Ethernet configuration pages.
|
||||
* 10-28-09 02.00.13 Added MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY.
|
||||
* Added SAS PHY Page 4 structure and defines.
|
||||
* 02-10-10 02.00.14 Modified the comments for the configuration page
|
||||
* structures that contain an array of data. The host
|
||||
* should use the "count" field in the page data (e.g. the
|
||||
* NumPhys field) to determine the number of valid elements
|
||||
* in the array.
|
||||
* Added/modified some MPI2_MFGPAGE_DEVID_SAS defines.
|
||||
* Added PowerManagementCapabilities to IO Unit Page 7.
|
||||
* Added PortWidthModGroup field to
|
||||
* MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS.
|
||||
* Added MPI2_CONFIG_PAGE_SASIOUNIT_6 and related defines.
|
||||
* Added MPI2_CONFIG_PAGE_SASIOUNIT_7 and related defines.
|
||||
* Added MPI2_CONFIG_PAGE_SASIOUNIT_8 and related defines.
|
||||
* 05-12-10 02.00.15 Added MPI2_RAIDVOL0_STATUS_FLAG_VOL_NOT_CONSISTENT
|
||||
* define.
|
||||
* Added MPI2_PHYSDISK0_INCOMPATIBLE_MEDIA_TYPE define.
|
||||
* Added MPI2_SAS_NEG_LINK_RATE_UNSUPPORTED_PHY define.
|
||||
* 08-11-10 02.00.16 Removed IO Unit Page 1 device path (multi-pathing)
|
||||
* defines.
|
||||
* 11-10-10 02.00.17 Added ReceptacleID field (replacing Reserved1) to
|
||||
* MPI2_MANPAGE7_CONNECTOR_INFO and reworked defines for
|
||||
* the Pinout field.
|
||||
* Added BoardTemperature and BoardTemperatureUnits fields
|
||||
* to MPI2_CONFIG_PAGE_IO_UNIT_7.
|
||||
* Added MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING define
|
||||
* and MPI2_CONFIG_PAGE_EXT_MAN_PS structure.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_init.h
|
||||
@ -192,6 +255,9 @@ mpi2_init.h
|
||||
* both SCSI IO Error Reply and SCSI Task Management Reply.
|
||||
* Added ResponseInfo field to MPI2_SCSI_TASK_MANAGE_REPLY.
|
||||
* Added MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG define.
|
||||
* 02-10-10 02.00.09 Removed unused structure that had "#if 0" around it.
|
||||
* 05-12-10 02.00.10 Added optional vendor-unique region to SCSI IO Request.
|
||||
* 11-10-10 02.00.11 Added MPI2_SCSIIO_NUM_SGLOFFSETS define.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_ioc.h
|
||||
@ -280,6 +346,12 @@ mpi2_ioc.h
|
||||
* (MPI2_FW_HEADER_PID_).
|
||||
* Modified values for SAS ProductID Family
|
||||
* (MPI2_FW_HEADER_PID_FAMILY_).
|
||||
* 02-10-10 02.00.14 Added SAS Quiesce Event structure and defines.
|
||||
* Added PowerManagementControl Request structures and
|
||||
* defines.
|
||||
* 05-12-10 02.00.15 Marked Task Set Full Event as obsolete.
|
||||
* Added MPI2_EVENT_SAS_TOPO_LR_UNSUPPORTED_PHY define.
|
||||
* 11-10-10 02.00.16 Added MPI2_FW_DOWNLOAD_ITYPE_MIN_PRODUCT_SPECIFIC.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_raid.h
|
||||
@ -292,6 +364,7 @@ mpi2_raid.h
|
||||
* can be sized by the build environment.
|
||||
* 07-30-09 02.00.04 Added proper define for the Use Default Settings bit of
|
||||
* VolumeCreationFlags and marked the old one as obsolete.
|
||||
* 05-12-10 02.00.05 Added MPI2_RAID_VOL_FLAGS_OP_MDC define.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_sas.h
|
||||
@ -302,6 +375,8 @@ mpi2_sas.h
|
||||
* Request.
|
||||
* 10-28-09 02.00.03 Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST
|
||||
* to MPI2_SGE_IO_UNION since it supports chained SGLs.
|
||||
* 05-12-10 02.00.04 Modified some comments.
|
||||
* 08-11-10 02.00.05 Added NCQ operations to SAS IO Unit Control.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_targ.h
|
||||
@ -313,6 +388,7 @@ mpi2_targ.h
|
||||
* MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST.
|
||||
* Target Status Send Request only takes a single SGE for
|
||||
* response data.
|
||||
* 02-10-10 02.00.04 Added comment to MPI2_TARGET_SSP_RSP_IU structure.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_tool.h
|
||||
@ -325,6 +401,9 @@ mpi2_tool.h
|
||||
* and reply messages.
|
||||
* Added MPI2_DIAG_BUF_TYPE_EXTENDED.
|
||||
* Incremented MPI2_DIAG_BUF_TYPE_COUNT.
|
||||
* 05-12-10 02.00.05 Added Diagnostic Data Upload tool.
|
||||
* 08-11-10 02.00.06 Added defines that were missing for Diagnostic Buffer
|
||||
* Post Request.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
mpi2_type.h
|
||||
@ -337,24 +416,40 @@ mpi2_ra.h
|
||||
|
||||
mpi2_hbd.h
|
||||
* 10-28-09 02.00.00 Initial version.
|
||||
* 08-11-10 02.00.01 Removed PortGroups, DmaGroup, and ControlGroup from
|
||||
* HBD Action request, replaced by AdditionalInfo field.
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
|
||||
mpi2_history.txt Parts list history
|
||||
|
||||
Filename 02.00.14 02.00.13 02.00.12
|
||||
---------- -------- -------- --------
|
||||
mpi2.h 02.00.14 02.00.13 02.00.12
|
||||
mpi2_cnfg.h 02.00.13 02.00.12 02.00.11
|
||||
mpi2_init.h 02.00.08 02.00.07 02.00.07
|
||||
mpi2_ioc.h 02.00.13 02.00.12 02.00.11
|
||||
mpi2_raid.h 02.00.04 02.00.04 02.00.03
|
||||
mpi2_sas.h 02.00.03 02.00.02 02.00.02
|
||||
mpi2_targ.h 02.00.03 02.00.03 02.00.03
|
||||
mpi2_tool.h 02.00.04 02.00.04 02.00.03
|
||||
mpi2_type.h 02.00.00 02.00.00 02.00.00
|
||||
mpi2_ra.h 02.00.00 02.00.00 02.00.00
|
||||
mpi2_hbd.h 02.00.00
|
||||
Filename 02.00.18
|
||||
---------- --------
|
||||
mpi2.h 02.00.18
|
||||
mpi2_cnfg.h 02.00.17
|
||||
mpi2_init.h 02.00.11
|
||||
mpi2_ioc.h 02.00.16
|
||||
mpi2_raid.h 02.00.05
|
||||
mpi2_sas.h 02.00.05
|
||||
mpi2_targ.h 02.00.04
|
||||
mpi2_tool.h 02.00.06
|
||||
mpi2_type.h 02.00.00
|
||||
mpi2_ra.h 02.00.00
|
||||
mpi2_hbd.h 02.00.01
|
||||
|
||||
Filename 02.00.17 02.00.16 02.00.15 02.00.14 02.00.13 02.00.12
|
||||
---------- -------- -------- -------- -------- -------- --------
|
||||
mpi2.h 02.00.17 02.00.16 02.00.15 02.00.14 02.00.13 02.00.12
|
||||
mpi2_cnfg.h 02.00.16 02.00.15 02.00.14 02.00.13 02.00.12 02.00.11
|
||||
mpi2_init.h 02.00.10 02.00.10 02.00.09 02.00.08 02.00.07 02.00.07
|
||||
mpi2_ioc.h 02.00.15 02.00.15 02.00.14 02.00.13 02.00.12 02.00.11
|
||||
mpi2_raid.h 02.00.05 02.00.05 02.00.04 02.00.04 02.00.04 02.00.03
|
||||
mpi2_sas.h 02.00.05 02.00.04 02.00.03 02.00.03 02.00.02 02.00.02
|
||||
mpi2_targ.h 02.00.04 02.00.04 02.00.04 02.00.03 02.00.03 02.00.03
|
||||
mpi2_tool.h 02.00.06 02.00.05 02.00.04 02.00.04 02.00.04 02.00.03
|
||||
mpi2_type.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00
|
||||
mpi2_ra.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00
|
||||
mpi2_hbd.h 02.00.01 02.00.00 02.00.00 02.00.00
|
||||
|
||||
Filename 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06
|
||||
---------- -------- -------- -------- -------- -------- --------
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2009 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_init.h
|
||||
* Title: MPI SCSI initiator mode messages and structures
|
||||
* Creation Date: June 23, 2006
|
||||
*
|
||||
* mpi2_init.h Version: 02.00.08
|
||||
* mpi2_init.h Version: 02.00.11
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -32,6 +61,9 @@
|
||||
* both SCSI IO Error Reply and SCSI Task Management Reply.
|
||||
* Added ResponseInfo field to MPI2_SCSI_TASK_MANAGE_REPLY.
|
||||
* Added MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG define.
|
||||
* 02-10-10 02.00.09 Removed unused structure that had "#if 0" around it.
|
||||
* 05-12-10 02.00.10 Added optional vendor-unique region to SCSI IO Request.
|
||||
* 11-10-10 02.00.11 Added MPI2_SCSIIO_NUM_SGLOFFSETS define.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -58,20 +90,6 @@ typedef struct
|
||||
} MPI2_SCSI_IO_CDB_EEDP32, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_EEDP32,
|
||||
Mpi2ScsiIoCdbEedp32_t, MPI2_POINTER pMpi2ScsiIoCdbEedp32_t;
|
||||
|
||||
/* TBD: I don't think this is needed for MPI2/Gen2 */
|
||||
#if 0
|
||||
typedef struct
|
||||
{
|
||||
U8 CDB[16]; /* 0x00 */
|
||||
U32 DataLength; /* 0x10 */
|
||||
U32 PrimaryReferenceTag; /* 0x14 */
|
||||
U16 PrimaryApplicationTag; /* 0x18 */
|
||||
U16 PrimaryApplicationTagMask; /* 0x1A */
|
||||
U32 TransferLength; /* 0x1C */
|
||||
} MPI2_SCSI_IO32_CDB_EEDP16, MPI2_POINTER PTR_MPI2_SCSI_IO32_CDB_EEDP16,
|
||||
Mpi2ScsiIo32CdbEedp16_t, MPI2_POINTER pMpi2ScsiIo32CdbEedp16_t;
|
||||
#endif
|
||||
|
||||
typedef union
|
||||
{
|
||||
U8 CDB32[32];
|
||||
@ -112,7 +130,13 @@ typedef struct _MPI2_SCSI_IO_REQUEST
|
||||
U8 LUN[8]; /* 0x34 */
|
||||
U32 Control; /* 0x3C */
|
||||
MPI2_SCSI_IO_CDB_UNION CDB; /* 0x40 */
|
||||
|
||||
#ifdef MPI2_SCSI_IO_VENDOR_UNIQUE_REGION /* typically this is left undefined */
|
||||
MPI2_SCSI_IO_VENDOR_UNIQUE VendorRegion;
|
||||
#endif
|
||||
|
||||
MPI2_SGE_IO_UNION SGL; /* 0x60 */
|
||||
|
||||
} MPI2_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI2_SCSI_IO_REQUEST,
|
||||
Mpi2SCSIIORequest_t, MPI2_POINTER pMpi2SCSIIORequest_t;
|
||||
|
||||
@ -146,6 +170,9 @@ typedef struct _MPI2_SCSI_IO_REQUEST
|
||||
#define MPI2_SCSIIO_SGLFLAGS_SGL1_SHIFT (4)
|
||||
#define MPI2_SCSIIO_SGLFLAGS_SGL0_SHIFT (0)
|
||||
|
||||
/* number of SGLOffset fields */
|
||||
#define MPI2_SCSIIO_NUM_SGLOFFSETS (4)
|
||||
|
||||
/* SCSI IO IoFlags bits */
|
||||
|
||||
/* Large CDB Address Space */
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2009 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_ioc.h
|
||||
* Title: MPI IOC, Port, Event, FW Download, and FW Upload messages
|
||||
* Creation Date: October 11, 2006
|
||||
*
|
||||
* mpi2_ioc.h Version: 02.00.13
|
||||
* mpi2_ioc.h Version: 02.00.16
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -99,6 +128,12 @@
|
||||
* (MPI2_FW_HEADER_PID_).
|
||||
* Modified values for SAS ProductID Family
|
||||
* (MPI2_FW_HEADER_PID_FAMILY_).
|
||||
* 02-10-10 02.00.14 Added SAS Quiesce Event structure and defines.
|
||||
* Added PowerManagementControl Request structures and
|
||||
* defines.
|
||||
* 05-12-10 02.00.15 Marked Task Set Full Event as obsolete.
|
||||
* Added MPI2_EVENT_SAS_TOPO_LR_UNSUPPORTED_PHY define.
|
||||
* 11-10-10 02.00.16 Added MPI2_FW_DOWNLOAD_ITYPE_MIN_PRODUCT_SPECIFIC.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -454,7 +489,7 @@ typedef struct _MPI2_EVENT_NOTIFICATION_REPLY
|
||||
#define MPI2_EVENT_STATE_CHANGE (0x0002)
|
||||
#define MPI2_EVENT_HARD_RESET_RECEIVED (0x0005)
|
||||
#define MPI2_EVENT_EVENT_CHANGE (0x000A)
|
||||
#define MPI2_EVENT_TASK_SET_FULL (0x000E)
|
||||
#define MPI2_EVENT_TASK_SET_FULL (0x000E) /* obsolete */
|
||||
#define MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE (0x000F)
|
||||
#define MPI2_EVENT_IR_OPERATION_STATUS (0x0014)
|
||||
#define MPI2_EVENT_SAS_DISCOVERY (0x0016)
|
||||
@ -470,6 +505,7 @@ typedef struct _MPI2_EVENT_NOTIFICATION_REPLY
|
||||
#define MPI2_EVENT_SAS_PHY_COUNTER (0x0022)
|
||||
#define MPI2_EVENT_GPIO_INTERRUPT (0x0023)
|
||||
#define MPI2_EVENT_HOST_BASED_DISCOVERY_PHY (0x0024)
|
||||
#define MPI2_EVENT_SAS_QUIESCE (0x0025)
|
||||
|
||||
|
||||
/* Log Entry Added Event data */
|
||||
@ -515,6 +551,7 @@ typedef struct _MPI2_EVENT_DATA_HARD_RESET_RECEIVED
|
||||
MPI2_POINTER pMpi2EventDataHardResetReceived_t;
|
||||
|
||||
/* Task Set Full Event data */
|
||||
/* this event is obsolete */
|
||||
|
||||
typedef struct _MPI2_EVENT_DATA_TASK_SET_FULL
|
||||
{
|
||||
@ -829,6 +866,7 @@ typedef struct _MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_SATA_OOB_COMPLETE (0x03)
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_PORT_SELECTOR (0x04)
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_SMP_RESET_IN_PROGRESS (0x05)
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_UNSUPPORTED_PHY (0x06)
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_RATE_1_5 (0x08)
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_RATE_3_0 (0x09)
|
||||
#define MPI2_EVENT_SAS_TOPO_LR_RATE_6_0 (0x0A)
|
||||
@ -896,6 +934,23 @@ typedef struct _MPI2_EVENT_DATA_SAS_PHY_COUNTER
|
||||
/* use MPI2_SASPHY3_TFLAGS_ values from mpi2_cnfg.h for the ThresholdFlags field */
|
||||
|
||||
|
||||
/* SAS Quiesce Event data */
|
||||
|
||||
typedef struct _MPI2_EVENT_DATA_SAS_QUIESCE
|
||||
{
|
||||
U8 ReasonCode; /* 0x00 */
|
||||
U8 Reserved1; /* 0x01 */
|
||||
U16 Reserved2; /* 0x02 */
|
||||
U32 Reserved3; /* 0x04 */
|
||||
} MPI2_EVENT_DATA_SAS_QUIESCE,
|
||||
MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_QUIESCE,
|
||||
Mpi2EventDataSasQuiesce_t, MPI2_POINTER pMpi2EventDataSasQuiesce_t;
|
||||
|
||||
/* SAS Quiesce Event data ReasonCode values */
|
||||
#define MPI2_EVENT_SAS_QUIESCE_RC_STARTED (0x01)
|
||||
#define MPI2_EVENT_SAS_QUIESCE_RC_COMPLETED (0x02)
|
||||
|
||||
|
||||
/* Host Based Discovery Phy Event data */
|
||||
|
||||
typedef struct _MPI2_EVENT_HBD_PHY_SAS
|
||||
@ -1009,7 +1064,9 @@ typedef struct _MPI2_FW_DOWNLOAD_REQUEST
|
||||
#define MPI2_FW_DOWNLOAD_ITYPE_CONFIG_1 (0x07)
|
||||
#define MPI2_FW_DOWNLOAD_ITYPE_CONFIG_2 (0x08)
|
||||
#define MPI2_FW_DOWNLOAD_ITYPE_MEGARAID (0x09)
|
||||
#define MPI2_FW_DOWNLOAD_ITYPE_COMPLETE (0x0A)
|
||||
#define MPI2_FW_DOWNLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B)
|
||||
#define MPI2_FW_DOWNLOAD_ITYPE_MIN_PRODUCT_SPECIFIC (0xF0)
|
||||
|
||||
/* FWDownload TransactionContext Element */
|
||||
typedef struct _MPI2_FW_DOWNLOAD_TCSGE
|
||||
@ -1186,7 +1243,6 @@ typedef struct _MPI2_FW_IMAGE_HEADER
|
||||
|
||||
#define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00)
|
||||
#define MPI2_FW_HEADER_PID_PROD_A (0x0000)
|
||||
#define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00)
|
||||
#define MPI2_FW_HEADER_PID_PROD_TARGET_INITIATOR_SCSI (0x0200)
|
||||
#define MPI2_FW_HEADER_PID_PROD_IR_SCSI (0x0700)
|
||||
|
||||
@ -1410,5 +1466,101 @@ typedef struct _MPI2_INIT_IMAGE_FOOTER
|
||||
#define MPI2_INIT_IMAGE_RESETVECTOR_OFFSET (0x14)
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* PowerManagementControl message
|
||||
****************************************************************************/
|
||||
|
||||
/* PowerManagementControl Request message */
|
||||
typedef struct _MPI2_PWR_MGMT_CONTROL_REQUEST
|
||||
{
|
||||
U8 Feature; /* 0x00 */
|
||||
U8 Reserved1; /* 0x01 */
|
||||
U8 ChainOffset; /* 0x02 */
|
||||
U8 Function; /* 0x03 */
|
||||
U16 Reserved2; /* 0x04 */
|
||||
U8 Reserved3; /* 0x06 */
|
||||
U8 MsgFlags; /* 0x07 */
|
||||
U8 VP_ID; /* 0x08 */
|
||||
U8 VF_ID; /* 0x09 */
|
||||
U16 Reserved4; /* 0x0A */
|
||||
U8 Parameter1; /* 0x0C */
|
||||
U8 Parameter2; /* 0x0D */
|
||||
U8 Parameter3; /* 0x0E */
|
||||
U8 Parameter4; /* 0x0F */
|
||||
U32 Reserved5; /* 0x10 */
|
||||
U32 Reserved6; /* 0x14 */
|
||||
} MPI2_PWR_MGMT_CONTROL_REQUEST, MPI2_POINTER PTR_MPI2_PWR_MGMT_CONTROL_REQUEST,
|
||||
Mpi2PwrMgmtControlRequest_t, MPI2_POINTER pMpi2PwrMgmtControlRequest_t;
|
||||
|
||||
/* defines for the Feature field */
|
||||
#define MPI2_PM_CONTROL_FEATURE_DA_PHY_POWER_COND (0x01)
|
||||
#define MPI2_PM_CONTROL_FEATURE_PORT_WIDTH_MODULATION (0x02)
|
||||
#define MPI2_PM_CONTROL_FEATURE_PCIE_LINK (0x03)
|
||||
#define MPI2_PM_CONTROL_FEATURE_IOC_SPEED (0x04)
|
||||
#define MPI2_PM_CONTROL_FEATURE_MIN_PRODUCT_SPECIFIC (0x80)
|
||||
#define MPI2_PM_CONTROL_FEATURE_MAX_PRODUCT_SPECIFIC (0xFF)
|
||||
|
||||
/* parameter usage for the MPI2_PM_CONTROL_FEATURE_DA_PHY_POWER_COND Feature */
|
||||
/* Parameter1 contains a PHY number */
|
||||
/* Parameter2 indicates power condition action using these defines */
|
||||
#define MPI2_PM_CONTROL_PARAM2_PARTIAL (0x01)
|
||||
#define MPI2_PM_CONTROL_PARAM2_SLUMBER (0x02)
|
||||
#define MPI2_PM_CONTROL_PARAM2_EXIT_PWR_MGMT (0x03)
|
||||
/* Parameter3 and Parameter4 are reserved */
|
||||
|
||||
/* parameter usage for the MPI2_PM_CONTROL_FEATURE_PORT_WIDTH_MODULATION Feature */
|
||||
/* Parameter1 contains SAS port width modulation group number */
|
||||
/* Parameter2 indicates IOC action using these defines */
|
||||
#define MPI2_PM_CONTROL_PARAM2_REQUEST_OWNERSHIP (0x01)
|
||||
#define MPI2_PM_CONTROL_PARAM2_CHANGE_MODULATION (0x02)
|
||||
#define MPI2_PM_CONTROL_PARAM2_RELINQUISH_OWNERSHIP (0x03)
|
||||
/* Parameter3 indicates desired modulation level using these defines */
|
||||
#define MPI2_PM_CONTROL_PARAM3_25_PERCENT (0x00)
|
||||
#define MPI2_PM_CONTROL_PARAM3_50_PERCENT (0x01)
|
||||
#define MPI2_PM_CONTROL_PARAM3_75_PERCENT (0x02)
|
||||
#define MPI2_PM_CONTROL_PARAM3_100_PERCENT (0x03)
|
||||
/* Parameter4 is reserved */
|
||||
|
||||
/* parameter usage for the MPI2_PM_CONTROL_FEATURE_PCIE_LINK Feature */
|
||||
/* Parameter1 indicates desired PCIe link speed using these defines */
|
||||
#define MPI2_PM_CONTROL_PARAM1_PCIE_2_5_GBPS (0x00)
|
||||
#define MPI2_PM_CONTROL_PARAM1_PCIE_5_0_GBPS (0x01)
|
||||
#define MPI2_PM_CONTROL_PARAM1_PCIE_8_0_GBPS (0x02)
|
||||
/* Parameter2 indicates desired PCIe link width using these defines */
|
||||
#define MPI2_PM_CONTROL_PARAM2_WIDTH_X1 (0x01)
|
||||
#define MPI2_PM_CONTROL_PARAM2_WIDTH_X2 (0x02)
|
||||
#define MPI2_PM_CONTROL_PARAM2_WIDTH_X4 (0x04)
|
||||
#define MPI2_PM_CONTROL_PARAM2_WIDTH_X8 (0x08)
|
||||
/* Parameter3 and Parameter4 are reserved */
|
||||
|
||||
/* parameter usage for the MPI2_PM_CONTROL_FEATURE_IOC_SPEED Feature */
|
||||
/* Parameter1 indicates desired IOC hardware clock speed using these defines */
|
||||
#define MPI2_PM_CONTROL_PARAM1_FULL_IOC_SPEED (0x01)
|
||||
#define MPI2_PM_CONTROL_PARAM1_HALF_IOC_SPEED (0x02)
|
||||
#define MPI2_PM_CONTROL_PARAM1_QUARTER_IOC_SPEED (0x04)
|
||||
#define MPI2_PM_CONTROL_PARAM1_EIGHTH_IOC_SPEED (0x08)
|
||||
/* Parameter2, Parameter3, and Parameter4 are reserved */
|
||||
|
||||
|
||||
/* PowerManagementControl Reply message */
|
||||
typedef struct _MPI2_PWR_MGMT_CONTROL_REPLY
|
||||
{
|
||||
U8 Feature; /* 0x00 */
|
||||
U8 Reserved1; /* 0x01 */
|
||||
U8 MsgLength; /* 0x02 */
|
||||
U8 Function; /* 0x03 */
|
||||
U16 Reserved2; /* 0x04 */
|
||||
U8 Reserved3; /* 0x06 */
|
||||
U8 MsgFlags; /* 0x07 */
|
||||
U8 VP_ID; /* 0x08 */
|
||||
U8 VF_ID; /* 0x09 */
|
||||
U16 Reserved4; /* 0x0A */
|
||||
U16 Reserved5; /* 0x0C */
|
||||
U16 IOCStatus; /* 0x0E */
|
||||
U32 IOCLogInfo; /* 0x10 */
|
||||
} MPI2_PWR_MGMT_CONTROL_REPLY, MPI2_POINTER PTR_MPI2_PWR_MGMT_CONTROL_REPLY,
|
||||
Mpi2PwrMgmtControlReply_t, MPI2_POINTER pMpi2PwrMgmtControlReply_t;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,6 +1,35 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2009 LSI Corporation.
|
||||
* Copyright (c) 2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_ra.h
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2008 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_raid.h
|
||||
* Title: MPI Integrated RAID messages and structures
|
||||
* Creation Date: April 26, 2007
|
||||
*
|
||||
* mpi2_raid.h Version: 02.00.04
|
||||
* mpi2_raid.h Version: 02.00.05
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -23,6 +52,7 @@
|
||||
* can be sized by the build environment.
|
||||
* 07-30-09 02.00.04 Added proper define for the Use Default Settings bit of
|
||||
* VolumeCreationFlags and marked the old one as obsolete.
|
||||
* 05-12-10 02.00.05 Added MPI2_RAID_VOL_FLAGS_OP_MDC define.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -261,6 +291,7 @@ typedef struct _MPI2_RAID_VOL_INDICATOR
|
||||
#define MPI2_RAID_VOL_FLAGS_OP_ONLINE_CAP_EXPANSION (0x00000001)
|
||||
#define MPI2_RAID_VOL_FLAGS_OP_CONSISTENCY_CHECK (0x00000002)
|
||||
#define MPI2_RAID_VOL_FLAGS_OP_RESYNC (0x00000003)
|
||||
#define MPI2_RAID_VOL_FLAGS_OP_MDC (0x00000004)
|
||||
|
||||
|
||||
/* RAID Action Reply ActionData union */
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2007 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_sas.h
|
||||
* Title: MPI Serial Attached SCSI structures and definitions
|
||||
* Creation Date: February 9, 2007
|
||||
*
|
||||
* mpi2.h Version: 02.00.03
|
||||
* mpi2_sas.h Version: 02.00.05
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -21,6 +50,8 @@
|
||||
* Request.
|
||||
* 10-28-09 02.00.03 Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST
|
||||
* to MPI2_SGE_IO_UNION since it supports chained SGLs.
|
||||
* 05-12-10 02.00.04 Modified some comments.
|
||||
* 08-11-10 02.00.05 Added NCQ operations to SAS IO Unit Control.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -111,7 +142,7 @@ typedef struct _MPI2_SMP_PASSTHROUGH_REQUEST
|
||||
/* values for PassthroughFlags field */
|
||||
#define MPI2_SMP_PT_REQ_PT_FLAGS_IMMEDIATE (0x80)
|
||||
|
||||
/* values for SGLFlags field are in the SGL section of mpi2.h */
|
||||
/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
|
||||
|
||||
|
||||
/* SMP Passthrough Reply Message */
|
||||
@ -163,7 +194,7 @@ typedef struct _MPI2_SATA_PASSTHROUGH_REQUEST
|
||||
U32 Reserved4; /* 0x14 */
|
||||
U32 DataLength; /* 0x18 */
|
||||
U8 CommandFIS[20]; /* 0x1C */
|
||||
MPI2_SGE_IO_UNION SGL; /* 0x20 */
|
||||
MPI2_SGE_IO_UNION SGL; /* 0x30 */
|
||||
} MPI2_SATA_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REQUEST,
|
||||
Mpi2SataPassthroughRequest_t, MPI2_POINTER pMpi2SataPassthroughRequest_t;
|
||||
|
||||
@ -175,7 +206,7 @@ typedef struct _MPI2_SATA_PASSTHROUGH_REQUEST
|
||||
#define MPI2_SATA_PT_REQ_PT_FLAGS_WRITE (0x0002)
|
||||
#define MPI2_SATA_PT_REQ_PT_FLAGS_READ (0x0001)
|
||||
|
||||
/* values for SGLFlags field are in the SGL section of mpi2.h */
|
||||
/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
|
||||
|
||||
|
||||
/* SATA Passthrough Reply Message */
|
||||
@ -246,6 +277,8 @@ typedef struct _MPI2_SAS_IOUNIT_CONTROL_REQUEST
|
||||
#define MPI2_SAS_OP_REMOVE_DEVICE (0x0D)
|
||||
#define MPI2_SAS_OP_LOOKUP_MAPPING (0x0E)
|
||||
#define MPI2_SAS_OP_SET_IOC_PARAMETER (0x0F)
|
||||
#define MPI2_SAS_OP_DEV_ENABLE_NCQ (0x14)
|
||||
#define MPI2_SAS_OP_DEV_DISABLE_NCQ (0x15)
|
||||
#define MPI2_SAS_OP_PRODUCT_SPECIFIC_MIN (0x80)
|
||||
|
||||
/* values for the PrimFlags field */
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2008 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_targ.h
|
||||
* Title: MPI Target mode messages and structures
|
||||
* Creation Date: September 8, 2006
|
||||
*
|
||||
* mpi2_targ.h Version: 02.00.03
|
||||
* mpi2_targ.h Version: 02.00.04
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -22,6 +51,7 @@
|
||||
* MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST.
|
||||
* Target Status Send Request only takes a single SGE for
|
||||
* response data.
|
||||
* 02-10-10 02.00.04 Added comment to MPI2_TARGET_SSP_RSP_IU structure.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -343,6 +373,7 @@ typedef struct _MPI2_TARGET_STATUS_SEND_REQUEST
|
||||
typedef struct _MPI2_TARGET_SSP_RSP_IU
|
||||
{
|
||||
U32 Reserved0[6]; /* reserved for SSP header */ /* 0x00 */
|
||||
|
||||
/* start of RESPONSE information unit */
|
||||
U32 Reserved1; /* 0x18 */
|
||||
U32 Reserved2; /* 0x1C */
|
||||
@ -352,6 +383,8 @@ typedef struct _MPI2_TARGET_SSP_RSP_IU
|
||||
U32 Reserved4; /* 0x24 */
|
||||
U32 SenseDataLength; /* 0x28 */
|
||||
U32 ResponseDataLength; /* 0x2C */
|
||||
|
||||
/* start of Response or Sense Data (size may vary dynamically) */
|
||||
U8 ResponseSenseData[4]; /* 0x30 */
|
||||
} MPI2_TARGET_SSP_RSP_IU, MPI2_POINTER PTR_MPI2_TARGET_SSP_RSP_IU,
|
||||
Mpi2TargetSspRspIu_t, MPI2_POINTER pMpi2TargetSspRspIu_t;
|
||||
|
@ -1,13 +1,42 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2009 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_tool.h
|
||||
* Title: MPI diagnostic tool structures and definitions
|
||||
* Creation Date: March 26, 2007
|
||||
*
|
||||
* mpi2_tool.h Version: 02.00.04
|
||||
* mpi2_tool.h Version: 02.00.06
|
||||
*
|
||||
* Version History
|
||||
* ---------------
|
||||
@ -23,6 +52,9 @@
|
||||
* and reply messages.
|
||||
* Added MPI2_DIAG_BUF_TYPE_EXTENDED.
|
||||
* Incremented MPI2_DIAG_BUF_TYPE_COUNT.
|
||||
* 05-12-10 02.00.05 Added Diagnostic Data Upload tool.
|
||||
* 08-11-10 02.00.06 Added defines that were missing for Diagnostic Buffer
|
||||
* Post Request.
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@ -38,6 +70,7 @@
|
||||
/* defines for the Tools */
|
||||
#define MPI2_TOOLBOX_CLEAN_TOOL (0x00)
|
||||
#define MPI2_TOOLBOX_MEMORY_MOVE_TOOL (0x01)
|
||||
#define MPI2_TOOLBOX_DIAG_DATA_UPLOAD_TOOL (0x02)
|
||||
#define MPI2_TOOLBOX_ISTWI_READ_WRITE_TOOL (0x03)
|
||||
#define MPI2_TOOLBOX_BEACON_TOOL (0x05)
|
||||
#define MPI2_TOOLBOX_DIAGNOSTIC_CLI_TOOL (0x06)
|
||||
@ -120,6 +153,46 @@ typedef struct _MPI2_TOOLBOX_MEM_MOVE_REQUEST
|
||||
Mpi2ToolboxMemMoveRequest_t, MPI2_POINTER pMpi2ToolboxMemMoveRequest_t;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Toolbox Diagnostic Data Upload request
|
||||
****************************************************************************/
|
||||
|
||||
typedef struct _MPI2_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST
|
||||
{
|
||||
U8 Tool; /* 0x00 */
|
||||
U8 Reserved1; /* 0x01 */
|
||||
U8 ChainOffset; /* 0x02 */
|
||||
U8 Function; /* 0x03 */
|
||||
U16 Reserved2; /* 0x04 */
|
||||
U8 Reserved3; /* 0x06 */
|
||||
U8 MsgFlags; /* 0x07 */
|
||||
U8 VP_ID; /* 0x08 */
|
||||
U8 VF_ID; /* 0x09 */
|
||||
U16 Reserved4; /* 0x0A */
|
||||
U8 SGLFlags; /* 0x0C */
|
||||
U8 Reserved5; /* 0x0D */
|
||||
U16 Reserved6; /* 0x0E */
|
||||
U32 Flags; /* 0x10 */
|
||||
U32 DataLength; /* 0x14 */
|
||||
MPI2_SGE_SIMPLE_UNION SGL; /* 0x18 */
|
||||
} MPI2_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST,
|
||||
MPI2_POINTER PTR_MPI2_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST,
|
||||
Mpi2ToolboxDiagDataUploadRequest_t,
|
||||
MPI2_POINTER pMpi2ToolboxDiagDataUploadRequest_t;
|
||||
|
||||
/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
|
||||
|
||||
|
||||
typedef struct _MPI2_DIAG_DATA_UPLOAD_HEADER
|
||||
{
|
||||
U32 DiagDataLength; /* 00h */
|
||||
U8 FormatCode; /* 04h */
|
||||
U8 Reserved1; /* 05h */
|
||||
U16 Reserved2; /* 06h */
|
||||
} MPI2_DIAG_DATA_UPLOAD_HEADER, MPI2_POINTER PTR_MPI2_DIAG_DATA_UPLOAD_HEADER,
|
||||
Mpi2DiagDataUploadHeader_t, MPI2_POINTER pMpi2DiagDataUploadHeader_t;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Toolbox ISTWI Read Write Tool
|
||||
****************************************************************************/
|
||||
@ -164,7 +237,7 @@ typedef struct _MPI2_TOOLBOX_ISTWI_READ_WRITE_REQUEST
|
||||
#define MPI2_TOOL_ISTWI_ACTION_RELEASE_BUS (0x11)
|
||||
#define MPI2_TOOL_ISTWI_ACTION_RESET (0x12)
|
||||
|
||||
/* values for SGLFlags field are in the SGL section of mpi2.h */
|
||||
/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
|
||||
|
||||
|
||||
/* Toolbox ISTWI Read Write Tool reply message */
|
||||
@ -251,7 +324,7 @@ typedef struct _MPI2_TOOLBOX_DIAGNOSTIC_CLI_REQUEST
|
||||
Mpi2ToolboxDiagnosticCliRequest_t,
|
||||
MPI2_POINTER pMpi2ToolboxDiagnosticCliRequest_t;
|
||||
|
||||
/* values for SGLFlags field are in the SGL section of mpi2.h */
|
||||
/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
|
||||
|
||||
|
||||
/* Toolbox Diagnostic CLI Tool reply message */
|
||||
@ -319,6 +392,10 @@ typedef struct _MPI2_DIAG_BUFFER_POST_REQUEST
|
||||
/* count of the number of buffer types */
|
||||
#define MPI2_DIAG_BUF_TYPE_COUNT (0x03)
|
||||
|
||||
/* values for the Flags field */
|
||||
#define MPI2_DIAG_BUF_FLAG_RELEASE_ON_FULL (0x00000002)
|
||||
#define MPI2_DIAG_BUF_FLAG_IMMEDIATE_RELEASE (0x00000001)
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Diagnostic Buffer Post reply
|
||||
|
@ -1,6 +1,35 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2007 LSI Corporation.
|
||||
* Copyright (c) 2000-2011 LSI Corporation.
|
||||
*
|
||||
*
|
||||
* Name: mpi2_type.h
|
||||
|
File diff suppressed because it is too large
Load Diff
1393
sys/dev/mps/mps_config.c
Normal file
1393
sys/dev/mps/mps_config.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -31,6 +31,35 @@
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MPS_IOCTL_H_
|
||||
#define _MPS_IOCTL_H_
|
||||
@ -93,8 +122,237 @@ struct mps_usr_command {
|
||||
uint32_t flags;
|
||||
};
|
||||
|
||||
#define MPSIO_MPS_COMMAND_FLAG_VERBOSE 0x01
|
||||
#define MPSIO_MPS_COMMAND_FLAG_DEBUG 0x02
|
||||
typedef struct mps_pci_bits
|
||||
{
|
||||
union {
|
||||
struct {
|
||||
uint32_t DeviceNumber :5;
|
||||
uint32_t FunctionNumber :3;
|
||||
uint32_t BusNumber :24;
|
||||
} bits;
|
||||
uint32_t AsDWORD;
|
||||
} u;
|
||||
uint32_t PciSegmentId;
|
||||
} mps_pci_bits_t;
|
||||
|
||||
/*
|
||||
* The following is the MPSIOCTL_GET_ADAPTER_DATA data structure. This data
|
||||
* structure is setup so that we hopefully are properly aligned for both
|
||||
* 32-bit and 64-bit mode applications.
|
||||
*
|
||||
* Adapter Type - Value = 4 = SCSI Protocol through SAS-2 adapter
|
||||
*
|
||||
* MPI Port Number - The PCI Function number for this device
|
||||
*
|
||||
* PCI Device HW Id - The PCI device number for this device
|
||||
*
|
||||
*/
|
||||
#define MPSIOCTL_ADAPTER_TYPE_SAS2 4
|
||||
#define MPSIOCTL_ADAPTER_TYPE_SAS2_SSS6200 5
|
||||
typedef struct mps_adapter_data
|
||||
{
|
||||
uint32_t StructureLength;
|
||||
uint32_t AdapterType;
|
||||
uint32_t MpiPortNumber;
|
||||
uint32_t PCIDeviceHwId;
|
||||
uint32_t PCIDeviceHwRev;
|
||||
uint32_t SubSystemId;
|
||||
uint32_t SubsystemVendorId;
|
||||
uint32_t Reserved1;
|
||||
uint32_t MpiFirmwareVersion;
|
||||
uint32_t BiosVersion;
|
||||
uint8_t DriverVersion[32];
|
||||
uint8_t Reserved2;
|
||||
uint8_t ScsiId;
|
||||
uint16_t Reserved3;
|
||||
mps_pci_bits_t PciInformation;
|
||||
} mps_adapter_data_t;
|
||||
|
||||
|
||||
typedef struct mps_update_flash
|
||||
{
|
||||
uint64_t PtrBuffer;
|
||||
uint32_t ImageChecksum;
|
||||
uint32_t ImageOffset;
|
||||
uint32_t ImageSize;
|
||||
uint32_t ImageType;
|
||||
} mps_update_flash_t;
|
||||
|
||||
|
||||
#define MPS_PASS_THRU_DIRECTION_NONE 0
|
||||
#define MPS_PASS_THRU_DIRECTION_READ 1
|
||||
#define MPS_PASS_THRU_DIRECTION_WRITE 2
|
||||
#define MPS_PASS_THRU_DIRECTION_BOTH 3
|
||||
|
||||
typedef struct mps_pass_thru
|
||||
{
|
||||
uint64_t PtrRequest;
|
||||
uint64_t PtrReply;
|
||||
uint64_t PtrData;
|
||||
uint32_t RequestSize;
|
||||
uint32_t ReplySize;
|
||||
uint32_t DataSize;
|
||||
uint32_t DataDirection;
|
||||
uint64_t PtrDataOut;
|
||||
uint32_t DataOutSize;
|
||||
uint32_t Timeout;
|
||||
} mps_pass_thru_t;
|
||||
|
||||
|
||||
/*
|
||||
* Event queue defines
|
||||
*/
|
||||
#define MPS_EVENT_QUEUE_SIZE (50) /* Max Events stored in driver */
|
||||
#define MPS_MAX_EVENT_DATA_LENGTH (48) /* Size of each event in Dwords */
|
||||
|
||||
typedef struct mps_event_query
|
||||
{
|
||||
uint16_t Entries;
|
||||
uint16_t Reserved;
|
||||
uint32_t Types[4];
|
||||
} mps_event_query_t;
|
||||
|
||||
typedef struct mps_event_enable
|
||||
{
|
||||
uint32_t Types[4];
|
||||
} mps_event_enable_t;
|
||||
|
||||
/*
|
||||
* Event record entry for ioctl.
|
||||
*/
|
||||
typedef struct mps_event_entry
|
||||
{
|
||||
uint32_t Type;
|
||||
uint32_t Number;
|
||||
uint32_t Data[MPS_MAX_EVENT_DATA_LENGTH];
|
||||
} mps_event_entry_t;
|
||||
|
||||
typedef struct mps_event_report
|
||||
{
|
||||
uint32_t Size;
|
||||
uint64_t PtrEvents;
|
||||
} mps_event_report_t;
|
||||
|
||||
|
||||
typedef struct mps_pci_info
|
||||
{
|
||||
uint32_t BusNumber;
|
||||
uint8_t DeviceNumber;
|
||||
uint8_t FunctionNumber;
|
||||
uint16_t InterruptVector;
|
||||
uint8_t PciHeader[256];
|
||||
} mps_pci_info_t;
|
||||
|
||||
|
||||
typedef struct mps_diag_action
|
||||
{
|
||||
uint32_t Action;
|
||||
uint32_t Length;
|
||||
uint64_t PtrDiagAction;
|
||||
uint32_t ReturnCode;
|
||||
} mps_diag_action_t;
|
||||
|
||||
#define MPS_FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF)
|
||||
|
||||
#define MPS_FW_DIAG_NEW (0x806E6577)
|
||||
|
||||
#define MPS_FW_DIAG_TYPE_REGISTER (0x00000001)
|
||||
#define MPS_FW_DIAG_TYPE_UNREGISTER (0x00000002)
|
||||
#define MPS_FW_DIAG_TYPE_QUERY (0x00000003)
|
||||
#define MPS_FW_DIAG_TYPE_READ_BUFFER (0x00000004)
|
||||
#define MPS_FW_DIAG_TYPE_RELEASE (0x00000005)
|
||||
|
||||
#define MPS_FW_DIAG_INVALID_UID (0x00000000)
|
||||
|
||||
#define MPS_DIAG_SUCCESS 0
|
||||
#define MPS_DIAG_FAILURE 1
|
||||
|
||||
#define MPS_FW_DIAG_ERROR_SUCCESS (0x00000000)
|
||||
#define MPS_FW_DIAG_ERROR_FAILURE (0x00000001)
|
||||
#define MPS_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002)
|
||||
#define MPS_FW_DIAG_ERROR_POST_FAILED (0x00000010)
|
||||
#define MPS_FW_DIAG_ERROR_INVALID_UID (0x00000011)
|
||||
#define MPS_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012)
|
||||
#define MPS_FW_DIAG_ERROR_NO_BUFFER (0x00000013)
|
||||
#define MPS_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014)
|
||||
|
||||
|
||||
typedef struct mps_fw_diag_register
|
||||
{
|
||||
uint8_t ExtendedType;
|
||||
uint8_t BufferType;
|
||||
uint16_t ApplicationFlags;
|
||||
uint32_t DiagnosticFlags;
|
||||
uint32_t ProductSpecific[23];
|
||||
uint32_t RequestedBufferSize;
|
||||
uint32_t UniqueId;
|
||||
} mps_fw_diag_register_t;
|
||||
|
||||
typedef struct mps_fw_diag_unregister
|
||||
{
|
||||
uint32_t UniqueId;
|
||||
} mps_fw_diag_unregister_t;
|
||||
|
||||
#define MPS_FW_DIAG_FLAG_APP_OWNED (0x0001)
|
||||
#define MPS_FW_DIAG_FLAG_BUFFER_VALID (0x0002)
|
||||
#define MPS_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004)
|
||||
|
||||
typedef struct mps_fw_diag_query
|
||||
{
|
||||
uint8_t ExtendedType;
|
||||
uint8_t BufferType;
|
||||
uint16_t ApplicationFlags;
|
||||
uint32_t DiagnosticFlags;
|
||||
uint32_t ProductSpecific[23];
|
||||
uint32_t TotalBufferSize;
|
||||
uint32_t DriverAddedBufferSize;
|
||||
uint32_t UniqueId;
|
||||
} mps_fw_diag_query_t;
|
||||
|
||||
typedef struct mps_fw_diag_release
|
||||
{
|
||||
uint32_t UniqueId;
|
||||
} mps_fw_diag_release_t;
|
||||
|
||||
#define MPS_FW_DIAG_FLAG_REREGISTER (0x0001)
|
||||
#define MPS_FW_DIAG_FLAG_FORCE_RELEASE (0x0002)
|
||||
|
||||
typedef struct mps_diag_read_buffer
|
||||
{
|
||||
uint8_t Status;
|
||||
uint8_t Reserved;
|
||||
uint16_t Flags;
|
||||
uint32_t StartingOffset;
|
||||
uint32_t BytesToRead;
|
||||
uint32_t UniqueId;
|
||||
uint64_t PtrDataBuffer;
|
||||
} mps_diag_read_buffer_t;
|
||||
|
||||
/*
|
||||
* Register Access
|
||||
*/
|
||||
#define REG_IO_READ 1
|
||||
#define REG_IO_WRITE 2
|
||||
#define REG_MEM_READ 3
|
||||
#define REG_MEM_WRITE 4
|
||||
|
||||
typedef struct mps_reg_access
|
||||
{
|
||||
uint32_t Command;
|
||||
uint32_t RegOffset;
|
||||
uint32_t RegData;
|
||||
} mps_reg_access_t;
|
||||
|
||||
typedef struct mps_btdh_mapping
|
||||
{
|
||||
uint16_t TargetID;
|
||||
uint16_t Bus;
|
||||
uint16_t DevHandle;
|
||||
uint16_t Reserved;
|
||||
} mps_btdh_mapping_t;
|
||||
|
||||
#define MPSIO_MPS_COMMAND_FLAG_VERBOSE 0x01
|
||||
#define MPSIO_MPS_COMMAND_FLAG_DEBUG 0x02
|
||||
#define MPSIO_READ_CFG_HEADER _IOWR('M', 200, struct mps_cfg_page_req)
|
||||
#define MPSIO_READ_CFG_PAGE _IOWR('M', 201, struct mps_cfg_page_req)
|
||||
#define MPSIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mps_ext_cfg_page_req)
|
||||
@ -103,4 +361,27 @@ struct mps_usr_command {
|
||||
#define MPSIO_RAID_ACTION _IOWR('M', 205, struct mps_raid_action)
|
||||
#define MPSIO_MPS_COMMAND _IOWR('M', 210, struct mps_usr_command)
|
||||
|
||||
#define MPTIOCTL ('I')
|
||||
#define MPTIOCTL_GET_ADAPTER_DATA _IOWR(MPTIOCTL, 1,\
|
||||
struct mps_adapter_data)
|
||||
#define MPTIOCTL_UPDATE_FLASH _IOWR(MPTIOCTL, 2,\
|
||||
struct mps_update_flash)
|
||||
#define MPTIOCTL_RESET_ADAPTER _IO(MPTIOCTL, 3)
|
||||
#define MPTIOCTL_PASS_THRU _IOWR(MPTIOCTL, 4,\
|
||||
struct mps_pass_thru)
|
||||
#define MPTIOCTL_EVENT_QUERY _IOWR(MPTIOCTL, 5,\
|
||||
struct mps_event_query)
|
||||
#define MPTIOCTL_EVENT_ENABLE _IOWR(MPTIOCTL, 6,\
|
||||
struct mps_event_enable)
|
||||
#define MPTIOCTL_EVENT_REPORT _IOWR(MPTIOCTL, 7,\
|
||||
struct mps_event_report)
|
||||
#define MPTIOCTL_GET_PCI_INFO _IOWR(MPTIOCTL, 8,\
|
||||
struct mps_pci_info)
|
||||
#define MPTIOCTL_DIAG_ACTION _IOWR(MPTIOCTL, 9,\
|
||||
struct mps_diag_action)
|
||||
#define MPTIOCTL_REG_ACCESS _IOWR(MPTIOCTL, 10,\
|
||||
struct mps_reg_access)
|
||||
#define MPTIOCTL_BTDH_MAPPING _IOWR(MPTIOCTL, 11,\
|
||||
struct mps_btdh_mapping)
|
||||
|
||||
#endif /* !_MPS_IOCTL_H_ */
|
||||
|
2268
sys/dev/mps/mps_mapping.c
Normal file
2268
sys/dev/mps/mps_mapping.c
Normal file
File diff suppressed because it is too large
Load Diff
71
sys/dev/mps/mps_mapping.h
Normal file
71
sys/dev/mps/mps_mapping.h
Normal file
@ -0,0 +1,71 @@
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MPS_MAPPING_H
|
||||
#define _MPS_MAPPING_H
|
||||
|
||||
/**
|
||||
* struct _map_phy_change - PHY entries recieved in Topology change list
|
||||
* @physical_id: SAS address of the device attached with the associate PHY
|
||||
* @device_info: bitfield provides detailed info about the device
|
||||
* @dev_handle: device handle for the device pointed by this entry
|
||||
* @slot: slot ID
|
||||
* @is_processed: Flag to indicate whether this entry is processed or not
|
||||
*/
|
||||
struct _map_phy_change {
|
||||
uint64_t physical_id;
|
||||
uint32_t device_info;
|
||||
uint16_t dev_handle;
|
||||
uint16_t slot;
|
||||
uint8_t reason;
|
||||
uint8_t is_processed;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct _map_topology_change - entries to be removed from mapping table
|
||||
* @dpm_entry_num: index of this device in device persistent map table
|
||||
* @dev_handle: device handle for the device pointed by this entry
|
||||
*/
|
||||
struct _map_topology_change {
|
||||
uint16_t enc_handle;
|
||||
uint16_t exp_handle;
|
||||
uint8_t num_entries;
|
||||
uint8_t start_phy_num;
|
||||
uint8_t num_phys;
|
||||
uint8_t exp_status;
|
||||
struct _map_phy_change *phy_details;
|
||||
};
|
||||
|
||||
|
||||
extern int
|
||||
mpssas_get_sas_address_for_sata_disk(struct mps_softc *ioc,
|
||||
u64 *sas_address, u16 handle, u32 device_info);
|
||||
|
||||
#endif
|
@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* PCI/PCI-X/PCIe bus interface for the LSI MPT2 controllers */
|
||||
|
||||
/* TODO Move headers to mpsvar */
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -46,12 +47,17 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/pci/pci_private.h>
|
||||
|
||||
#include <dev/mps/mpi/mpi2_type.h>
|
||||
#include <dev/mps/mpi/mpi2.h>
|
||||
#include <dev/mps/mpi/mpi2_ioc.h>
|
||||
#include <dev/mps/mpi/mpi2_cnfg.h>
|
||||
#include <dev/mps/mpi/mpi2_tool.h>
|
||||
|
||||
#include <sys/queue.h>
|
||||
#include <sys/kthread.h>
|
||||
#include <dev/mps/mps_ioctl.h>
|
||||
#include <dev/mps/mpsvar.h>
|
||||
|
||||
static int mps_pci_probe(device_t);
|
||||
@ -63,15 +69,6 @@ static void mps_pci_free(struct mps_softc *);
|
||||
static int mps_alloc_msix(struct mps_softc *sc, int msgs);
|
||||
static int mps_alloc_msi(struct mps_softc *sc, int msgs);
|
||||
|
||||
int mps_disable_msix = 0;
|
||||
TUNABLE_INT("hw.mps.disable_msix", &mps_disable_msix);
|
||||
SYSCTL_INT(_hw_mps, OID_AUTO, disable_msix, CTLFLAG_RD, &mps_disable_msix, 0,
|
||||
"Disable MSIX interrupts\n");
|
||||
int mps_disable_msi = 0;
|
||||
TUNABLE_INT("hw.mps.disable_msi", &mps_disable_msi);
|
||||
SYSCTL_INT(_hw_mps, OID_AUTO, disable_msi, CTLFLAG_RD, &mps_disable_msi, 0,
|
||||
"Disable MSI interrupts\n");
|
||||
|
||||
static device_method_t mps_methods[] = {
|
||||
DEVMETHOD(device_probe, mps_pci_probe),
|
||||
DEVMETHOD(device_attach, mps_pci_attach),
|
||||
@ -125,10 +122,24 @@ struct mps_ident {
|
||||
0xffff, 0xffff, 0, "LSI SAS2208" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_6,
|
||||
0xffff, 0xffff, 0, "LSI SAS2208" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_7,
|
||||
0xffff, 0xffff, 0, "LSI SAS2208" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_8,
|
||||
0xffff, 0xffff, 0, "LSI SAS2208" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_1,
|
||||
0xffff, 0xffff, 0, "LSI SAS2308" },
|
||||
// Add Customer specific vender/subdevice id before generic
|
||||
// (0xffff) vender/subdevice id.
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
|
||||
0x8086, 0x3516, 0, "Intel(R) Integrated RAID Module RMS25JB080" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
|
||||
0x8086, 0x3517, 0, "Intel(R) Integrated RAID Module RMS25JB040" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
|
||||
0x8086, 0x3518, 0, "Intel(R) Integrated RAID Module RMS25KB080" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
|
||||
0x8086, 0x3519, 0, "Intel(R) Integrated RAID Module RMS25KB040" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
|
||||
0xffff, 0xffff, 0, "LSI SAS2308" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_3,
|
||||
0xffff, 0xffff, 0, "LSI SAS2308" },
|
||||
{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SSS6200,
|
||||
0xffff, 0xffff, MPS_FLAGS_WD_AVAILABLE, "LSI SSS6200" },
|
||||
{ 0, 0, 0, 0, 0, NULL }
|
||||
};
|
||||
|
||||
@ -161,7 +172,7 @@ mps_pci_probe(device_t dev)
|
||||
|
||||
if ((id = mps_find_ident(dev)) != NULL) {
|
||||
device_set_desc(dev, id->desc);
|
||||
return (BUS_PROBE_DEFAULT);
|
||||
return (BUS_PROBE_VENDOR);
|
||||
}
|
||||
return (ENXIO);
|
||||
}
|
||||
@ -205,7 +216,7 @@ mps_pci_attach(device_t dev)
|
||||
sc->mps_bhandle = rman_get_bushandle(sc->mps_regs_resource);
|
||||
|
||||
/* Allocate the parent DMA tag */
|
||||
if (bus_dma_tag_create( NULL, /* parent */
|
||||
if (bus_dma_tag_create( bus_get_dma_tag(dev), /* parent */
|
||||
1, 0, /* algnmnt, boundary */
|
||||
BUS_SPACE_MAXADDR, /* lowaddr */
|
||||
BUS_SPACE_MAXADDR, /* highaddr */
|
||||
@ -235,10 +246,10 @@ mps_pci_setup_interrupts(struct mps_softc *sc)
|
||||
|
||||
dev = sc->mps_dev;
|
||||
error = ENXIO;
|
||||
if ((mps_disable_msix == 0) &&
|
||||
if ((sc->disable_msix == 0) &&
|
||||
((msgs = pci_msix_count(dev)) >= MPS_MSI_COUNT))
|
||||
error = mps_alloc_msix(sc, MPS_MSI_COUNT);
|
||||
if ((error != 0) && (mps_disable_msi == 0) &&
|
||||
if ((error != 0) && (sc->disable_msi == 0) &&
|
||||
((msgs = pci_msi_count(dev)) >= MPS_MSI_COUNT))
|
||||
error = mps_alloc_msi(sc, MPS_MSI_COUNT);
|
||||
|
||||
@ -362,3 +373,20 @@ mps_alloc_msi(struct mps_softc *sc, int msgs)
|
||||
return (error);
|
||||
}
|
||||
|
||||
int
|
||||
mps_pci_restore(struct mps_softc *sc)
|
||||
{
|
||||
struct pci_devinfo *dinfo;
|
||||
|
||||
mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
|
||||
|
||||
dinfo = device_get_ivars(sc->mps_dev);
|
||||
if (dinfo == NULL) {
|
||||
mps_dprint(sc, MPS_FAULT, "%s: NULL dinfo\n", __func__);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
pci_cfg_restore(sc->mps_dev, dinfo);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
161
sys/dev/mps/mps_sas.h
Normal file
161
sys/dev/mps/mps_sas.h
Normal file
@ -0,0 +1,161 @@
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
struct mps_fw_event_work;
|
||||
|
||||
struct mpssas_lun {
|
||||
SLIST_ENTRY(mpssas_lun) lun_link;
|
||||
lun_id_t lun_id;
|
||||
uint8_t eedp_formatted;
|
||||
uint32_t eedp_block_size;
|
||||
};
|
||||
|
||||
struct mpssas_target {
|
||||
uint16_t handle;
|
||||
uint8_t linkrate;
|
||||
uint64_t devname;
|
||||
uint32_t devinfo;
|
||||
uint16_t encl_handle;
|
||||
uint16_t encl_slot;
|
||||
uint8_t flags;
|
||||
#define MPSSAS_TARGET_INABORT (1 << 0)
|
||||
#define MPSSAS_TARGET_INRESET (1 << 1)
|
||||
#define MPSSAS_TARGET_INDIAGRESET (1 << 2)
|
||||
#define MPSSAS_TARGET_INREMOVAL (1 << 3)
|
||||
#define MPSSAS_TARGET_INRECOVERY (MPSSAS_TARGET_INABORT | \
|
||||
MPSSAS_TARGET_INRESET | MPSSAS_TARGET_INCHIPRESET)
|
||||
#define MPSSAS_TARGET_ADD (1 << 29)
|
||||
#define MPSSAS_TARGET_REMOVE (1 << 30)
|
||||
uint16_t tid;
|
||||
SLIST_HEAD(, mpssas_lun) luns;
|
||||
TAILQ_HEAD(, mps_command) commands;
|
||||
struct mps_command *tm;
|
||||
TAILQ_HEAD(, mps_command) timedout_commands;
|
||||
uint16_t exp_dev_handle;
|
||||
uint16_t phy_num;
|
||||
uint64_t sasaddr;
|
||||
uint16_t parent_handle;
|
||||
uint64_t parent_sasaddr;
|
||||
uint32_t parent_devinfo;
|
||||
struct sysctl_ctx_list sysctl_ctx;
|
||||
struct sysctl_oid *sysctl_tree;
|
||||
TAILQ_ENTRY(mpssas_target) sysctl_link;
|
||||
uint64_t issued;
|
||||
uint64_t completed;
|
||||
unsigned int outstanding;
|
||||
unsigned int timeouts;
|
||||
unsigned int aborts;
|
||||
unsigned int logical_unit_resets;
|
||||
unsigned int target_resets;
|
||||
};
|
||||
|
||||
struct mpssas_softc {
|
||||
struct mps_softc *sc;
|
||||
u_int flags;
|
||||
#define MPSSAS_IN_DISCOVERY (1 << 0)
|
||||
#define MPSSAS_IN_STARTUP (1 << 1)
|
||||
#define MPSSAS_DISCOVERY_TIMEOUT_PENDING (1 << 2)
|
||||
#define MPSSAS_QUEUE_FROZEN (1 << 3)
|
||||
#define MPSSAS_SHUTDOWN (1 << 4)
|
||||
#define MPSSAS_SCANTHREAD (1 << 5)
|
||||
struct mpssas_target *targets;
|
||||
struct cam_devq *devq;
|
||||
struct cam_sim *sim;
|
||||
struct cam_path *path;
|
||||
struct intr_config_hook sas_ich;
|
||||
struct callout discovery_callout;
|
||||
u_int discovery_timeouts;
|
||||
struct mps_event_handle *mpssas_eh;
|
||||
|
||||
u_int startup_refcount;
|
||||
u_int tm_count;
|
||||
struct proc *sysctl_proc;
|
||||
|
||||
TAILQ_HEAD(, ccb_hdr) ccb_scanq;
|
||||
struct proc *rescan_thread;
|
||||
|
||||
struct taskqueue *ev_tq;
|
||||
struct task ev_task;
|
||||
TAILQ_HEAD(, mps_fw_event_work) ev_queue;
|
||||
};
|
||||
|
||||
MALLOC_DECLARE(M_MPSSAS);
|
||||
|
||||
/*
|
||||
* Abstracted so that the driver can be backwards and forwards compatible
|
||||
* with future versions of CAM that will provide this functionality.
|
||||
*/
|
||||
#define MPS_SET_LUN(lun, ccblun) \
|
||||
mpssas_set_lun(lun, ccblun)
|
||||
|
||||
static __inline int
|
||||
mpssas_set_lun(uint8_t *lun, u_int ccblun)
|
||||
{
|
||||
uint64_t *newlun;
|
||||
|
||||
newlun = (uint64_t *)lun;
|
||||
*newlun = 0;
|
||||
if (ccblun <= 0xff) {
|
||||
/* Peripheral device address method, LUN is 0 to 255 */
|
||||
lun[1] = ccblun;
|
||||
} else if (ccblun <= 0x3fff) {
|
||||
/* Flat space address method, LUN is <= 16383 */
|
||||
scsi_ulto2b(ccblun, lun);
|
||||
lun[0] |= 0x40;
|
||||
} else if (ccblun <= 0xffffff) {
|
||||
/* Extended flat space address method, LUN is <= 16777215 */
|
||||
scsi_ulto3b(ccblun, &lun[1]);
|
||||
/* Extended Flat space address method */
|
||||
lun[0] = 0xc0;
|
||||
/* Length = 1, i.e. LUN is 3 bytes long */
|
||||
lun[0] |= 0x10;
|
||||
/* Extended Address Method */
|
||||
lun[0] |= 0x02;
|
||||
} else {
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
#define MPS_SET_SINGLE_LUN(req, lun) \
|
||||
do { \
|
||||
bzero((req)->LUN, 8); \
|
||||
(req)->LUN[1] = lun; \
|
||||
} while(0)
|
||||
|
||||
void mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ);
|
||||
void mpssas_discovery_end(struct mpssas_softc *sassc);
|
||||
void mpssas_startup_increment(struct mpssas_softc *sassc);
|
||||
void mpssas_startup_decrement(struct mpssas_softc *sassc);
|
||||
|
||||
struct mps_command * mpssas_alloc_tm(struct mps_softc *sc);
|
||||
void mpssas_free_tm(struct mps_softc *sc, struct mps_command *tm);
|
||||
void mpssas_firmware_event_work(void *arg, int pending);
|
865
sys/dev/mps/mps_sas_lsi.c
Normal file
865
sys/dev/mps/mps_sas_lsi.c
Normal file
@ -0,0 +1,865 @@
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/* Communications core for LSI MPT2 */
|
||||
|
||||
/* TODO Move headers to mpsvar */
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/selinfo.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/bio.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/endian.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/kthread.h>
|
||||
#include <sys/taskqueue.h>
|
||||
#include <sys/sbuf.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <sys/rman.h>
|
||||
|
||||
#include <machine/stdarg.h>
|
||||
|
||||
#include <cam/cam.h>
|
||||
#include <cam/cam_ccb.h>
|
||||
#include <cam/cam_debug.h>
|
||||
#include <cam/cam_sim.h>
|
||||
#include <cam/cam_xpt_sim.h>
|
||||
#include <cam/cam_xpt_periph.h>
|
||||
#include <cam/cam_periph.h>
|
||||
#include <cam/scsi/scsi_all.h>
|
||||
#include <cam/scsi/scsi_message.h>
|
||||
|
||||
#include <dev/mps/mpi/mpi2_type.h>
|
||||
#include <dev/mps/mpi/mpi2.h>
|
||||
#include <dev/mps/mpi/mpi2_ioc.h>
|
||||
#include <dev/mps/mpi/mpi2_sas.h>
|
||||
#include <dev/mps/mpi/mpi2_cnfg.h>
|
||||
#include <dev/mps/mpi/mpi2_init.h>
|
||||
#include <dev/mps/mpi/mpi2_raid.h>
|
||||
#include <dev/mps/mpi/mpi2_tool.h>
|
||||
#include <dev/mps/mps_ioctl.h>
|
||||
#include <dev/mps/mpsvar.h>
|
||||
#include <dev/mps/mps_table.h>
|
||||
#include <dev/mps/mps_sas.h>
|
||||
|
||||
/* For Hashed SAS Address creation for SATA Drives */
|
||||
#define MPT2SAS_SN_LEN 20
|
||||
#define MPT2SAS_MN_LEN 40
|
||||
|
||||
struct mps_fw_event_work {
|
||||
u16 event;
|
||||
void *event_data;
|
||||
TAILQ_ENTRY(mps_fw_event_work) ev_link;
|
||||
};
|
||||
|
||||
union _sata_sas_address {
|
||||
u8 wwid[8];
|
||||
struct {
|
||||
u32 high;
|
||||
u32 low;
|
||||
} word;
|
||||
};
|
||||
|
||||
/*
|
||||
* define the IDENTIFY DEVICE structure
|
||||
*/
|
||||
struct _ata_identify_device_data {
|
||||
u16 reserved1[10]; /* 0-9 */
|
||||
u16 serial_number[10]; /* 10-19 */
|
||||
u16 reserved2[7]; /* 20-26 */
|
||||
u16 model_number[20]; /* 27-46*/
|
||||
u16 reserved3[209]; /* 47-255*/
|
||||
};
|
||||
|
||||
static void mpssas_fw_work(struct mps_softc *sc,
|
||||
struct mps_fw_event_work *fw_event);
|
||||
static void mpssas_fw_event_free(struct mps_softc *,
|
||||
struct mps_fw_event_work *);
|
||||
static int mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate);
|
||||
static int mpssas_get_sata_identify(struct mps_softc *sc, u16 handle,
|
||||
Mpi2SataPassthroughReply_t *mpi_reply, char *id_buffer, int sz,
|
||||
u32 devinfo);
|
||||
int mpssas_get_sas_address_for_sata_disk(struct mps_softc *sc,
|
||||
u64 *sas_address, u16 handle, u32 device_info);
|
||||
static int mpssas_volume_add(struct mps_softc *sc,
|
||||
Mpi2EventIrConfigElement_t *element);
|
||||
|
||||
void
|
||||
mpssas_evt_handler(struct mps_softc *sc, uintptr_t data,
|
||||
MPI2_EVENT_NOTIFICATION_REPLY *event)
|
||||
{
|
||||
struct mps_fw_event_work *fw_event;
|
||||
u16 sz;
|
||||
|
||||
mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
|
||||
mps_print_evt_sas(sc, event);
|
||||
mpssas_record_event(sc, event);
|
||||
|
||||
fw_event = malloc(sizeof(struct mps_fw_event_work), M_MPT2,
|
||||
M_ZERO|M_NOWAIT);
|
||||
if (!fw_event) {
|
||||
printf("%s: allocate failed for fw_event\n", __func__);
|
||||
return;
|
||||
}
|
||||
sz = le16toh(event->EventDataLength) * 4;
|
||||
fw_event->event_data = malloc(sz, M_MPT2, M_ZERO|M_NOWAIT);
|
||||
if (!fw_event->event_data) {
|
||||
printf("%s: allocate failed for event_data\n", __func__);
|
||||
free(fw_event, M_MPT2);
|
||||
return;
|
||||
}
|
||||
|
||||
bcopy(event->EventData, fw_event->event_data, sz);
|
||||
fw_event->event = event->Event;
|
||||
if ((event->Event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST ||
|
||||
event->Event == MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE ||
|
||||
event->Event == MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST) &&
|
||||
sc->track_mapping_events)
|
||||
sc->pending_map_events++;
|
||||
|
||||
/*
|
||||
* When wait_for_port_enable flag is set, make sure that all the events
|
||||
* are processed. Increment the startup_refcount and decrement it after
|
||||
* events are processed.
|
||||
*/
|
||||
if ((event->Event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST ||
|
||||
event->Event == MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST) &&
|
||||
sc->wait_for_port_enable)
|
||||
mpssas_startup_increment(sc->sassc);
|
||||
|
||||
TAILQ_INSERT_TAIL(&sc->sassc->ev_queue, fw_event, ev_link);
|
||||
taskqueue_enqueue(sc->sassc->ev_tq, &sc->sassc->ev_task);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
mpssas_fw_event_free(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
|
||||
{
|
||||
|
||||
free(fw_event->event_data, M_MPT2);
|
||||
free(fw_event, M_MPT2);
|
||||
}
|
||||
|
||||
/**
|
||||
* _mps_fw_work - delayed task for processing firmware events
|
||||
* @sc: per adapter object
|
||||
* @fw_event: The fw_event_work object
|
||||
* Context: user.
|
||||
*
|
||||
* Return nothing.
|
||||
*/
|
||||
static void
|
||||
mpssas_fw_work(struct mps_softc *sc, struct mps_fw_event_work *fw_event)
|
||||
{
|
||||
struct mpssas_softc *sassc;
|
||||
sassc = sc->sassc;
|
||||
|
||||
switch (fw_event->event) {
|
||||
case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
|
||||
{
|
||||
MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data;
|
||||
MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy;
|
||||
int i;
|
||||
|
||||
data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *)
|
||||
fw_event->event_data;
|
||||
|
||||
mps_mapping_topology_change_event(sc, fw_event->event_data);
|
||||
|
||||
for (i = 0; i < data->NumEntries; i++) {
|
||||
phy = &data->PHY[i];
|
||||
switch (phy->PhyStatus & MPI2_EVENT_SAS_TOPO_RC_MASK) {
|
||||
case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
|
||||
if (mpssas_add_device(sc,
|
||||
phy->AttachedDevHandle, phy->LinkRate)){
|
||||
printf("%s: failed to add device with "
|
||||
"handle 0x%x\n", __func__,
|
||||
phy->AttachedDevHandle);
|
||||
mpssas_prepare_remove(sassc, phy->
|
||||
AttachedDevHandle);
|
||||
}
|
||||
break;
|
||||
case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING:
|
||||
mpssas_prepare_remove(sassc, phy->
|
||||
AttachedDevHandle);
|
||||
break;
|
||||
case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:
|
||||
case MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE:
|
||||
case MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* refcount was incremented for this event in
|
||||
* mpssas_evt_handler. Decrement it here because the event has
|
||||
* been processed.
|
||||
*/
|
||||
mpssas_startup_decrement(sassc);
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_SAS_DISCOVERY:
|
||||
{
|
||||
MPI2_EVENT_DATA_SAS_DISCOVERY *data;
|
||||
|
||||
data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)fw_event->event_data;
|
||||
|
||||
if (data->ReasonCode & MPI2_EVENT_SAS_DISC_RC_STARTED)
|
||||
mps_dprint(sc, MPS_TRACE,"SAS discovery start event\n");
|
||||
if (data->ReasonCode & MPI2_EVENT_SAS_DISC_RC_COMPLETED) {
|
||||
mps_dprint(sc, MPS_TRACE,"SAS discovery stop event\n");
|
||||
sassc->flags &= ~MPSSAS_IN_DISCOVERY;
|
||||
mpssas_discovery_end(sassc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
|
||||
{
|
||||
Mpi2EventDataSasEnclDevStatusChange_t *data;
|
||||
data = (Mpi2EventDataSasEnclDevStatusChange_t *)
|
||||
fw_event->event_data;
|
||||
mps_mapping_enclosure_dev_status_change_event(sc,
|
||||
fw_event->event_data);
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST:
|
||||
{
|
||||
Mpi2EventIrConfigElement_t *element;
|
||||
int i;
|
||||
u8 foreign_config;
|
||||
Mpi2EventDataIrConfigChangeList_t *event_data;
|
||||
struct mpssas_target *targ;
|
||||
unsigned int id;
|
||||
|
||||
event_data = fw_event->event_data;
|
||||
foreign_config = (le32toh(event_data->Flags) &
|
||||
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
|
||||
|
||||
element =
|
||||
(Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
|
||||
id = mps_mapping_get_raid_id_from_handle
|
||||
(sc, element->VolDevHandle);
|
||||
|
||||
mps_mapping_ir_config_change_event(sc, event_data);
|
||||
|
||||
for (i = 0; i < event_data->NumElements; i++, element++) {
|
||||
switch (element->ReasonCode) {
|
||||
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
|
||||
case MPI2_EVENT_IR_CHANGE_RC_ADDED:
|
||||
if (!foreign_config) {
|
||||
if (mpssas_volume_add(sc, element)) {
|
||||
printf("%s: failed to add RAID "
|
||||
"volume with handle 0x%x\n",
|
||||
__func__, le16toh(element->
|
||||
VolDevHandle));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
|
||||
case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
|
||||
/*
|
||||
* Rescan after volume is deleted or removed.
|
||||
*/
|
||||
if (!foreign_config) {
|
||||
if (id == MPS_MAP_BAD_ID) {
|
||||
printf("%s: could not get ID "
|
||||
"for volume with handle "
|
||||
"0x%04x\n", __func__,
|
||||
element->VolDevHandle);
|
||||
break;
|
||||
}
|
||||
|
||||
targ = &sassc->targets[id];
|
||||
targ->handle = 0x0;
|
||||
targ->encl_slot = 0x0;
|
||||
targ->encl_handle = 0x0;
|
||||
targ->exp_dev_handle = 0x0;
|
||||
targ->phy_num = 0x0;
|
||||
targ->linkrate = 0x0;
|
||||
mpssas_rescan_target(sc, targ);
|
||||
printf("RAID target id 0x%x removed\n",
|
||||
targ->tid);
|
||||
}
|
||||
break;
|
||||
case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
|
||||
/*
|
||||
* Phys Disk of a volume has been created. Hide
|
||||
* it from the OS.
|
||||
*/
|
||||
mpssas_prepare_remove(sassc, element->
|
||||
PhysDiskDevHandle);
|
||||
break;
|
||||
case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
|
||||
/*
|
||||
* Phys Disk of a volume has been deleted.
|
||||
* Expose it to the OS.
|
||||
*/
|
||||
if (mpssas_add_device(sc,
|
||||
element->PhysDiskDevHandle, 0)){
|
||||
printf("%s: failed to add device with "
|
||||
"handle 0x%x\n", __func__,
|
||||
element->PhysDiskDevHandle);
|
||||
mpssas_prepare_remove(sassc, element->
|
||||
PhysDiskDevHandle);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* refcount was incremented for this event in
|
||||
* mpssas_evt_handler. Decrement it here because the event has
|
||||
* been processed.
|
||||
*/
|
||||
mpssas_startup_decrement(sassc);
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_IR_VOLUME:
|
||||
{
|
||||
Mpi2EventDataIrVolume_t *event_data = fw_event->event_data;
|
||||
|
||||
/*
|
||||
* Informational only.
|
||||
*/
|
||||
mps_dprint(sc, MPS_INFO, "Received IR Volume event:\n");
|
||||
switch (event_data->ReasonCode) {
|
||||
case MPI2_EVENT_IR_VOLUME_RC_SETTINGS_CHANGED:
|
||||
mps_dprint(sc, MPS_INFO, " Volume Settings "
|
||||
"changed from 0x%x to 0x%x for Volome with "
|
||||
"handle 0x%x", event_data->PreviousValue,
|
||||
event_data->NewValue,
|
||||
event_data->VolDevHandle);
|
||||
break;
|
||||
case MPI2_EVENT_IR_VOLUME_RC_STATUS_FLAGS_CHANGED:
|
||||
mps_dprint(sc, MPS_INFO, " Volume Status "
|
||||
"changed from 0x%x to 0x%x for Volome with "
|
||||
"handle 0x%x", event_data->PreviousValue,
|
||||
event_data->NewValue,
|
||||
event_data->VolDevHandle);
|
||||
break;
|
||||
case MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED:
|
||||
mps_dprint(sc, MPS_INFO, " Volume State "
|
||||
"changed from 0x%x to 0x%x for Volome with "
|
||||
"handle 0x%x", event_data->PreviousValue,
|
||||
event_data->NewValue,
|
||||
event_data->VolDevHandle);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_IR_PHYSICAL_DISK:
|
||||
{
|
||||
Mpi2EventDataIrPhysicalDisk_t *event_data =
|
||||
fw_event->event_data;
|
||||
|
||||
/*
|
||||
* Informational only.
|
||||
*/
|
||||
mps_dprint(sc, MPS_INFO, "Received IR Phys Disk event:\n");
|
||||
switch (event_data->ReasonCode) {
|
||||
case MPI2_EVENT_IR_PHYSDISK_RC_SETTINGS_CHANGED:
|
||||
mps_dprint(sc, MPS_INFO, " Phys Disk Settings "
|
||||
"changed from 0x%x to 0x%x for Phys Disk Number "
|
||||
"%d and handle 0x%x at Enclosure handle 0x%x, Slot "
|
||||
"%d", event_data->PreviousValue,
|
||||
event_data->NewValue, event_data->PhysDiskNum,
|
||||
event_data->PhysDiskDevHandle,
|
||||
event_data->EnclosureHandle, event_data->Slot);
|
||||
break;
|
||||
case MPI2_EVENT_IR_PHYSDISK_RC_STATUS_FLAGS_CHANGED:
|
||||
mps_dprint(sc, MPS_INFO, " Phys Disk Status changed "
|
||||
"from 0x%x to 0x%x for Phys Disk Number %d and "
|
||||
"handle 0x%x at Enclosure handle 0x%x, Slot %d",
|
||||
event_data->PreviousValue, event_data->NewValue,
|
||||
event_data->PhysDiskNum,
|
||||
event_data->PhysDiskDevHandle,
|
||||
event_data->EnclosureHandle, event_data->Slot);
|
||||
break;
|
||||
case MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED:
|
||||
mps_dprint(sc, MPS_INFO, " Phys Disk State changed "
|
||||
"from 0x%x to 0x%x for Phys Disk Number %d and "
|
||||
"handle 0x%x at Enclosure handle 0x%x, Slot %d",
|
||||
event_data->PreviousValue, event_data->NewValue,
|
||||
event_data->PhysDiskNum,
|
||||
event_data->PhysDiskDevHandle,
|
||||
event_data->EnclosureHandle, event_data->Slot);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_IR_OPERATION_STATUS:
|
||||
{
|
||||
Mpi2EventDataIrOperationStatus_t *event_data =
|
||||
fw_event->event_data;
|
||||
|
||||
/*
|
||||
* Informational only.
|
||||
*/
|
||||
mps_dprint(sc, MPS_INFO, "Received IR Op Status event:\n");
|
||||
mps_dprint(sc, MPS_INFO, " RAID Operation of %d is %d "
|
||||
"percent complete for Volume with handle 0x%x",
|
||||
event_data->RAIDOperation, event_data->PercentComplete,
|
||||
event_data->VolDevHandle);
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_LOG_ENTRY_ADDED:
|
||||
{
|
||||
pMpi2EventDataLogEntryAdded_t logEntry;
|
||||
uint16_t logQualifier;
|
||||
uint8_t logCode;
|
||||
|
||||
logEntry = (pMpi2EventDataLogEntryAdded_t)fw_event->event_data;
|
||||
logQualifier = logEntry->LogEntryQualifier;
|
||||
|
||||
if (logQualifier == MPI2_WD_LOG_ENTRY) {
|
||||
logCode = logEntry->LogData[0];
|
||||
|
||||
switch (logCode) {
|
||||
case MPI2_WD_SSD_THROTTLING:
|
||||
printf("WarpDrive Warning: IO Throttling has "
|
||||
"occurred in the WarpDrive subsystem. "
|
||||
"Check WarpDrive documentation for "
|
||||
"additional details\n");
|
||||
break;
|
||||
case MPI2_WD_DRIVE_LIFE_WARN:
|
||||
printf("WarpDrive Warning: Program/Erase "
|
||||
"Cycles for the WarpDrive subsystem in "
|
||||
"degraded range. Check WarpDrive "
|
||||
"documentation for additional details\n");
|
||||
break;
|
||||
case MPI2_WD_DRIVE_LIFE_DEAD:
|
||||
printf("WarpDrive Fatal Error: There are no "
|
||||
"Program/Erase Cycles for the WarpDrive "
|
||||
"subsystem. The storage device will be in "
|
||||
"read-only mode. Check WarpDrive "
|
||||
"documentation for additional details\n");
|
||||
break;
|
||||
case MPI2_WD_RAIL_MON_FAIL:
|
||||
printf("WarpDrive Fatal Error: The Backup Rail "
|
||||
"Monitor has failed on the WarpDrive "
|
||||
"subsystem. Check WarpDrive documentation "
|
||||
"for additional details\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
|
||||
case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
|
||||
default:
|
||||
mps_dprint(sc, MPS_TRACE,"Unhandled event 0x%0X\n",
|
||||
fw_event->event);
|
||||
break;
|
||||
|
||||
}
|
||||
mpssas_fw_event_free(sc, fw_event);
|
||||
}
|
||||
|
||||
void
|
||||
mpssas_firmware_event_work(void *arg, int pending)
|
||||
{
|
||||
struct mps_fw_event_work *fw_event;
|
||||
struct mps_softc *sc;
|
||||
|
||||
sc = (struct mps_softc *)arg;
|
||||
mps_lock(sc);
|
||||
while ((fw_event = TAILQ_FIRST(&sc->sassc->ev_queue)) != NULL) {
|
||||
TAILQ_REMOVE(&sc->sassc->ev_queue, fw_event, ev_link);
|
||||
mpssas_fw_work(sc, fw_event);
|
||||
}
|
||||
mps_unlock(sc);
|
||||
}
|
||||
|
||||
static int
|
||||
mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){
|
||||
char devstring[80];
|
||||
struct mpssas_softc *sassc;
|
||||
struct mpssas_target *targ;
|
||||
Mpi2ConfigReply_t mpi_reply;
|
||||
Mpi2SasDevicePage0_t config_page;
|
||||
uint64_t sas_address, sata_sas_address;
|
||||
uint64_t parent_sas_address = 0;
|
||||
u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags);
|
||||
u32 device_info, parent_devinfo = 0;
|
||||
unsigned int id;
|
||||
int ret;
|
||||
int error = 0;
|
||||
|
||||
sassc = sc->sassc;
|
||||
mpssas_startup_increment(sassc);
|
||||
if ((mps_config_get_sas_device_pg0(sc, &mpi_reply, &config_page,
|
||||
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
|
||||
printf("%s: error reading SAS device page0\n", __func__);
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
device_info = le32toh(config_page.DeviceInfo);
|
||||
|
||||
if (((device_info & MPI2_SAS_DEVICE_INFO_SMP_TARGET) == 0)
|
||||
&& (config_page.ParentDevHandle != 0)) {
|
||||
Mpi2ConfigReply_t tmp_mpi_reply;
|
||||
Mpi2SasDevicePage0_t parent_config_page;
|
||||
|
||||
if ((mps_config_get_sas_device_pg0(sc, &tmp_mpi_reply,
|
||||
&parent_config_page, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
|
||||
le16toh(config_page.ParentDevHandle)))) {
|
||||
printf("%s: error reading SAS device %#x page0\n",
|
||||
__func__, le16toh(config_page.ParentDevHandle));
|
||||
} else {
|
||||
parent_sas_address = parent_config_page.SASAddress.High;
|
||||
parent_sas_address = (parent_sas_address << 32) |
|
||||
parent_config_page.SASAddress.Low;
|
||||
parent_devinfo = le32toh(parent_config_page.DeviceInfo);
|
||||
}
|
||||
}
|
||||
/* TODO Check proper endianess */
|
||||
sas_address = config_page.SASAddress.High;
|
||||
sas_address = (sas_address << 32) |
|
||||
config_page.SASAddress.Low;
|
||||
|
||||
if ((ioc_pg8_flags & MPI2_IOCPAGE8_FLAGS_MASK_MAPPING_MODE)
|
||||
== MPI2_IOCPAGE8_FLAGS_DEVICE_PERSISTENCE_MAPPING) {
|
||||
if (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE) {
|
||||
ret = mpssas_get_sas_address_for_sata_disk(sc,
|
||||
&sata_sas_address, handle, device_info);
|
||||
if (!ret)
|
||||
id = mps_mapping_get_sas_id(sc,
|
||||
sata_sas_address, handle);
|
||||
else
|
||||
id = mps_mapping_get_sas_id(sc,
|
||||
sas_address, handle);
|
||||
} else
|
||||
id = mps_mapping_get_sas_id(sc, sas_address,
|
||||
handle);
|
||||
} else
|
||||
id = mps_mapping_get_sas_id(sc, sas_address, handle);
|
||||
|
||||
if (id == MPS_MAP_BAD_ID) {
|
||||
printf("failure at %s:%d/%s()! Could not get ID for device "
|
||||
"with handle 0x%04x\n", __FILE__, __LINE__, __func__,
|
||||
handle);
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
}
|
||||
mps_vprintf(sc, "SAS Address from SAS device page0 = %jx\n",
|
||||
sas_address);
|
||||
targ = &sassc->targets[id];
|
||||
targ->devinfo = device_info;
|
||||
targ->devname = le32toh(config_page.DeviceName.High);
|
||||
targ->devname = (targ->devname << 32) |
|
||||
le32toh(config_page.DeviceName.Low);
|
||||
targ->encl_handle = le16toh(config_page.EnclosureHandle);
|
||||
targ->encl_slot = le16toh(config_page.Slot);
|
||||
targ->handle = handle;
|
||||
targ->parent_handle = le16toh(config_page.ParentDevHandle);
|
||||
targ->sasaddr = mps_to_u64(&config_page.SASAddress);
|
||||
targ->parent_sasaddr = le64toh(parent_sas_address);
|
||||
targ->parent_devinfo = parent_devinfo;
|
||||
targ->tid = id;
|
||||
targ->linkrate = (linkrate>>4);
|
||||
targ->flags = 0;
|
||||
TAILQ_INIT(&targ->commands);
|
||||
TAILQ_INIT(&targ->timedout_commands);
|
||||
SLIST_INIT(&targ->luns);
|
||||
mps_describe_devinfo(targ->devinfo, devstring, 80);
|
||||
mps_vprintf(sc, "Found device <%s> <%s> <0x%04x> <%d/%d>\n", devstring,
|
||||
mps_describe_table(mps_linkrate_names, targ->linkrate),
|
||||
targ->handle, targ->encl_handle, targ->encl_slot);
|
||||
if ((sassc->flags & MPSSAS_IN_STARTUP) == 0)
|
||||
mpssas_rescan_target(sc, targ);
|
||||
mps_vprintf(sc, "Target id 0x%x added\n", targ->tid);
|
||||
out:
|
||||
mpssas_startup_decrement(sassc);
|
||||
return (error);
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
mpssas_get_sas_address_for_sata_disk(struct mps_softc *sc,
|
||||
u64 *sas_address, u16 handle, u32 device_info)
|
||||
{
|
||||
Mpi2SataPassthroughReply_t mpi_reply;
|
||||
int i, rc, try_count;
|
||||
u32 *bufferptr;
|
||||
union _sata_sas_address hash_address;
|
||||
struct _ata_identify_device_data ata_identify;
|
||||
u8 buffer[MPT2SAS_MN_LEN + MPT2SAS_SN_LEN];
|
||||
u32 ioc_status;
|
||||
u8 sas_status;
|
||||
|
||||
memset(&ata_identify, 0, sizeof(ata_identify));
|
||||
try_count = 0;
|
||||
do {
|
||||
rc = mpssas_get_sata_identify(sc, handle, &mpi_reply,
|
||||
(char *)&ata_identify, sizeof(ata_identify), device_info);
|
||||
try_count++;
|
||||
ioc_status = le16toh(mpi_reply.IOCStatus)
|
||||
& MPI2_IOCSTATUS_MASK;
|
||||
sas_status = mpi_reply.SASStatus;
|
||||
} while ((rc == -EAGAIN || ioc_status || sas_status) &&
|
||||
(try_count < 5));
|
||||
|
||||
if (rc == 0 && !ioc_status && !sas_status) {
|
||||
mps_dprint(sc, MPS_INFO, "%s: got SATA identify successfully "
|
||||
"for handle = 0x%x with try_count = %d\n",
|
||||
__func__, handle, try_count);
|
||||
} else {
|
||||
mps_dprint(sc, MPS_INFO, "%s: handle = 0x%x failed\n",
|
||||
__func__, handle);
|
||||
return -1;
|
||||
}
|
||||
/* Copy & byteswap the 40 byte model number to a buffer */
|
||||
for (i = 0; i < MPT2SAS_MN_LEN; i += 2) {
|
||||
buffer[i] = ((u8 *)ata_identify.model_number)[i + 1];
|
||||
buffer[i + 1] = ((u8 *)ata_identify.model_number)[i];
|
||||
}
|
||||
/* Copy & byteswap the 20 byte serial number to a buffer */
|
||||
for (i = 0; i < MPT2SAS_SN_LEN; i += 2) {
|
||||
buffer[MPT2SAS_MN_LEN + i] =
|
||||
((u8 *)ata_identify.serial_number)[i + 1];
|
||||
buffer[MPT2SAS_MN_LEN + i + 1] =
|
||||
((u8 *)ata_identify.serial_number)[i];
|
||||
}
|
||||
bufferptr = (u32 *)buffer;
|
||||
/* There are 60 bytes to hash down to 8. 60 isn't divisible by 8,
|
||||
* so loop through the first 56 bytes (7*8),
|
||||
* and then add in the last dword.
|
||||
*/
|
||||
hash_address.word.low = 0;
|
||||
hash_address.word.high = 0;
|
||||
for (i = 0; (i < ((MPT2SAS_MN_LEN+MPT2SAS_SN_LEN)/8)); i++) {
|
||||
hash_address.word.low += *bufferptr;
|
||||
bufferptr++;
|
||||
hash_address.word.high += *bufferptr;
|
||||
bufferptr++;
|
||||
}
|
||||
/* Add the last dword */
|
||||
hash_address.word.low += *bufferptr;
|
||||
/* Make sure the hash doesn't start with 5, because it could clash
|
||||
* with a SAS address. Change 5 to a D.
|
||||
*/
|
||||
if ((hash_address.word.high & 0x000000F0) == (0x00000050))
|
||||
hash_address.word.high |= 0x00000080;
|
||||
*sas_address = (u64)hash_address.wwid[0] << 56 |
|
||||
(u64)hash_address.wwid[1] << 48 | (u64)hash_address.wwid[2] << 40 |
|
||||
(u64)hash_address.wwid[3] << 32 | (u64)hash_address.wwid[4] << 24 |
|
||||
(u64)hash_address.wwid[5] << 16 | (u64)hash_address.wwid[6] << 8 |
|
||||
(u64)hash_address.wwid[7];
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
mpssas_get_sata_identify(struct mps_softc *sc, u16 handle,
|
||||
Mpi2SataPassthroughReply_t *mpi_reply, char *id_buffer, int sz, u32 devinfo)
|
||||
{
|
||||
Mpi2SataPassthroughRequest_t *mpi_request;
|
||||
Mpi2SataPassthroughReply_t *reply;
|
||||
struct mps_command *cm;
|
||||
char *buffer;
|
||||
int error = 0;
|
||||
|
||||
buffer = malloc( sz, M_MPT2, M_NOWAIT | M_ZERO);
|
||||
if (!buffer)
|
||||
return ENOMEM;
|
||||
|
||||
if ((cm = mps_alloc_command(sc)) == NULL)
|
||||
return (EBUSY);
|
||||
mpi_request = (MPI2_SATA_PASSTHROUGH_REQUEST *)cm->cm_req;
|
||||
bzero(mpi_request,sizeof(MPI2_SATA_PASSTHROUGH_REQUEST));
|
||||
mpi_request->Function = MPI2_FUNCTION_SATA_PASSTHROUGH;
|
||||
mpi_request->VF_ID = 0;
|
||||
mpi_request->DevHandle = htole16(handle);
|
||||
mpi_request->PassthroughFlags = (MPI2_SATA_PT_REQ_PT_FLAGS_PIO |
|
||||
MPI2_SATA_PT_REQ_PT_FLAGS_READ);
|
||||
mpi_request->DataLength = htole32(sz);
|
||||
mpi_request->CommandFIS[0] = 0x27;
|
||||
mpi_request->CommandFIS[1] = 0x80;
|
||||
mpi_request->CommandFIS[2] = (devinfo &
|
||||
MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE) ? 0xA1 : 0xEC;
|
||||
cm->cm_sge = &mpi_request->SGL;
|
||||
cm->cm_sglsize = sizeof(MPI2_SGE_IO_UNION);
|
||||
cm->cm_flags = MPS_CM_FLAGS_SGE_SIMPLE | MPS_CM_FLAGS_DATAIN;
|
||||
cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
|
||||
cm->cm_data = buffer;
|
||||
cm->cm_length = htole32(sz);
|
||||
error = mps_request_polled(sc, cm);
|
||||
reply = (Mpi2SataPassthroughReply_t *)cm->cm_reply;
|
||||
if (error || (reply == NULL)) {
|
||||
/* FIXME */
|
||||
/* If the poll returns error then we need to do diag reset */
|
||||
printf("%s: poll for page completed with error %d",
|
||||
__func__, error);
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
}
|
||||
bcopy(buffer, id_buffer, sz);
|
||||
bcopy(reply, mpi_reply, sizeof(Mpi2SataPassthroughReply_t));
|
||||
if ((reply->IOCStatus & MPI2_IOCSTATUS_MASK) !=
|
||||
MPI2_IOCSTATUS_SUCCESS) {
|
||||
printf("%s: error reading SATA PASSTHRU; iocstatus = 0x%x\n",
|
||||
__func__, reply->IOCStatus);
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
mps_free_command(sc, cm);
|
||||
free(buffer, M_MPT2);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
mpssas_volume_add(struct mps_softc *sc, Mpi2EventIrConfigElement_t *element)
|
||||
{
|
||||
struct mpssas_softc *sassc;
|
||||
struct mpssas_target *targ;
|
||||
u64 wwid;
|
||||
u16 handle = le16toh(element->VolDevHandle);
|
||||
unsigned int id;
|
||||
int error = 0;
|
||||
|
||||
sassc = sc->sassc;
|
||||
mpssas_startup_increment(sassc);
|
||||
mps_config_get_volume_wwid(sc, handle, &wwid);
|
||||
if (!wwid) {
|
||||
printf("%s: invalid WWID; cannot add volume to mapping table\n",
|
||||
__func__);
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
id = mps_mapping_get_raid_id(sc, wwid, handle);
|
||||
if (id == MPS_MAP_BAD_ID) {
|
||||
printf("%s: could not get ID for volume with handle 0x%04x and "
|
||||
"WWID 0x%016llx\n", __func__, handle,
|
||||
(unsigned long long)wwid);
|
||||
error = ENXIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
targ = &sassc->targets[id];
|
||||
targ->tid = id;
|
||||
targ->handle = handle;
|
||||
targ->devname = wwid;
|
||||
TAILQ_INIT(&targ->commands);
|
||||
TAILQ_INIT(&targ->timedout_commands);
|
||||
SLIST_INIT(&targ->luns);
|
||||
if ((sassc->flags & MPSSAS_IN_STARTUP) == 0)
|
||||
mpssas_rescan_target(sc, targ);
|
||||
mps_dprint(sc, MPS_INFO, "RAID target id %d added (WWID = 0x%jx)\n",
|
||||
targ->tid, wwid);
|
||||
out:
|
||||
mpssas_startup_decrement(sassc);
|
||||
return (error);
|
||||
}
|
||||
|
||||
/**
|
||||
* mpssas_ir_shutdown - IR shutdown notification
|
||||
* @sc: per adapter object
|
||||
*
|
||||
* Sending RAID Action to alert the Integrated RAID subsystem of the IOC that
|
||||
* the host system is shutting down.
|
||||
*
|
||||
* Return nothing.
|
||||
*/
|
||||
void
|
||||
mpssas_ir_shutdown(struct mps_softc *sc)
|
||||
{
|
||||
u16 volume_mapping_flags;
|
||||
u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags);
|
||||
struct dev_mapping_table *mt_entry;
|
||||
u32 start_idx, end_idx;
|
||||
unsigned int id, found_volume = 0;
|
||||
struct mps_command *cm;
|
||||
Mpi2RaidActionRequest_t *action;
|
||||
|
||||
mps_dprint(sc, MPS_TRACE, "%s\n", __func__);
|
||||
|
||||
/* is IR firmware build loaded? */
|
||||
if (!sc->ir_firmware)
|
||||
return;
|
||||
|
||||
/* are there any volumes? Look at IR target IDs. */
|
||||
// TODO-later, this should be looked up in the RAID config structure
|
||||
// when it is implemented.
|
||||
volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) &
|
||||
MPI2_IOCPAGE8_IRFLAGS_MASK_VOLUME_MAPPING_MODE;
|
||||
if (volume_mapping_flags == MPI2_IOCPAGE8_IRFLAGS_LOW_VOLUME_MAPPING) {
|
||||
start_idx = 0;
|
||||
if (ioc_pg8_flags & MPI2_IOCPAGE8_FLAGS_RESERVED_TARGETID_0)
|
||||
start_idx = 1;
|
||||
} else
|
||||
start_idx = sc->max_devices - sc->max_volumes;
|
||||
end_idx = start_idx + sc->max_volumes - 1;
|
||||
|
||||
for (id = start_idx; id < end_idx; id++) {
|
||||
mt_entry = &sc->mapping_table[id];
|
||||
if ((mt_entry->physical_id != 0) &&
|
||||
(mt_entry->missing_count == 0)) {
|
||||
found_volume = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_volume)
|
||||
return;
|
||||
|
||||
if ((cm = mps_alloc_command(sc)) == NULL) {
|
||||
printf("%s: command alloc failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
action = (MPI2_RAID_ACTION_REQUEST *)cm->cm_req;
|
||||
action->Function = MPI2_FUNCTION_RAID_ACTION;
|
||||
action->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
|
||||
cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
|
||||
mps_request_polled(sc, cm);
|
||||
|
||||
/*
|
||||
* Don't check for reply, just leave.
|
||||
*/
|
||||
if (cm)
|
||||
mps_free_command(sc, cm);
|
||||
}
|
@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* Debugging tables for MPT2 */
|
||||
|
||||
/* TODO Move headers to mpsvar */
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -41,6 +42,9 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/kthread.h>
|
||||
#include <sys/taskqueue.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
@ -53,6 +57,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/mps/mpi/mpi2_ioc.h>
|
||||
#include <dev/mps/mpi/mpi2_cnfg.h>
|
||||
#include <dev/mps/mpi/mpi2_init.h>
|
||||
#include <dev/mps/mpi/mpi2_tool.h>
|
||||
#include <dev/mps/mps_ioctl.h>
|
||||
#include <dev/mps/mpsvar.h>
|
||||
#include <dev/mps/mps_table.h>
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -22,13 +22,44 @@
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
/*-
|
||||
* Copyright (c) 2011 LSI Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* LSI MPT-Fusion Host Adapter FreeBSD
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MPSVAR_H
|
||||
#define _MPSVAR_H
|
||||
|
||||
#define MPS_DRIVER_VERSION "11.255.03.00-fbsd"
|
||||
|
||||
#define MPS_DB_MAX_WAIT 2500
|
||||
|
||||
#define MPS_REQ_FRAMES 1024
|
||||
@ -41,12 +72,137 @@
|
||||
#define MPS_SGE32_SIZE 8
|
||||
#define MPS_SGC_SIZE 8
|
||||
|
||||
#define CAN_SLEEP 1
|
||||
#define NO_SLEEP 0
|
||||
|
||||
#define MPS_PERIODIC_DELAY 1 /* 1 second heartbeat/watchdog check */
|
||||
|
||||
#define MPS_SCSI_RI_INVALID_FRAME (0x00000002)
|
||||
|
||||
/*
|
||||
* host mapping related macro definitions
|
||||
*/
|
||||
#define MPS_MAPTABLE_BAD_IDX 0xFFFFFFFF
|
||||
#define MPS_DPM_BAD_IDX 0xFFFF
|
||||
#define MPS_ENCTABLE_BAD_IDX 0xFF
|
||||
#define MPS_MAX_MISSING_COUNT 0x0F
|
||||
#define MPS_DEV_RESERVED 0x20000000
|
||||
#define MPS_MAP_IN_USE 0x10000000
|
||||
#define MPS_RAID_CHANNEL 1
|
||||
#define MPS_MAP_BAD_ID 0xFFFFFFFF
|
||||
|
||||
/*
|
||||
* WarpDrive controller
|
||||
*/
|
||||
#define MPS_CHIP_WD_DEVICE_ID 0x007E
|
||||
#define MPS_WD_LSI_OEM 0x80
|
||||
#define MPS_WD_HIDE_EXPOSE_MASK 0x03
|
||||
#define MPS_WD_HIDE_ALWAYS 0x00
|
||||
#define MPS_WD_EXPOSE_ALWAYS 0x01
|
||||
#define MPS_WD_HIDE_IF_VOLUME 0x02
|
||||
#define MPS_WD_RETRY 0x01
|
||||
#define MPS_MAN_PAGE10_SIZE 0x5C /* Hardcode for now */
|
||||
#define MPS_MAX_DISKS_IN_VOL 10
|
||||
|
||||
/*
|
||||
* WarpDrive Event Logging
|
||||
*/
|
||||
#define MPI2_WD_LOG_ENTRY 0x8002
|
||||
#define MPI2_WD_SSD_THROTTLING 0x0041
|
||||
#define MPI2_WD_DRIVE_LIFE_WARN 0x0043
|
||||
#define MPI2_WD_DRIVE_LIFE_DEAD 0x0044
|
||||
#define MPI2_WD_RAIL_MON_FAIL 0x004D
|
||||
|
||||
typedef uint8_t u8;
|
||||
typedef uint16_t u16;
|
||||
typedef uint32_t u32;
|
||||
typedef uint64_t u64;
|
||||
|
||||
/**
|
||||
* struct dev_mapping_table - device mapping information
|
||||
* @physical_id: SAS address for drives or WWID for RAID volumes
|
||||
* @device_info: bitfield provides detailed info about the device
|
||||
* @phy_bits: bitfields indicating controller phys
|
||||
* @dpm_entry_num: index of this device in device persistent map table
|
||||
* @dev_handle: device handle for the device pointed by this entry
|
||||
* @channel: target channel
|
||||
* @id: target id
|
||||
* @missing_count: number of times the device not detected by driver
|
||||
* @hide_flag: Hide this physical disk/not (foreign configuration)
|
||||
* @init_complete: Whether the start of the day checks completed or not
|
||||
*/
|
||||
struct dev_mapping_table {
|
||||
u64 physical_id;
|
||||
u32 device_info;
|
||||
u32 phy_bits;
|
||||
u16 dpm_entry_num;
|
||||
u16 dev_handle;
|
||||
u8 reserved1;
|
||||
u8 channel;
|
||||
u16 id;
|
||||
u8 missing_count;
|
||||
u8 init_complete;
|
||||
u8 TLR_bits;
|
||||
u8 reserved2;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct enc_mapping_table - mapping information about an enclosure
|
||||
* @enclosure_id: Logical ID of this enclosure
|
||||
* @start_index: index to the entry in dev_mapping_table
|
||||
* @phy_bits: bitfields indicating controller phys
|
||||
* @dpm_entry_num: index of this enclosure in device persistent map table
|
||||
* @enc_handle: device handle for the enclosure pointed by this entry
|
||||
* @num_slots: number of slots in the enclosure
|
||||
* @start_slot: Starting slot id
|
||||
* @missing_count: number of times the device not detected by driver
|
||||
* @removal_flag: used to mark the device for removal
|
||||
* @skip_search: used as a flag to include/exclude enclosure for search
|
||||
* @init_complete: Whether the start of the day checks completed or not
|
||||
*/
|
||||
struct enc_mapping_table {
|
||||
u64 enclosure_id;
|
||||
u32 start_index;
|
||||
u32 phy_bits;
|
||||
u16 dpm_entry_num;
|
||||
u16 enc_handle;
|
||||
u16 num_slots;
|
||||
u16 start_slot;
|
||||
u8 missing_count;
|
||||
u8 removal_flag;
|
||||
u8 skip_search;
|
||||
u8 init_complete;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct map_removal_table - entries to be removed from mapping table
|
||||
* @dpm_entry_num: index of this device in device persistent map table
|
||||
* @dev_handle: device handle for the device pointed by this entry
|
||||
*/
|
||||
struct map_removal_table{
|
||||
u16 dpm_entry_num;
|
||||
u16 dev_handle;
|
||||
};
|
||||
|
||||
typedef struct mps_fw_diagnostic_buffer {
|
||||
size_t size;
|
||||
uint8_t extended_type;
|
||||
uint8_t buffer_type;
|
||||
uint8_t force_release;
|
||||
uint32_t product_specific[23];
|
||||
uint8_t immediate;
|
||||
uint8_t enabled;
|
||||
uint8_t valid_data;
|
||||
uint8_t owned_by_firmware;
|
||||
uint32_t unique_id;
|
||||
} mps_fw_diagnostic_buffer_t;
|
||||
|
||||
struct mps_softc;
|
||||
struct mps_command;
|
||||
struct mpssas_softc;
|
||||
union ccb;
|
||||
struct mpssas_target;
|
||||
struct mps_column_map;
|
||||
|
||||
MALLOC_DECLARE(M_MPT2);
|
||||
|
||||
@ -63,13 +219,16 @@ struct mps_chain {
|
||||
/*
|
||||
* This needs to be at least 2 to support SMP passthrough.
|
||||
*/
|
||||
#define MPS_IOVEC_COUNT 2
|
||||
#define MPS_IOVEC_COUNT 2
|
||||
|
||||
struct mps_command {
|
||||
TAILQ_ENTRY(mps_command) cm_link;
|
||||
TAILQ_ENTRY(mps_command) cm_recovery;
|
||||
struct mps_softc *cm_sc;
|
||||
union ccb *cm_ccb;
|
||||
void *cm_data;
|
||||
u_int cm_length;
|
||||
u_int cm_out_len;
|
||||
struct uio cm_uio;
|
||||
struct iovec cm_iovec[MPS_IOVEC_COUNT];
|
||||
u_int cm_max_segs;
|
||||
@ -82,6 +241,7 @@ struct mps_command {
|
||||
void *cm_complete_data;
|
||||
struct mpssas_target *cm_targ;
|
||||
MPI2_REQUEST_DESCRIPTOR_UNION cm_desc;
|
||||
u_int cm_lun;
|
||||
u_int cm_flags;
|
||||
#define MPS_CM_FLAGS_POLLED (1 << 0)
|
||||
#define MPS_CM_FLAGS_COMPLETE (1 << 1)
|
||||
@ -89,7 +249,7 @@ struct mps_command {
|
||||
#define MPS_CM_FLAGS_DATAOUT (1 << 3)
|
||||
#define MPS_CM_FLAGS_DATAIN (1 << 4)
|
||||
#define MPS_CM_FLAGS_WAKEUP (1 << 5)
|
||||
#define MPS_CM_FLAGS_ACTIVE (1 << 6)
|
||||
#define MPS_CM_FLAGS_DD_IO (1 << 6)
|
||||
#define MPS_CM_FLAGS_USE_UIO (1 << 7)
|
||||
#define MPS_CM_FLAGS_SMP_PASS (1 << 8)
|
||||
#define MPS_CM_FLAGS_CHAIN_FAILED (1 << 9)
|
||||
@ -106,6 +266,11 @@ struct mps_command {
|
||||
struct callout cm_callout;
|
||||
};
|
||||
|
||||
struct mps_column_map {
|
||||
uint16_t dev_handle;
|
||||
uint8_t phys_disk_num;
|
||||
};
|
||||
|
||||
struct mps_event_handle {
|
||||
TAILQ_ENTRY(mps_event_handle) eh_list;
|
||||
mps_evt_callback_t *callback;
|
||||
@ -121,17 +286,24 @@ struct mps_softc {
|
||||
#define MPS_FLAGS_MSI (1 << 1)
|
||||
#define MPS_FLAGS_BUSY (1 << 2)
|
||||
#define MPS_FLAGS_SHUTDOWN (1 << 3)
|
||||
#define MPS_FLAGS_ATTACH_DONE (1 << 4)
|
||||
#define MPS_FLAGS_DIAGRESET (1 << 4)
|
||||
#define MPS_FLAGS_ATTACH_DONE (1 << 5)
|
||||
#define MPS_FLAGS_WD_AVAILABLE (1 << 6)
|
||||
u_int mps_debug;
|
||||
u_int allow_multiple_tm_cmds;
|
||||
u_int disable_msix;
|
||||
u_int disable_msi;
|
||||
int tm_cmds_active;
|
||||
int io_cmds_active;
|
||||
int io_cmds_highwater;
|
||||
int chain_free;
|
||||
int max_chains;
|
||||
int chain_free_lowwater;
|
||||
#if __FreeBSD_version >= 900030
|
||||
uint64_t chain_alloc_fail;
|
||||
#endif
|
||||
struct sysctl_ctx_list sysctl_ctx;
|
||||
struct sysctl_oid *sysctl_tree;
|
||||
char fw_version[16];
|
||||
struct mps_command *commands;
|
||||
struct mps_chain *chains;
|
||||
struct callout periodic;
|
||||
@ -139,9 +311,9 @@ struct mps_softc {
|
||||
struct mpssas_softc *sassc;
|
||||
|
||||
TAILQ_HEAD(, mps_command) req_list;
|
||||
TAILQ_HEAD(, mps_command) high_priority_req_list;
|
||||
TAILQ_HEAD(, mps_chain) chain_list;
|
||||
TAILQ_HEAD(, mps_command) tm_list;
|
||||
TAILQ_HEAD(, mps_command) io_list;
|
||||
int replypostindex;
|
||||
int replyfreeindex;
|
||||
|
||||
@ -196,6 +368,73 @@ struct mps_softc {
|
||||
bus_addr_t free_busaddr;
|
||||
bus_dma_tag_t queues_dmat;
|
||||
bus_dmamap_t queues_map;
|
||||
|
||||
uint8_t *fw_diag_buffer;
|
||||
bus_addr_t fw_diag_busaddr;
|
||||
bus_dma_tag_t fw_diag_dmat;
|
||||
bus_dmamap_t fw_diag_map;
|
||||
|
||||
uint8_t ir_firmware;
|
||||
|
||||
/* static config pages */
|
||||
Mpi2IOCPage8_t ioc_pg8;
|
||||
|
||||
/* host mapping support */
|
||||
struct dev_mapping_table *mapping_table;
|
||||
struct enc_mapping_table *enclosure_table;
|
||||
struct map_removal_table *removal_table;
|
||||
uint8_t *dpm_entry_used;
|
||||
uint8_t *dpm_flush_entry;
|
||||
Mpi2DriverMappingPage0_t *dpm_pg0;
|
||||
uint16_t max_devices;
|
||||
uint16_t max_enclosures;
|
||||
uint16_t max_expanders;
|
||||
uint8_t max_volumes;
|
||||
uint8_t num_enc_table_entries;
|
||||
uint8_t num_rsvd_entries;
|
||||
uint8_t num_channels;
|
||||
uint16_t max_dpm_entries;
|
||||
uint8_t is_dpm_enable;
|
||||
uint8_t track_mapping_events;
|
||||
uint32_t pending_map_events;
|
||||
uint8_t mt_full_retry;
|
||||
uint8_t mt_add_device_failed;
|
||||
|
||||
/* FW diag Buffer List */
|
||||
mps_fw_diagnostic_buffer_t
|
||||
fw_diag_buffer_list[MPI2_DIAG_BUF_TYPE_COUNT];
|
||||
|
||||
/* Event Recording IOCTL support */
|
||||
uint32_t events_to_record[4];
|
||||
mps_event_entry_t recorded_events[MPS_EVENT_QUEUE_SIZE];
|
||||
uint8_t event_index;
|
||||
uint32_t event_number;
|
||||
|
||||
/* EEDP and TLR support */
|
||||
uint8_t eedp_enabled;
|
||||
uint8_t control_TLR;
|
||||
|
||||
/* Shutdown Event Handler */
|
||||
eventhandler_tag shutdown_eh;
|
||||
|
||||
/* To track topo events during reset */
|
||||
#define MPS_DIAG_RESET_TIMEOUT 300000
|
||||
uint8_t wait_for_port_enable;
|
||||
uint8_t port_enable_complete;
|
||||
|
||||
/* WD controller */
|
||||
uint8_t WD_valid_config;
|
||||
uint8_t WD_hide_expose;
|
||||
|
||||
/* Direct Drive for WarpDrive */
|
||||
uint8_t DD_num_phys_disks;
|
||||
uint16_t DD_dev_handle;
|
||||
uint32_t DD_stripe_size;
|
||||
uint32_t DD_stripe_exponent;
|
||||
uint32_t DD_block_size;
|
||||
uint16_t DD_block_exponent;
|
||||
uint64_t DD_max_lba;
|
||||
struct mps_column_map DD_column_map[MPS_MAX_DISKS_IN_VOL];
|
||||
};
|
||||
|
||||
struct mps_config_params {
|
||||
@ -210,6 +449,13 @@ struct mps_config_params {
|
||||
void *cbdata;
|
||||
};
|
||||
|
||||
struct scsi_read_capacity_eedp
|
||||
{
|
||||
uint8_t addr[8];
|
||||
uint8_t length[4];
|
||||
uint8_t protect;
|
||||
};
|
||||
|
||||
static __inline uint32_t
|
||||
mps_regread(struct mps_softc *sc, uint32_t offset)
|
||||
{
|
||||
@ -225,7 +471,6 @@ mps_regwrite(struct mps_softc *sc, uint32_t offset, uint32_t val)
|
||||
static __inline void
|
||||
mps_free_reply(struct mps_softc *sc, uint32_t busaddr)
|
||||
{
|
||||
|
||||
if (++sc->replyfreeindex >= sc->fqdepth)
|
||||
sc->replyfreeindex = 0;
|
||||
sc->free_queue[sc->replyfreeindex] = busaddr;
|
||||
@ -242,8 +487,11 @@ mps_alloc_chain(struct mps_softc *sc)
|
||||
sc->chain_free--;
|
||||
if (sc->chain_free < sc->chain_free_lowwater)
|
||||
sc->chain_free_lowwater = sc->chain_free;
|
||||
} else
|
||||
}
|
||||
#if __FreeBSD_version >= 900030
|
||||
else
|
||||
sc->chain_alloc_fail++;
|
||||
#endif
|
||||
return (chain);
|
||||
}
|
||||
|
||||
@ -262,15 +510,16 @@ mps_free_command(struct mps_softc *sc, struct mps_command *cm)
|
||||
{
|
||||
struct mps_chain *chain, *chain_temp;
|
||||
|
||||
if (cm->cm_reply != NULL) {
|
||||
if (cm->cm_reply != NULL)
|
||||
mps_free_reply(sc, cm->cm_reply_data);
|
||||
cm->cm_reply = NULL;
|
||||
}
|
||||
cm->cm_reply = NULL;
|
||||
cm->cm_flags = 0;
|
||||
cm->cm_complete = NULL;
|
||||
cm->cm_complete_data = NULL;
|
||||
cm->cm_targ = 0;
|
||||
cm->cm_ccb = NULL;
|
||||
cm->cm_targ = NULL;
|
||||
cm->cm_max_segs = 0;
|
||||
cm->cm_lun = 0;
|
||||
cm->cm_state = MPS_CM_STATE_FREE;
|
||||
TAILQ_FOREACH_SAFE(chain, &cm->cm_chain_list, chain_link, chain_temp) {
|
||||
TAILQ_REMOVE(&cm->cm_chain_list, chain, chain_link);
|
||||
@ -294,6 +543,43 @@ mps_alloc_command(struct mps_softc *sc)
|
||||
return (cm);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
mps_free_high_priority_command(struct mps_softc *sc, struct mps_command *cm)
|
||||
{
|
||||
struct mps_chain *chain, *chain_temp;
|
||||
|
||||
if (cm->cm_reply != NULL)
|
||||
mps_free_reply(sc, cm->cm_reply_data);
|
||||
cm->cm_reply = NULL;
|
||||
cm->cm_flags = 0;
|
||||
cm->cm_complete = NULL;
|
||||
cm->cm_complete_data = NULL;
|
||||
cm->cm_ccb = NULL;
|
||||
cm->cm_targ = NULL;
|
||||
cm->cm_lun = 0;
|
||||
cm->cm_state = MPS_CM_STATE_FREE;
|
||||
TAILQ_FOREACH_SAFE(chain, &cm->cm_chain_list, chain_link, chain_temp) {
|
||||
TAILQ_REMOVE(&cm->cm_chain_list, chain, chain_link);
|
||||
mps_free_chain(sc, chain);
|
||||
}
|
||||
TAILQ_INSERT_TAIL(&sc->high_priority_req_list, cm, cm_link);
|
||||
}
|
||||
|
||||
static __inline struct mps_command *
|
||||
mps_alloc_high_priority_command(struct mps_softc *sc)
|
||||
{
|
||||
struct mps_command *cm;
|
||||
|
||||
cm = TAILQ_FIRST(&sc->high_priority_req_list);
|
||||
if (cm == NULL)
|
||||
return (NULL);
|
||||
|
||||
TAILQ_REMOVE(&sc->high_priority_req_list, cm, cm_link);
|
||||
KASSERT(cm->cm_state == MPS_CM_STATE_FREE, ("mps: Allocating busy command\n"));
|
||||
cm->cm_state = MPS_CM_STATE_BUSY;
|
||||
return (cm);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
mps_lock(struct mps_softc *sc)
|
||||
{
|
||||
@ -315,6 +601,12 @@ mps_unlock(struct mps_softc *sc)
|
||||
#define mps_printf(sc, args...) \
|
||||
device_printf((sc)->mps_dev, ##args)
|
||||
|
||||
#define mps_vprintf(sc, args...) \
|
||||
do { \
|
||||
if (bootverbose) \
|
||||
mps_printf(sc, ##args); \
|
||||
} while (0)
|
||||
|
||||
#define mps_dprint(sc, level, msg, args...) \
|
||||
do { \
|
||||
if (sc->mps_debug & level) \
|
||||
@ -375,7 +667,9 @@ mps_unmask_intr(struct mps_softc *sc)
|
||||
mps_regwrite(sc, MPI2_HOST_INTERRUPT_MASK_OFFSET, mask);
|
||||
}
|
||||
|
||||
int mps_pci_setup_interrupts(struct mps_softc *);
|
||||
int mps_pci_setup_interrupts(struct mps_softc *sc);
|
||||
int mps_pci_restore(struct mps_softc *sc);
|
||||
|
||||
int mps_attach(struct mps_softc *sc);
|
||||
int mps_free(struct mps_softc *sc);
|
||||
void mps_intr(void *);
|
||||
@ -383,23 +677,97 @@ void mps_intr_msi(void *);
|
||||
void mps_intr_locked(void *);
|
||||
int mps_register_events(struct mps_softc *, uint8_t *, mps_evt_callback_t *,
|
||||
void *, struct mps_event_handle **);
|
||||
int mps_restart(struct mps_softc *);
|
||||
int mps_update_events(struct mps_softc *, struct mps_event_handle *, uint8_t *);
|
||||
int mps_deregister_events(struct mps_softc *, struct mps_event_handle *);
|
||||
int mps_request_polled(struct mps_softc *sc, struct mps_command *cm);
|
||||
void mps_enqueue_request(struct mps_softc *, struct mps_command *);
|
||||
int mps_push_sge(struct mps_command *, void *, size_t, int);
|
||||
int mps_add_dmaseg(struct mps_command *, vm_paddr_t, size_t, u_int, int);
|
||||
int mps_attach_sas(struct mps_softc *sc);
|
||||
int mps_detach_sas(struct mps_softc *sc);
|
||||
int mps_map_command(struct mps_softc *sc, struct mps_command *cm);
|
||||
int mps_read_config_page(struct mps_softc *, struct mps_config_params *);
|
||||
int mps_write_config_page(struct mps_softc *, struct mps_config_params *);
|
||||
void mps_memaddr_cb(void *, bus_dma_segment_t *, int , int );
|
||||
void mpi_init_sge(struct mps_command *cm, void *req, void *sge);
|
||||
int mps_attach_user(struct mps_softc *);
|
||||
void mps_detach_user(struct mps_softc *);
|
||||
void mpssas_record_event(struct mps_softc *sc,
|
||||
MPI2_EVENT_NOTIFICATION_REPLY *event_reply);
|
||||
|
||||
int mps_map_command(struct mps_softc *sc, struct mps_command *cm);
|
||||
int mps_wait_command(struct mps_softc *sc, struct mps_command *cm, int timeout);
|
||||
int mps_request_polled(struct mps_softc *sc, struct mps_command *cm);
|
||||
|
||||
int mps_config_get_bios_pg3(struct mps_softc *sc, Mpi2ConfigReply_t
|
||||
*mpi_reply, Mpi2BiosPage3_t *config_page);
|
||||
int mps_config_get_raid_volume_pg0(struct mps_softc *sc, Mpi2ConfigReply_t
|
||||
*mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 page_address);
|
||||
int mps_config_get_ioc_pg8(struct mps_softc *sc, Mpi2ConfigReply_t *,
|
||||
Mpi2IOCPage8_t *);
|
||||
int mps_config_get_man_pg10(struct mps_softc *sc, Mpi2ConfigReply_t *mpi_reply);
|
||||
int mps_config_get_sas_device_pg0(struct mps_softc *, Mpi2ConfigReply_t *,
|
||||
Mpi2SasDevicePage0_t *, u32 , u16 );
|
||||
int mps_config_get_dpm_pg0(struct mps_softc *, Mpi2ConfigReply_t *,
|
||||
Mpi2DriverMappingPage0_t *, u16 );
|
||||
int mps_config_get_raid_volume_pg1(struct mps_softc *sc,
|
||||
Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form,
|
||||
u16 handle);
|
||||
int mps_config_get_volume_wwid(struct mps_softc *sc, u16 volume_handle,
|
||||
u64 *wwid);
|
||||
int mps_config_get_raid_pd_pg0(struct mps_softc *sc,
|
||||
Mpi2ConfigReply_t *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page,
|
||||
u32 page_address);
|
||||
void mpssas_ir_shutdown(struct mps_softc *sc);
|
||||
|
||||
int mps_reinit(struct mps_softc *sc);
|
||||
void mpssas_handle_reinit(struct mps_softc *sc);
|
||||
|
||||
void mps_base_static_config_pages(struct mps_softc *sc);
|
||||
void mps_wd_config_pages(struct mps_softc *sc);
|
||||
|
||||
int mps_mapping_initialize(struct mps_softc *);
|
||||
void mps_mapping_topology_change_event(struct mps_softc *,
|
||||
Mpi2EventDataSasTopologyChangeList_t *);
|
||||
int mps_mapping_is_reinit_required(struct mps_softc *);
|
||||
void mps_mapping_free_memory(struct mps_softc *sc);
|
||||
int mps_config_set_dpm_pg0(struct mps_softc *, Mpi2ConfigReply_t *,
|
||||
Mpi2DriverMappingPage0_t *, u16 );
|
||||
void mps_mapping_exit(struct mps_softc *);
|
||||
void mps_mapping_check_devices(struct mps_softc *, int);
|
||||
int mps_mapping_allocate_memory(struct mps_softc *sc);
|
||||
unsigned int mps_mapping_get_sas_id(struct mps_softc *, uint64_t , u16);
|
||||
unsigned int mps_mapping_get_sas_id_from_handle(struct mps_softc *sc,
|
||||
u16 handle);
|
||||
unsigned int mps_mapping_get_raid_id(struct mps_softc *sc, u64 wwid,
|
||||
u16 handle);
|
||||
unsigned int mps_mapping_get_raid_id_from_handle(struct mps_softc *sc,
|
||||
u16 volHandle);
|
||||
void mps_mapping_enclosure_dev_status_change_event(struct mps_softc *,
|
||||
Mpi2EventDataSasEnclDevStatusChange_t *event_data);
|
||||
void mps_mapping_ir_config_change_event(struct mps_softc *sc,
|
||||
Mpi2EventDataIrConfigChangeList_t *event_data);
|
||||
|
||||
void mpssas_evt_handler(struct mps_softc *sc, uintptr_t data,
|
||||
MPI2_EVENT_NOTIFICATION_REPLY *event);
|
||||
void mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle);
|
||||
int mpssas_startup(struct mps_softc *sc);
|
||||
|
||||
SYSCTL_DECL(_hw_mps);
|
||||
|
||||
/* Compatibility shims for different OS versions */
|
||||
#if __FreeBSD_version >= 800001
|
||||
#define mps_kproc_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg) \
|
||||
kproc_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg)
|
||||
#define mps_kproc_exit(arg) kproc_exit(arg)
|
||||
#else
|
||||
#define mps_kproc_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg) \
|
||||
kthread_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg)
|
||||
#define mps_kproc_exit(arg) kthread_exit(arg)
|
||||
#endif
|
||||
|
||||
#if defined(CAM_PRIORITY_XPT)
|
||||
#define MPS_PRIORITY_XPT CAM_PRIORITY_XPT
|
||||
#else
|
||||
#define MPS_PRIORITY_XPT 5
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -4,10 +4,11 @@
|
||||
|
||||
KMOD= mps
|
||||
SRCS= mps_pci.c mps.c mps_sas.c mps_table.c mps_user.c
|
||||
SRCS+= opt_mps.h opt_cam.h opt_compat.h
|
||||
SRCS+= mps_config.c mps_mapping.c mps_sas_lsi.c
|
||||
SRCS+= opt_cam.h opt_compat.h
|
||||
SRCS+= device_if.h bus_if.h pci_if.h
|
||||
|
||||
#CFLAGS += -DMPS_DEBUG
|
||||
DEBUG += -g
|
||||
DEBUG_FLAGS += -g
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
Loading…
Reference in New Issue
Block a user