11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds 3w-9xxx.h -- 3ware 9000 Storage Controller device driver for Linux. 31da177e4SLinus Torvalds 44deedd84Sadam radford Written By: Adam Radford <linuxraid@lsi.com> 54deedd84Sadam radford Modifications By: Tom Couch <linuxraid@lsi.com> 61da177e4SLinus Torvalds 77a252fe7Sadam radford Copyright (C) 2004-2009 Applied Micro Circuits Corporation. 84deedd84Sadam radford Copyright (C) 2010 LSI Corporation. 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds This program is free software; you can redistribute it and/or modify 111da177e4SLinus Torvalds it under the terms of the GNU General Public License as published by 121da177e4SLinus Torvalds the Free Software Foundation; version 2 of the License. 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds This program is distributed in the hope that it will be useful, 151da177e4SLinus Torvalds but WITHOUT ANY WARRANTY; without even the implied warranty of 161da177e4SLinus Torvalds MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 171da177e4SLinus Torvalds GNU General Public License for more details. 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds NO WARRANTY 201da177e4SLinus Torvalds THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR 211da177e4SLinus Torvalds CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT 221da177e4SLinus Torvalds LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, 231da177e4SLinus Torvalds MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is 241da177e4SLinus Torvalds solely responsible for determining the appropriateness of using and 251da177e4SLinus Torvalds distributing the Program and assumes all risks associated with its 261da177e4SLinus Torvalds exercise of rights under this Agreement, including but not limited to 271da177e4SLinus Torvalds the risks and costs of program errors, damage to or loss of data, 281da177e4SLinus Torvalds programs or equipment, and unavailability or interruption of operations. 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds DISCLAIMER OF LIABILITY 311da177e4SLinus Torvalds NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY 321da177e4SLinus Torvalds DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 331da177e4SLinus Torvalds DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND 341da177e4SLinus Torvalds ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 351da177e4SLinus Torvalds TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 361da177e4SLinus Torvalds USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED 371da177e4SLinus Torvalds HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds You should have received a copy of the GNU General Public License 401da177e4SLinus Torvalds along with this program; if not, write to the Free Software 411da177e4SLinus Torvalds Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds Bugs/Comments/Suggestions should be mailed to: 444deedd84Sadam radford linuxraid@lsi.com 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds For more information, goto: 474deedd84Sadam radford http://www.lsi.com 481da177e4SLinus Torvalds */ 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds #ifndef _3W_9XXX_H 511da177e4SLinus Torvalds #define _3W_9XXX_H 521da177e4SLinus Torvalds 531da177e4SLinus Torvalds /* AEN string type */ 541da177e4SLinus Torvalds typedef struct TAG_twa_message_type { 551da177e4SLinus Torvalds unsigned int code; 561da177e4SLinus Torvalds char* text; 571da177e4SLinus Torvalds } twa_message_type; 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds /* AEN strings */ 601da177e4SLinus Torvalds static twa_message_type twa_aen_table[] = { 611da177e4SLinus Torvalds {0x0000, "AEN queue empty"}, 621da177e4SLinus Torvalds {0x0001, "Controller reset occurred"}, 631da177e4SLinus Torvalds {0x0002, "Degraded unit detected"}, 64*25985edcSLucas De Marchi {0x0003, "Controller error occurred"}, 651da177e4SLinus Torvalds {0x0004, "Background rebuild failed"}, 661da177e4SLinus Torvalds {0x0005, "Background rebuild done"}, 671da177e4SLinus Torvalds {0x0006, "Incomplete unit detected"}, 681da177e4SLinus Torvalds {0x0007, "Background initialize done"}, 691da177e4SLinus Torvalds {0x0008, "Unclean shutdown detected"}, 701da177e4SLinus Torvalds {0x0009, "Drive timeout detected"}, 711da177e4SLinus Torvalds {0x000A, "Drive error detected"}, 721da177e4SLinus Torvalds {0x000B, "Rebuild started"}, 731da177e4SLinus Torvalds {0x000C, "Background initialize started"}, 741da177e4SLinus Torvalds {0x000D, "Entire logical unit was deleted"}, 751da177e4SLinus Torvalds {0x000E, "Background initialize failed"}, 761da177e4SLinus Torvalds {0x000F, "SMART attribute exceeded threshold"}, 771da177e4SLinus Torvalds {0x0010, "Power supply reported AC under range"}, 781da177e4SLinus Torvalds {0x0011, "Power supply reported DC out of range"}, 791da177e4SLinus Torvalds {0x0012, "Power supply reported a malfunction"}, 801da177e4SLinus Torvalds {0x0013, "Power supply predicted malfunction"}, 811da177e4SLinus Torvalds {0x0014, "Battery charge is below threshold"}, 821da177e4SLinus Torvalds {0x0015, "Fan speed is below threshold"}, 831da177e4SLinus Torvalds {0x0016, "Temperature sensor is above threshold"}, 841da177e4SLinus Torvalds {0x0017, "Power supply was removed"}, 851da177e4SLinus Torvalds {0x0018, "Power supply was inserted"}, 861da177e4SLinus Torvalds {0x0019, "Drive was removed from a bay"}, 871da177e4SLinus Torvalds {0x001A, "Drive was inserted into a bay"}, 881da177e4SLinus Torvalds {0x001B, "Drive bay cover door was opened"}, 891da177e4SLinus Torvalds {0x001C, "Drive bay cover door was closed"}, 901da177e4SLinus Torvalds {0x001D, "Product case was opened"}, 911da177e4SLinus Torvalds {0x0020, "Prepare for shutdown (power-off)"}, 921da177e4SLinus Torvalds {0x0021, "Downgrade UDMA mode to lower speed"}, 931da177e4SLinus Torvalds {0x0022, "Upgrade UDMA mode to higher speed"}, 941da177e4SLinus Torvalds {0x0023, "Sector repair completed"}, 951da177e4SLinus Torvalds {0x0024, "Sbuf memory test failed"}, 961da177e4SLinus Torvalds {0x0025, "Error flushing cached write data to array"}, 971da177e4SLinus Torvalds {0x0026, "Drive reported data ECC error"}, 981da177e4SLinus Torvalds {0x0027, "DCB has checksum error"}, 991da177e4SLinus Torvalds {0x0028, "DCB version is unsupported"}, 1001da177e4SLinus Torvalds {0x0029, "Background verify started"}, 1011da177e4SLinus Torvalds {0x002A, "Background verify failed"}, 1021da177e4SLinus Torvalds {0x002B, "Background verify done"}, 1031da177e4SLinus Torvalds {0x002C, "Bad sector overwritten during rebuild"}, 1041da177e4SLinus Torvalds {0x002D, "Background rebuild error on source drive"}, 1051da177e4SLinus Torvalds {0x002E, "Replace failed because replacement drive too small"}, 1061da177e4SLinus Torvalds {0x002F, "Verify failed because array was never initialized"}, 1071da177e4SLinus Torvalds {0x0030, "Unsupported ATA drive"}, 1081da177e4SLinus Torvalds {0x0031, "Synchronize host/controller time"}, 1091da177e4SLinus Torvalds {0x0032, "Spare capacity is inadequate for some units"}, 1101da177e4SLinus Torvalds {0x0033, "Background migration started"}, 1111da177e4SLinus Torvalds {0x0034, "Background migration failed"}, 1121da177e4SLinus Torvalds {0x0035, "Background migration done"}, 1131da177e4SLinus Torvalds {0x0036, "Verify detected and fixed data/parity mismatch"}, 1141da177e4SLinus Torvalds {0x0037, "SO-DIMM incompatible"}, 1151da177e4SLinus Torvalds {0x0038, "SO-DIMM not detected"}, 1161da177e4SLinus Torvalds {0x0039, "Corrected Sbuf ECC error"}, 1171da177e4SLinus Torvalds {0x003A, "Drive power on reset detected"}, 1181da177e4SLinus Torvalds {0x003B, "Background rebuild paused"}, 1191da177e4SLinus Torvalds {0x003C, "Background initialize paused"}, 1201da177e4SLinus Torvalds {0x003D, "Background verify paused"}, 1211da177e4SLinus Torvalds {0x003E, "Background migration paused"}, 1221da177e4SLinus Torvalds {0x003F, "Corrupt flash file system detected"}, 1231da177e4SLinus Torvalds {0x0040, "Flash file system repaired"}, 1241da177e4SLinus Torvalds {0x0041, "Unit number assignments were lost"}, 1251da177e4SLinus Torvalds {0x0042, "Error during read of primary DCB"}, 1261da177e4SLinus Torvalds {0x0043, "Latent error found in backup DCB"}, 1271da177e4SLinus Torvalds {0x00FC, "Recovered/finished array membership update"}, 1281da177e4SLinus Torvalds {0x00FD, "Handler lockup"}, 1291da177e4SLinus Torvalds {0x00FE, "Retrying PCI transfer"}, 1301da177e4SLinus Torvalds {0x00FF, "AEN queue is full"}, 1311da177e4SLinus Torvalds {0xFFFFFFFF, (char*) 0} 1321da177e4SLinus Torvalds }; 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds /* AEN severity table */ 1351da177e4SLinus Torvalds static char *twa_aen_severity_table[] = 1361da177e4SLinus Torvalds { 1371da177e4SLinus Torvalds "None", "ERROR", "WARNING", "INFO", "DEBUG", (char*) 0 1381da177e4SLinus Torvalds }; 1391da177e4SLinus Torvalds 1401da177e4SLinus Torvalds /* Error strings */ 1411da177e4SLinus Torvalds static twa_message_type twa_error_table[] = { 1421da177e4SLinus Torvalds {0x0100, "SGL entry contains zero data"}, 1431da177e4SLinus Torvalds {0x0101, "Invalid command opcode"}, 1441da177e4SLinus Torvalds {0x0102, "SGL entry has unaligned address"}, 1451da177e4SLinus Torvalds {0x0103, "SGL size does not match command"}, 1461da177e4SLinus Torvalds {0x0104, "SGL entry has illegal length"}, 1471da177e4SLinus Torvalds {0x0105, "Command packet is not aligned"}, 1481da177e4SLinus Torvalds {0x0106, "Invalid request ID"}, 1491da177e4SLinus Torvalds {0x0107, "Duplicate request ID"}, 1501da177e4SLinus Torvalds {0x0108, "ID not locked"}, 1511da177e4SLinus Torvalds {0x0109, "LBA out of range"}, 1521da177e4SLinus Torvalds {0x010A, "Logical unit not supported"}, 1531da177e4SLinus Torvalds {0x010B, "Parameter table does not exist"}, 1541da177e4SLinus Torvalds {0x010C, "Parameter index does not exist"}, 1551da177e4SLinus Torvalds {0x010D, "Invalid field in CDB"}, 1561da177e4SLinus Torvalds {0x010E, "Specified port has invalid drive"}, 1571da177e4SLinus Torvalds {0x010F, "Parameter item size mismatch"}, 1581da177e4SLinus Torvalds {0x0110, "Failed memory allocation"}, 1591da177e4SLinus Torvalds {0x0111, "Memory request too large"}, 1601da177e4SLinus Torvalds {0x0112, "Out of memory segments"}, 1611da177e4SLinus Torvalds {0x0113, "Invalid address to deallocate"}, 1621da177e4SLinus Torvalds {0x0114, "Out of memory"}, 1631da177e4SLinus Torvalds {0x0115, "Out of heap"}, 1641da177e4SLinus Torvalds {0x0120, "Double degrade"}, 1651da177e4SLinus Torvalds {0x0121, "Drive not degraded"}, 1661da177e4SLinus Torvalds {0x0122, "Reconstruct error"}, 1671da177e4SLinus Torvalds {0x0123, "Replace not accepted"}, 1681da177e4SLinus Torvalds {0x0124, "Replace drive capacity too small"}, 1691da177e4SLinus Torvalds {0x0125, "Sector count not allowed"}, 1701da177e4SLinus Torvalds {0x0126, "No spares left"}, 1711da177e4SLinus Torvalds {0x0127, "Reconstruct error"}, 1721da177e4SLinus Torvalds {0x0128, "Unit is offline"}, 1731da177e4SLinus Torvalds {0x0129, "Cannot update status to DCB"}, 1741da177e4SLinus Torvalds {0x0130, "Invalid stripe handle"}, 1751da177e4SLinus Torvalds {0x0131, "Handle that was not locked"}, 1761da177e4SLinus Torvalds {0x0132, "Handle that was not empty"}, 1771da177e4SLinus Torvalds {0x0133, "Handle has different owner"}, 1781da177e4SLinus Torvalds {0x0140, "IPR has parent"}, 1791da177e4SLinus Torvalds {0x0150, "Illegal Pbuf address alignment"}, 1801da177e4SLinus Torvalds {0x0151, "Illegal Pbuf transfer length"}, 1811da177e4SLinus Torvalds {0x0152, "Illegal Sbuf address alignment"}, 1821da177e4SLinus Torvalds {0x0153, "Illegal Sbuf transfer length"}, 1831da177e4SLinus Torvalds {0x0160, "Command packet too large"}, 1841da177e4SLinus Torvalds {0x0161, "SGL exceeds maximum length"}, 1851da177e4SLinus Torvalds {0x0162, "SGL has too many entries"}, 1861da177e4SLinus Torvalds {0x0170, "Insufficient resources for rebuilder"}, 1871da177e4SLinus Torvalds {0x0171, "Verify error (data != parity)"}, 1881da177e4SLinus Torvalds {0x0180, "Requested segment not in directory of this DCB"}, 1891da177e4SLinus Torvalds {0x0181, "DCB segment has unsupported version"}, 1901da177e4SLinus Torvalds {0x0182, "DCB segment has checksum error"}, 1911da177e4SLinus Torvalds {0x0183, "DCB support (settings) segment invalid"}, 1921da177e4SLinus Torvalds {0x0184, "DCB UDB (unit descriptor block) segment invalid"}, 1931da177e4SLinus Torvalds {0x0185, "DCB GUID (globally unique identifier) segment invalid"}, 1941da177e4SLinus Torvalds {0x01A0, "Could not clear Sbuf"}, 1951da177e4SLinus Torvalds {0x01C0, "Flash identify failed"}, 1961da177e4SLinus Torvalds {0x01C1, "Flash out of bounds"}, 1971da177e4SLinus Torvalds {0x01C2, "Flash verify error"}, 1981da177e4SLinus Torvalds {0x01C3, "Flash file object not found"}, 1991da177e4SLinus Torvalds {0x01C4, "Flash file already present"}, 2001da177e4SLinus Torvalds {0x01C5, "Flash file system full"}, 2011da177e4SLinus Torvalds {0x01C6, "Flash file not present"}, 2021da177e4SLinus Torvalds {0x01C7, "Flash file size error"}, 2031da177e4SLinus Torvalds {0x01C8, "Bad flash file checksum"}, 2041da177e4SLinus Torvalds {0x01CA, "Corrupt flash file system detected"}, 2051da177e4SLinus Torvalds {0x01D0, "Invalid field in parameter list"}, 2061da177e4SLinus Torvalds {0x01D1, "Parameter list length error"}, 2071da177e4SLinus Torvalds {0x01D2, "Parameter item is not changeable"}, 2081da177e4SLinus Torvalds {0x01D3, "Parameter item is not saveable"}, 2091da177e4SLinus Torvalds {0x0200, "UDMA CRC error"}, 2101da177e4SLinus Torvalds {0x0201, "Internal CRC error"}, 2111da177e4SLinus Torvalds {0x0202, "Data ECC error"}, 2121da177e4SLinus Torvalds {0x0203, "ADP level 1 error"}, 2131da177e4SLinus Torvalds {0x0204, "Port timeout"}, 2141da177e4SLinus Torvalds {0x0205, "Drive power on reset"}, 2151da177e4SLinus Torvalds {0x0206, "ADP level 2 error"}, 2161da177e4SLinus Torvalds {0x0207, "Soft reset failed"}, 2171da177e4SLinus Torvalds {0x0208, "Drive not ready"}, 2181da177e4SLinus Torvalds {0x0209, "Unclassified port error"}, 2191da177e4SLinus Torvalds {0x020A, "Drive aborted command"}, 2201da177e4SLinus Torvalds {0x0210, "Internal CRC error"}, 2211da177e4SLinus Torvalds {0x0211, "PCI abort error"}, 2221da177e4SLinus Torvalds {0x0212, "PCI parity error"}, 2231da177e4SLinus Torvalds {0x0213, "Port handler error"}, 2241da177e4SLinus Torvalds {0x0214, "Token interrupt count error"}, 2251da177e4SLinus Torvalds {0x0215, "Timeout waiting for PCI transfer"}, 2261da177e4SLinus Torvalds {0x0216, "Corrected buffer ECC"}, 2271da177e4SLinus Torvalds {0x0217, "Uncorrected buffer ECC"}, 2281da177e4SLinus Torvalds {0x0230, "Unsupported command during flash recovery"}, 2291da177e4SLinus Torvalds {0x0231, "Next image buffer expected"}, 2301da177e4SLinus Torvalds {0x0232, "Binary image architecture incompatible"}, 2311da177e4SLinus Torvalds {0x0233, "Binary image has no signature"}, 2321da177e4SLinus Torvalds {0x0234, "Binary image has bad checksum"}, 2331da177e4SLinus Torvalds {0x0235, "Image downloaded overflowed buffer"}, 2341da177e4SLinus Torvalds {0x0240, "I2C device not found"}, 2351da177e4SLinus Torvalds {0x0241, "I2C transaction aborted"}, 2361da177e4SLinus Torvalds {0x0242, "SO-DIMM parameter(s) incompatible using defaults"}, 2371da177e4SLinus Torvalds {0x0243, "SO-DIMM unsupported"}, 2381da177e4SLinus Torvalds {0x0248, "SPI transfer status error"}, 2391da177e4SLinus Torvalds {0x0249, "SPI transfer timeout error"}, 2401da177e4SLinus Torvalds {0x0250, "Invalid unit descriptor size in CreateUnit"}, 2411da177e4SLinus Torvalds {0x0251, "Unit descriptor size exceeds data buffer in CreateUnit"}, 2421da177e4SLinus Torvalds {0x0252, "Invalid value in CreateUnit descriptor"}, 2431da177e4SLinus Torvalds {0x0253, "Inadequate disk space to support descriptor in CreateUnit"}, 2441da177e4SLinus Torvalds {0x0254, "Unable to create data channel for this unit descriptor"}, 2451da177e4SLinus Torvalds {0x0255, "CreateUnit descriptor specifies a drive already in use"}, 2461da177e4SLinus Torvalds {0x0256, "Unable to write configuration to all disks during CreateUnit"}, 2471da177e4SLinus Torvalds {0x0257, "CreateUnit does not support this descriptor version"}, 2481da177e4SLinus Torvalds {0x0258, "Invalid subunit for RAID 0 or 5 in CreateUnit"}, 2491da177e4SLinus Torvalds {0x0259, "Too many descriptors in CreateUnit"}, 2501da177e4SLinus Torvalds {0x025A, "Invalid configuration specified in CreateUnit descriptor"}, 2511da177e4SLinus Torvalds {0x025B, "Invalid LBA offset specified in CreateUnit descriptor"}, 2521da177e4SLinus Torvalds {0x025C, "Invalid stripelet size specified in CreateUnit descriptor"}, 2531da177e4SLinus Torvalds {0x0260, "SMART attribute exceeded threshold"}, 2541da177e4SLinus Torvalds {0xFFFFFFFF, (char*) 0} 2551da177e4SLinus Torvalds }; 2561da177e4SLinus Torvalds 2571da177e4SLinus Torvalds /* Control register bit definitions */ 2581da177e4SLinus Torvalds #define TW_CONTROL_CLEAR_HOST_INTERRUPT 0x00080000 2591da177e4SLinus Torvalds #define TW_CONTROL_CLEAR_ATTENTION_INTERRUPT 0x00040000 2601da177e4SLinus Torvalds #define TW_CONTROL_MASK_COMMAND_INTERRUPT 0x00020000 2611da177e4SLinus Torvalds #define TW_CONTROL_MASK_RESPONSE_INTERRUPT 0x00010000 2621da177e4SLinus Torvalds #define TW_CONTROL_UNMASK_COMMAND_INTERRUPT 0x00008000 2631da177e4SLinus Torvalds #define TW_CONTROL_UNMASK_RESPONSE_INTERRUPT 0x00004000 2641da177e4SLinus Torvalds #define TW_CONTROL_CLEAR_ERROR_STATUS 0x00000200 2651da177e4SLinus Torvalds #define TW_CONTROL_ISSUE_SOFT_RESET 0x00000100 2661da177e4SLinus Torvalds #define TW_CONTROL_ENABLE_INTERRUPTS 0x00000080 2671da177e4SLinus Torvalds #define TW_CONTROL_DISABLE_INTERRUPTS 0x00000040 2681da177e4SLinus Torvalds #define TW_CONTROL_ISSUE_HOST_INTERRUPT 0x00000020 2691da177e4SLinus Torvalds #define TW_CONTROL_CLEAR_PARITY_ERROR 0x00800000 2701da177e4SLinus Torvalds #define TW_CONTROL_CLEAR_QUEUE_ERROR 0x00400000 2711da177e4SLinus Torvalds #define TW_CONTROL_CLEAR_PCI_ABORT 0x00100000 2721da177e4SLinus Torvalds 2731da177e4SLinus Torvalds /* Status register bit definitions */ 2741da177e4SLinus Torvalds #define TW_STATUS_MAJOR_VERSION_MASK 0xF0000000 2751da177e4SLinus Torvalds #define TW_STATUS_MINOR_VERSION_MASK 0x0F000000 2761da177e4SLinus Torvalds #define TW_STATUS_PCI_PARITY_ERROR 0x00800000 2771da177e4SLinus Torvalds #define TW_STATUS_QUEUE_ERROR 0x00400000 2781da177e4SLinus Torvalds #define TW_STATUS_MICROCONTROLLER_ERROR 0x00200000 2791da177e4SLinus Torvalds #define TW_STATUS_PCI_ABORT 0x00100000 2801da177e4SLinus Torvalds #define TW_STATUS_HOST_INTERRUPT 0x00080000 2811da177e4SLinus Torvalds #define TW_STATUS_ATTENTION_INTERRUPT 0x00040000 2821da177e4SLinus Torvalds #define TW_STATUS_COMMAND_INTERRUPT 0x00020000 2831da177e4SLinus Torvalds #define TW_STATUS_RESPONSE_INTERRUPT 0x00010000 2841da177e4SLinus Torvalds #define TW_STATUS_COMMAND_QUEUE_FULL 0x00008000 2851da177e4SLinus Torvalds #define TW_STATUS_RESPONSE_QUEUE_EMPTY 0x00004000 2861da177e4SLinus Torvalds #define TW_STATUS_MICROCONTROLLER_READY 0x00002000 2871da177e4SLinus Torvalds #define TW_STATUS_COMMAND_QUEUE_EMPTY 0x00001000 2881da177e4SLinus Torvalds #define TW_STATUS_EXPECTED_BITS 0x00002000 28949bfd8dbSadam radford #define TW_STATUS_UNEXPECTED_BITS 0x00F00000 29049bfd8dbSadam radford #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 2911da177e4SLinus Torvalds 2921da177e4SLinus Torvalds /* PCI related defines */ 2931da177e4SLinus Torvalds #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 2941da177e4SLinus Torvalds #define TW_PCI_CLEAR_PCI_ABORT 0x2000 2951da177e4SLinus Torvalds 2961da177e4SLinus Torvalds /* Command packet opcodes used by the driver */ 2971da177e4SLinus Torvalds #define TW_OP_INIT_CONNECTION 0x1 2981da177e4SLinus Torvalds #define TW_OP_GET_PARAM 0x12 2991da177e4SLinus Torvalds #define TW_OP_SET_PARAM 0x13 3001da177e4SLinus Torvalds #define TW_OP_EXECUTE_SCSI 0x10 3011da177e4SLinus Torvalds #define TW_OP_DOWNLOAD_FIRMWARE 0x16 3021da177e4SLinus Torvalds #define TW_OP_RESET 0x1C 3031da177e4SLinus Torvalds 3041da177e4SLinus Torvalds /* Asynchronous Event Notification (AEN) codes used by the driver */ 3051da177e4SLinus Torvalds #define TW_AEN_QUEUE_EMPTY 0x0000 3061da177e4SLinus Torvalds #define TW_AEN_SOFT_RESET 0x0001 3071da177e4SLinus Torvalds #define TW_AEN_SYNC_TIME_WITH_HOST 0x031 3081da177e4SLinus Torvalds #define TW_AEN_SEVERITY_ERROR 0x1 3091da177e4SLinus Torvalds #define TW_AEN_SEVERITY_DEBUG 0x4 3101da177e4SLinus Torvalds #define TW_AEN_NOT_RETRIEVED 0x1 3111da177e4SLinus Torvalds #define TW_AEN_RETRIEVED 0x2 3121da177e4SLinus Torvalds 3131da177e4SLinus Torvalds /* Command state defines */ 3141da177e4SLinus Torvalds #define TW_S_INITIAL 0x1 /* Initial state */ 3151da177e4SLinus Torvalds #define TW_S_STARTED 0x2 /* Id in use */ 3161da177e4SLinus Torvalds #define TW_S_POSTED 0x4 /* Posted to the controller */ 3171da177e4SLinus Torvalds #define TW_S_PENDING 0x8 /* Waiting to be posted in isr */ 3181da177e4SLinus Torvalds #define TW_S_COMPLETED 0x10 /* Completed by isr */ 3191da177e4SLinus Torvalds #define TW_S_FINISHED 0x20 /* I/O completely done */ 3201da177e4SLinus Torvalds 3211da177e4SLinus Torvalds /* Compatibility defines */ 3221da177e4SLinus Torvalds #define TW_9000_ARCH_ID 0x5 3233dabec71Sadam radford #define TW_CURRENT_DRIVER_SRL 35 3243dabec71Sadam radford #define TW_CURRENT_DRIVER_BUILD 0 32549bfd8dbSadam radford #define TW_CURRENT_DRIVER_BRANCH 0 3261da177e4SLinus Torvalds 3271da177e4SLinus Torvalds /* Phase defines */ 3281da177e4SLinus Torvalds #define TW_PHASE_INITIAL 0 3291da177e4SLinus Torvalds #define TW_PHASE_SINGLE 1 3301da177e4SLinus Torvalds #define TW_PHASE_SGLIST 2 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvalds /* Misc defines */ 33349bfd8dbSadam radford #define TW_9550SX_DRAIN_COMPLETED 0xFFFF 3341da177e4SLinus Torvalds #define TW_SECTOR_SIZE 512 3351da177e4SLinus Torvalds #define TW_ALIGNMENT_9000 4 /* 4 bytes */ 3361da177e4SLinus Torvalds #define TW_ALIGNMENT_9000_SGL 0x3 3371da177e4SLinus Torvalds #define TW_MAX_UNITS 16 3384039c30eSadam radford #define TW_MAX_UNITS_9650SE 32 3391da177e4SLinus Torvalds #define TW_INIT_MESSAGE_CREDITS 0x100 3401da177e4SLinus Torvalds #define TW_INIT_COMMAND_PACKET_SIZE 0x3 3411da177e4SLinus Torvalds #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 3421da177e4SLinus Torvalds #define TW_EXTENDED_INIT_CONNECT 0x2 3431da177e4SLinus Torvalds #define TW_BUNDLED_FW_SAFE_TO_FLASH 0x4 3441da177e4SLinus Torvalds #define TW_CTLR_FW_RECOMMENDS_FLASH 0x8 3451da177e4SLinus Torvalds #define TW_CTLR_FW_COMPATIBLE 0x2 3461da177e4SLinus Torvalds #define TW_BASE_FW_SRL 24 3471da177e4SLinus Torvalds #define TW_BASE_FW_BRANCH 0 3481da177e4SLinus Torvalds #define TW_BASE_FW_BUILD 1 3491da177e4SLinus Torvalds #define TW_FW_SRL_LUNS_SUPPORTED 28 3501da177e4SLinus Torvalds #define TW_Q_LENGTH 256 3511da177e4SLinus Torvalds #define TW_Q_START 0 3521da177e4SLinus Torvalds #define TW_MAX_SLOT 32 3531da177e4SLinus Torvalds #define TW_MAX_RESET_TRIES 2 3541da177e4SLinus Torvalds #define TW_MAX_CMDS_PER_LUN 254 3551da177e4SLinus Torvalds #define TW_MAX_RESPONSE_DRAIN 256 3563dabec71Sadam radford #define TW_MAX_AEN_DRAIN 255 3571da177e4SLinus Torvalds #define TW_IN_RESET 2 3583dabec71Sadam radford #define TW_USING_MSI 3 3591da177e4SLinus Torvalds #define TW_IN_ATTENTION_LOOP 4 3601da177e4SLinus Torvalds #define TW_MAX_SECTORS 256 3611da177e4SLinus Torvalds #define TW_AEN_WAIT_TIME 1000 3621da177e4SLinus Torvalds #define TW_IOCTL_WAIT_TIME (1 * HZ) /* 1 second */ 3631da177e4SLinus Torvalds #define TW_MAX_CDB_LEN 16 3641da177e4SLinus Torvalds #define TW_ISR_DONT_COMPLETE 2 3651da177e4SLinus Torvalds #define TW_ISR_DONT_RESULT 3 3661da177e4SLinus Torvalds #define TW_IOCTL_CHRDEV_TIMEOUT 60 /* 60 seconds */ 3671da177e4SLinus Torvalds #define TW_IOCTL_CHRDEV_FREE -1 3681da177e4SLinus Torvalds #define TW_COMMAND_OFFSET 128 /* 128 bytes */ 3691da177e4SLinus Torvalds #define TW_VERSION_TABLE 0x0402 3701da177e4SLinus Torvalds #define TW_TIMEKEEP_TABLE 0x040A 3711da177e4SLinus Torvalds #define TW_INFORMATION_TABLE 0x0403 3721da177e4SLinus Torvalds #define TW_PARAM_FWVER 3 3731da177e4SLinus Torvalds #define TW_PARAM_FWVER_LENGTH 16 3741da177e4SLinus Torvalds #define TW_PARAM_BIOSVER 4 3751da177e4SLinus Torvalds #define TW_PARAM_BIOSVER_LENGTH 16 3761da177e4SLinus Torvalds #define TW_PARAM_PORTCOUNT 3 3771da177e4SLinus Torvalds #define TW_PARAM_PORTCOUNT_LENGTH 1 3781da177e4SLinus Torvalds #define TW_MIN_SGL_LENGTH 0x200 /* 512 bytes */ 3791da177e4SLinus Torvalds #define TW_MAX_SENSE_LENGTH 256 3801da177e4SLinus Torvalds #define TW_EVENT_SOURCE_AEN 0x1000 3811da177e4SLinus Torvalds #define TW_EVENT_SOURCE_COMMAND 0x1001 3821da177e4SLinus Torvalds #define TW_EVENT_SOURCE_PCHIP 0x1002 3831da177e4SLinus Torvalds #define TW_EVENT_SOURCE_DRIVER 0x1003 3841da177e4SLinus Torvalds #define TW_IOCTL_GET_COMPATIBILITY_INFO 0x101 3851da177e4SLinus Torvalds #define TW_IOCTL_GET_LAST_EVENT 0x102 3861da177e4SLinus Torvalds #define TW_IOCTL_GET_FIRST_EVENT 0x103 3871da177e4SLinus Torvalds #define TW_IOCTL_GET_NEXT_EVENT 0x104 3881da177e4SLinus Torvalds #define TW_IOCTL_GET_PREVIOUS_EVENT 0x105 3891da177e4SLinus Torvalds #define TW_IOCTL_GET_LOCK 0x106 3901da177e4SLinus Torvalds #define TW_IOCTL_RELEASE_LOCK 0x107 3911da177e4SLinus Torvalds #define TW_IOCTL_FIRMWARE_PASS_THROUGH 0x108 3921da177e4SLinus Torvalds #define TW_IOCTL_ERROR_STATUS_NOT_LOCKED 0x1001 // Not locked 3931da177e4SLinus Torvalds #define TW_IOCTL_ERROR_STATUS_LOCKED 0x1002 // Already locked 3941da177e4SLinus Torvalds #define TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS 0x1003 // No more events 3951da177e4SLinus Torvalds #define TW_IOCTL_ERROR_STATUS_AEN_CLOBBER 0x1004 // AEN clobber occurred 3961da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_EFAULT -EFAULT // Bad address 3971da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_EINTR -EINTR // Interrupted system call 3981da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_EINVAL -EINVAL // Invalid argument 3991da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_ENOMEM -ENOMEM // Out of memory 4001da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_ERESTARTSYS -ERESTARTSYS // Restart system call 4011da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_EIO -EIO // I/O error 4021da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_ENOTTY -ENOTTY // Not a typewriter 4031da177e4SLinus Torvalds #define TW_IOCTL_ERROR_OS_ENODEV -ENODEV // No such device 4041da177e4SLinus Torvalds #define TW_ALLOCATION_LENGTH 128 4051da177e4SLinus Torvalds #define TW_SENSE_DATA_LENGTH 18 4061da177e4SLinus Torvalds #define TW_STATUS_CHECK_CONDITION 2 4071da177e4SLinus Torvalds #define TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED 0x10a 4081da177e4SLinus Torvalds #define TW_ERROR_UNIT_OFFLINE 0x128 4091da177e4SLinus Torvalds #define TW_MESSAGE_SOURCE_CONTROLLER_ERROR 3 4101da177e4SLinus Torvalds #define TW_MESSAGE_SOURCE_CONTROLLER_EVENT 4 4111da177e4SLinus Torvalds #define TW_MESSAGE_SOURCE_LINUX_DRIVER 6 4121da177e4SLinus Torvalds #define TW_DRIVER TW_MESSAGE_SOURCE_LINUX_DRIVER 4131da177e4SLinus Torvalds #define TW_MESSAGE_SOURCE_LINUX_OS 9 4141da177e4SLinus Torvalds #define TW_OS TW_MESSAGE_SOURCE_LINUX_OS 4151da177e4SLinus Torvalds #ifndef PCI_DEVICE_ID_3WARE_9000 4161da177e4SLinus Torvalds #define PCI_DEVICE_ID_3WARE_9000 0x1002 4171da177e4SLinus Torvalds #endif 41849bfd8dbSadam radford #ifndef PCI_DEVICE_ID_3WARE_9550SX 41949bfd8dbSadam radford #define PCI_DEVICE_ID_3WARE_9550SX 0x1003 42049bfd8dbSadam radford #endif 4214039c30eSadam radford #ifndef PCI_DEVICE_ID_3WARE_9650SE 4224039c30eSadam radford #define PCI_DEVICE_ID_3WARE_9650SE 0x1004 4234039c30eSadam radford #endif 4240e78d158Sadam radford #ifndef PCI_DEVICE_ID_3WARE_9690SA 4250e78d158Sadam radford #define PCI_DEVICE_ID_3WARE_9690SA 0x1005 4260e78d158Sadam radford #endif 4271da177e4SLinus Torvalds 4281da177e4SLinus Torvalds /* Bitmask macros to eliminate bitfields */ 4291da177e4SLinus Torvalds 4301da177e4SLinus Torvalds /* opcode: 5, reserved: 3 */ 4311da177e4SLinus Torvalds #define TW_OPRES_IN(x,y) ((x << 5) | (y & 0x1f)) 4321da177e4SLinus Torvalds #define TW_OP_OUT(x) (x & 0x1f) 4331da177e4SLinus Torvalds 4341da177e4SLinus Torvalds /* opcode: 5, sgloffset: 3 */ 4351da177e4SLinus Torvalds #define TW_OPSGL_IN(x,y) ((x << 5) | (y & 0x1f)) 4361da177e4SLinus Torvalds #define TW_SGL_OUT(x) ((x >> 5) & 0x7) 4371da177e4SLinus Torvalds 4381da177e4SLinus Torvalds /* severity: 3, reserved: 5 */ 4391da177e4SLinus Torvalds #define TW_SEV_OUT(x) (x & 0x7) 4401da177e4SLinus Torvalds 4411da177e4SLinus Torvalds /* reserved_1: 4, response_id: 8, reserved_2: 20 */ 4421da177e4SLinus Torvalds #define TW_RESID_OUT(x) ((x >> 4) & 0xff) 4431da177e4SLinus Torvalds 4441da177e4SLinus Torvalds /* request_id: 12, lun: 4 */ 4451da177e4SLinus Torvalds #define TW_REQ_LUN_IN(lun, request_id) (((lun << 12) & 0xf000) | (request_id & 0xfff)) 4461da177e4SLinus Torvalds #define TW_LUN_OUT(lun) ((lun >> 12) & 0xf) 4471da177e4SLinus Torvalds 4481da177e4SLinus Torvalds /* Macros */ 4491da177e4SLinus Torvalds #define TW_CONTROL_REG_ADDR(x) (x->base_addr) 4501da177e4SLinus Torvalds #define TW_STATUS_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0x4) 4511da177e4SLinus Torvalds #define TW_COMMAND_QUEUE_REG_ADDR(x) (sizeof(dma_addr_t) > 4 ? ((unsigned char __iomem *)x->base_addr + 0x20) : ((unsigned char __iomem *)x->base_addr + 0x8)) 4524039c30eSadam radford #define TW_COMMAND_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x20) 4531da177e4SLinus Torvalds #define TW_RESPONSE_QUEUE_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0xC) 45449bfd8dbSadam radford #define TW_RESPONSE_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x30) 4551da177e4SLinus Torvalds #define TW_CLEAR_ALL_INTERRUPTS(x) (writel(TW_STATUS_VALID_INTERRUPT, TW_CONTROL_REG_ADDR(x))) 4561da177e4SLinus Torvalds #define TW_CLEAR_ATTENTION_INTERRUPT(x) (writel(TW_CONTROL_CLEAR_ATTENTION_INTERRUPT, TW_CONTROL_REG_ADDR(x))) 4571da177e4SLinus Torvalds #define TW_CLEAR_HOST_INTERRUPT(x) (writel(TW_CONTROL_CLEAR_HOST_INTERRUPT, TW_CONTROL_REG_ADDR(x))) 4581da177e4SLinus Torvalds #define TW_DISABLE_INTERRUPTS(x) (writel(TW_CONTROL_DISABLE_INTERRUPTS, TW_CONTROL_REG_ADDR(x))) 4591da177e4SLinus Torvalds #define TW_ENABLE_AND_CLEAR_INTERRUPTS(x) (writel(TW_CONTROL_CLEAR_ATTENTION_INTERRUPT | TW_CONTROL_UNMASK_RESPONSE_INTERRUPT | TW_CONTROL_ENABLE_INTERRUPTS, TW_CONTROL_REG_ADDR(x))) 4601da177e4SLinus Torvalds #define TW_MASK_COMMAND_INTERRUPT(x) (writel(TW_CONTROL_MASK_COMMAND_INTERRUPT, TW_CONTROL_REG_ADDR(x))) 4611da177e4SLinus Torvalds #define TW_UNMASK_COMMAND_INTERRUPT(x) (writel(TW_CONTROL_UNMASK_COMMAND_INTERRUPT, TW_CONTROL_REG_ADDR(x))) 4621da177e4SLinus Torvalds #define TW_SOFT_RESET(x) (writel(TW_CONTROL_ISSUE_SOFT_RESET | \ 4631da177e4SLinus Torvalds TW_CONTROL_CLEAR_HOST_INTERRUPT | \ 4641da177e4SLinus Torvalds TW_CONTROL_CLEAR_ATTENTION_INTERRUPT | \ 4651da177e4SLinus Torvalds TW_CONTROL_MASK_COMMAND_INTERRUPT | \ 4661da177e4SLinus Torvalds TW_CONTROL_MASK_RESPONSE_INTERRUPT | \ 4671da177e4SLinus Torvalds TW_CONTROL_CLEAR_ERROR_STATUS | \ 4681da177e4SLinus Torvalds TW_CONTROL_DISABLE_INTERRUPTS, TW_CONTROL_REG_ADDR(x))) 4691da177e4SLinus Torvalds #define TW_PRINTK(h,a,b,c) { \ 4701da177e4SLinus Torvalds if (h) \ 4711da177e4SLinus Torvalds printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s.\n",h->host_no,a,b,c); \ 4721da177e4SLinus Torvalds else \ 4731da177e4SLinus Torvalds printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s.\n",a,b,c); \ 4741da177e4SLinus Torvalds } 4751da177e4SLinus Torvalds #define TW_MAX_LUNS(srl) (srl < TW_FW_SRL_LUNS_SUPPORTED ? 1 : 16) 4761da177e4SLinus Torvalds #define TW_COMMAND_SIZE (sizeof(dma_addr_t) > 4 ? 5 : 4) 4771da177e4SLinus Torvalds #define TW_APACHE_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 72 : 109) 4781da177e4SLinus Torvalds #define TW_ESCALADE_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 41 : 62) 4791da177e4SLinus Torvalds #define TW_PADDING_LENGTH (sizeof(dma_addr_t) > 4 ? 8 : 0) 48075913d9bSadam radford #define TW_CPU_TO_SGL(x) (sizeof(dma_addr_t) > 4 ? cpu_to_le64(x) : cpu_to_le32(x)) 4811da177e4SLinus Torvalds 4821da177e4SLinus Torvalds #pragma pack(1) 4831da177e4SLinus Torvalds 4841da177e4SLinus Torvalds /* Scatter Gather List Entry */ 4851da177e4SLinus Torvalds typedef struct TAG_TW_SG_Entry { 4861da177e4SLinus Torvalds dma_addr_t address; 4871da177e4SLinus Torvalds u32 length; 4881da177e4SLinus Torvalds } TW_SG_Entry; 4891da177e4SLinus Torvalds 4901da177e4SLinus Torvalds /* Command Packet */ 4911da177e4SLinus Torvalds typedef struct TW_Command { 4921da177e4SLinus Torvalds unsigned char opcode__sgloffset; 4931da177e4SLinus Torvalds unsigned char size; 4941da177e4SLinus Torvalds unsigned char request_id; 4951da177e4SLinus Torvalds unsigned char unit__hostid; 4961da177e4SLinus Torvalds /* Second DWORD */ 4971da177e4SLinus Torvalds unsigned char status; 4981da177e4SLinus Torvalds unsigned char flags; 4991da177e4SLinus Torvalds union { 5001da177e4SLinus Torvalds unsigned short block_count; 5011da177e4SLinus Torvalds unsigned short parameter_count; 5021da177e4SLinus Torvalds } byte6_offset; 5031da177e4SLinus Torvalds union { 5041da177e4SLinus Torvalds struct { 5051da177e4SLinus Torvalds u32 lba; 5061da177e4SLinus Torvalds TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH]; 5071da177e4SLinus Torvalds dma_addr_t padding; 5081da177e4SLinus Torvalds } io; 5091da177e4SLinus Torvalds struct { 5101da177e4SLinus Torvalds TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH]; 5111da177e4SLinus Torvalds u32 padding; 5121da177e4SLinus Torvalds dma_addr_t padding2; 5131da177e4SLinus Torvalds } param; 5141da177e4SLinus Torvalds } byte8_offset; 5151da177e4SLinus Torvalds } TW_Command; 5161da177e4SLinus Torvalds 5171da177e4SLinus Torvalds /* Command Packet for 9000+ controllers */ 5181da177e4SLinus Torvalds typedef struct TAG_TW_Command_Apache { 5191da177e4SLinus Torvalds unsigned char opcode__reserved; 5201da177e4SLinus Torvalds unsigned char unit; 5211da177e4SLinus Torvalds unsigned short request_id__lunl; 5221da177e4SLinus Torvalds unsigned char status; 5231da177e4SLinus Torvalds unsigned char sgl_offset; 5241da177e4SLinus Torvalds unsigned short sgl_entries__lunh; 5251da177e4SLinus Torvalds unsigned char cdb[16]; 5261da177e4SLinus Torvalds TW_SG_Entry sg_list[TW_APACHE_MAX_SGL_LENGTH]; 5271da177e4SLinus Torvalds unsigned char padding[TW_PADDING_LENGTH]; 5281da177e4SLinus Torvalds } TW_Command_Apache; 5291da177e4SLinus Torvalds 5301da177e4SLinus Torvalds /* New command packet header */ 5311da177e4SLinus Torvalds typedef struct TAG_TW_Command_Apache_Header { 5321da177e4SLinus Torvalds unsigned char sense_data[TW_SENSE_DATA_LENGTH]; 5331da177e4SLinus Torvalds struct { 5341da177e4SLinus Torvalds char reserved[4]; 5351da177e4SLinus Torvalds unsigned short error; 5361da177e4SLinus Torvalds unsigned char padding; 5371da177e4SLinus Torvalds unsigned char severity__reserved; 5381da177e4SLinus Torvalds } status_block; 5391da177e4SLinus Torvalds unsigned char err_specific_desc[98]; 5401da177e4SLinus Torvalds struct { 5411da177e4SLinus Torvalds unsigned char size_header; 5421da177e4SLinus Torvalds unsigned short reserved; 5431da177e4SLinus Torvalds unsigned char size_sense; 5441da177e4SLinus Torvalds } header_desc; 5451da177e4SLinus Torvalds } TW_Command_Apache_Header; 5461da177e4SLinus Torvalds 5471da177e4SLinus Torvalds /* This struct is a union of the 2 command packets */ 5481da177e4SLinus Torvalds typedef struct TAG_TW_Command_Full { 5491da177e4SLinus Torvalds TW_Command_Apache_Header header; 5501da177e4SLinus Torvalds union { 5511da177e4SLinus Torvalds TW_Command oldcommand; 5521da177e4SLinus Torvalds TW_Command_Apache newcommand; 5531da177e4SLinus Torvalds } command; 5541da177e4SLinus Torvalds } TW_Command_Full; 5551da177e4SLinus Torvalds 5561da177e4SLinus Torvalds /* Initconnection structure */ 5571da177e4SLinus Torvalds typedef struct TAG_TW_Initconnect { 5581da177e4SLinus Torvalds unsigned char opcode__reserved; 5591da177e4SLinus Torvalds unsigned char size; 5601da177e4SLinus Torvalds unsigned char request_id; 5611da177e4SLinus Torvalds unsigned char res2; 5621da177e4SLinus Torvalds unsigned char status; 5631da177e4SLinus Torvalds unsigned char flags; 5641da177e4SLinus Torvalds unsigned short message_credits; 5651da177e4SLinus Torvalds u32 features; 5661da177e4SLinus Torvalds unsigned short fw_srl; 5671da177e4SLinus Torvalds unsigned short fw_arch_id; 5681da177e4SLinus Torvalds unsigned short fw_branch; 5691da177e4SLinus Torvalds unsigned short fw_build; 5701da177e4SLinus Torvalds u32 result; 5711da177e4SLinus Torvalds } TW_Initconnect; 5721da177e4SLinus Torvalds 5731da177e4SLinus Torvalds /* Event info structure */ 5741da177e4SLinus Torvalds typedef struct TAG_TW_Event 5751da177e4SLinus Torvalds { 5761da177e4SLinus Torvalds unsigned int sequence_id; 5771da177e4SLinus Torvalds unsigned int time_stamp_sec; 5781da177e4SLinus Torvalds unsigned short aen_code; 5791da177e4SLinus Torvalds unsigned char severity; 5801da177e4SLinus Torvalds unsigned char retrieved; 5811da177e4SLinus Torvalds unsigned char repeat_count; 5821da177e4SLinus Torvalds unsigned char parameter_len; 5831da177e4SLinus Torvalds unsigned char parameter_data[98]; 5841da177e4SLinus Torvalds } TW_Event; 5851da177e4SLinus Torvalds 5861da177e4SLinus Torvalds typedef struct TAG_TW_Ioctl_Driver_Command { 5871da177e4SLinus Torvalds unsigned int control_code; 5881da177e4SLinus Torvalds unsigned int status; 5891da177e4SLinus Torvalds unsigned int unique_id; 5901da177e4SLinus Torvalds unsigned int sequence_id; 5911da177e4SLinus Torvalds unsigned int os_specific; 5921da177e4SLinus Torvalds unsigned int buffer_length; 5931da177e4SLinus Torvalds } TW_Ioctl_Driver_Command; 5941da177e4SLinus Torvalds 5951da177e4SLinus Torvalds typedef struct TAG_TW_Ioctl_Apache { 5961da177e4SLinus Torvalds TW_Ioctl_Driver_Command driver_command; 5971da177e4SLinus Torvalds char padding[488]; 5981da177e4SLinus Torvalds TW_Command_Full firmware_command; 5991da177e4SLinus Torvalds char data_buffer[1]; 6001da177e4SLinus Torvalds } TW_Ioctl_Buf_Apache; 6011da177e4SLinus Torvalds 6021da177e4SLinus Torvalds /* Lock structure for ioctl get/release lock */ 6031da177e4SLinus Torvalds typedef struct TAG_TW_Lock { 6041da177e4SLinus Torvalds unsigned long timeout_msec; 6051da177e4SLinus Torvalds unsigned long time_remaining_msec; 6061da177e4SLinus Torvalds unsigned long force_flag; 6071da177e4SLinus Torvalds } TW_Lock; 6081da177e4SLinus Torvalds 6091da177e4SLinus Torvalds /* GetParam descriptor */ 6101da177e4SLinus Torvalds typedef struct { 6111da177e4SLinus Torvalds unsigned short table_id; 6121da177e4SLinus Torvalds unsigned short parameter_id; 6131da177e4SLinus Torvalds unsigned short parameter_size_bytes; 6141da177e4SLinus Torvalds unsigned short actual_parameter_size_bytes; 6151da177e4SLinus Torvalds unsigned char data[1]; 6161da177e4SLinus Torvalds } TW_Param_Apache, *PTW_Param_Apache; 6171da177e4SLinus Torvalds 6181da177e4SLinus Torvalds /* Response queue */ 6191da177e4SLinus Torvalds typedef union TAG_TW_Response_Queue { 6201da177e4SLinus Torvalds u32 response_id; 6211da177e4SLinus Torvalds u32 value; 6221da177e4SLinus Torvalds } TW_Response_Queue; 6231da177e4SLinus Torvalds 6241da177e4SLinus Torvalds /* Compatibility information structure */ 6251da177e4SLinus Torvalds typedef struct TAG_TW_Compatibility_Info 6261da177e4SLinus Torvalds { 6271da177e4SLinus Torvalds char driver_version[32]; 6281da177e4SLinus Torvalds unsigned short working_srl; 6291da177e4SLinus Torvalds unsigned short working_branch; 6301da177e4SLinus Torvalds unsigned short working_build; 6311da177e4SLinus Torvalds unsigned short driver_srl_high; 6321da177e4SLinus Torvalds unsigned short driver_branch_high; 6331da177e4SLinus Torvalds unsigned short driver_build_high; 6341da177e4SLinus Torvalds unsigned short driver_srl_low; 6351da177e4SLinus Torvalds unsigned short driver_branch_low; 6361da177e4SLinus Torvalds unsigned short driver_build_low; 6374039c30eSadam radford unsigned short fw_on_ctlr_srl; 6384039c30eSadam radford unsigned short fw_on_ctlr_branch; 6394039c30eSadam radford unsigned short fw_on_ctlr_build; 6401da177e4SLinus Torvalds } TW_Compatibility_Info; 6411da177e4SLinus Torvalds 64275913d9bSadam radford #pragma pack() 64375913d9bSadam radford 6441da177e4SLinus Torvalds typedef struct TAG_TW_Device_Extension { 6451da177e4SLinus Torvalds u32 __iomem *base_addr; 6461da177e4SLinus Torvalds unsigned long *generic_buffer_virt[TW_Q_LENGTH]; 6471da177e4SLinus Torvalds dma_addr_t generic_buffer_phys[TW_Q_LENGTH]; 6481da177e4SLinus Torvalds TW_Command_Full *command_packet_virt[TW_Q_LENGTH]; 6491da177e4SLinus Torvalds dma_addr_t command_packet_phys[TW_Q_LENGTH]; 6501da177e4SLinus Torvalds struct pci_dev *tw_pci_dev; 6511da177e4SLinus Torvalds struct scsi_cmnd *srb[TW_Q_LENGTH]; 6521da177e4SLinus Torvalds unsigned char free_queue[TW_Q_LENGTH]; 6531da177e4SLinus Torvalds unsigned char free_head; 6541da177e4SLinus Torvalds unsigned char free_tail; 6551da177e4SLinus Torvalds unsigned char pending_queue[TW_Q_LENGTH]; 6561da177e4SLinus Torvalds unsigned char pending_head; 6571da177e4SLinus Torvalds unsigned char pending_tail; 6581da177e4SLinus Torvalds int state[TW_Q_LENGTH]; 6591da177e4SLinus Torvalds unsigned int posted_request_count; 6601da177e4SLinus Torvalds unsigned int max_posted_request_count; 6611da177e4SLinus Torvalds unsigned int pending_request_count; 6621da177e4SLinus Torvalds unsigned int max_pending_request_count; 6631da177e4SLinus Torvalds unsigned int max_sgl_entries; 6641da177e4SLinus Torvalds unsigned int sgl_entries; 6651da177e4SLinus Torvalds unsigned int num_resets; 6661da177e4SLinus Torvalds unsigned int sector_count; 6671da177e4SLinus Torvalds unsigned int max_sector_count; 6681da177e4SLinus Torvalds unsigned int aen_count; 6691da177e4SLinus Torvalds struct Scsi_Host *host; 6701da177e4SLinus Torvalds long flags; 6711da177e4SLinus Torvalds int reset_print; 6721da177e4SLinus Torvalds TW_Event *event_queue[TW_Q_LENGTH]; 6731da177e4SLinus Torvalds unsigned char error_index; 6741da177e4SLinus Torvalds unsigned char event_queue_wrapped; 6751da177e4SLinus Torvalds unsigned int error_sequence_id; 6761da177e4SLinus Torvalds int ioctl_sem_lock; 6771da177e4SLinus Torvalds u32 ioctl_msec; 6781da177e4SLinus Torvalds int chrdev_request_id; 6791da177e4SLinus Torvalds wait_queue_head_t ioctl_wqueue; 680a12e25bdSJes Sorensen struct mutex ioctl_lock; 6811da177e4SLinus Torvalds char aen_clobber; 6824039c30eSadam radford TW_Compatibility_Info tw_compat_info; 6831da177e4SLinus Torvalds } TW_Device_Extension; 6841da177e4SLinus Torvalds 6851da177e4SLinus Torvalds #endif /* _3W_9XXX_H */ 6861da177e4SLinus Torvalds 687