^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2017 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Based on the original DAC960 driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Portions Copyright 2002 by Mylex (An IBM Business Unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #ifndef MYRB_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define MYRB_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define MYRB_MAX_LDEVS 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define MYRB_MAX_CHANNELS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define MYRB_MAX_TARGETS 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define MYRB_MAX_PHYSICAL_DEVICES 45
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define MYRB_SCATTER_GATHER_LIMIT 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define MYRB_CMD_MBOX_COUNT 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define MYRB_STAT_MBOX_COUNT 1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define MYRB_BLKSIZE_BITS 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define MYRB_MAILBOX_TIMEOUT 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define MYRB_DCMD_TAG 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define MYRB_MCMD_TAG 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define MYRB_PRIMARY_MONITOR_INTERVAL (10 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MYRB_SECONDARY_MONITOR_INTERVAL (60 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * DAC960 V1 Firmware Command Opcodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) enum myrb_cmd_opcode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* I/O Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) MYRB_CMD_READ_EXTENDED = 0x33,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) MYRB_CMD_WRITE_EXTENDED = 0x34,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) MYRB_CMD_READAHEAD_EXTENDED = 0x35,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) MYRB_CMD_READ_EXTENDED_SG = 0xB3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) MYRB_CMD_WRITE_EXTENDED_SG = 0xB4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) MYRB_CMD_READ = 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) MYRB_CMD_READ_SG = 0xB6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) MYRB_CMD_WRITE = 0x37,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) MYRB_CMD_WRITE_SG = 0xB7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) MYRB_CMD_DCDB = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) MYRB_CMD_DCDB_SG = 0x84,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) MYRB_CMD_FLUSH = 0x0A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* Controller Status Related Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) MYRB_CMD_ENQUIRY = 0x53,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) MYRB_CMD_ENQUIRY2 = 0x1C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) MYRB_CMD_GET_LDRV_ELEMENT = 0x55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) MYRB_CMD_GET_LDEV_INFO = 0x19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) MYRB_CMD_IOPORTREAD = 0x39,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) MYRB_CMD_IOPORTWRITE = 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) MYRB_CMD_GET_SD_STATS = 0x3E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) MYRB_CMD_GET_PD_STATS = 0x3F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) MYRB_CMD_EVENT_LOG_OPERATION = 0x72,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* Device Related Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) MYRB_CMD_START_DEVICE = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) MYRB_CMD_GET_DEVICE_STATE = 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) MYRB_CMD_STOP_CHANNEL = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) MYRB_CMD_START_CHANNEL = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) MYRB_CMD_RESET_CHANNEL = 0x1A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Commands Associated with Data Consistency and Errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) MYRB_CMD_REBUILD = 0x09,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) MYRB_CMD_REBUILD_ASYNC = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) MYRB_CMD_CHECK_CONSISTENCY = 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) MYRB_CMD_CHECK_CONSISTENCY_ASYNC = 0x1E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) MYRB_CMD_REBUILD_STAT = 0x0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) MYRB_CMD_GET_REBUILD_PROGRESS = 0x27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) MYRB_CMD_REBUILD_CONTROL = 0x1F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) MYRB_CMD_READ_BADBLOCK_TABLE = 0x0B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) MYRB_CMD_READ_BADDATA_TABLE = 0x25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) MYRB_CMD_CLEAR_BADDATA_TABLE = 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) MYRB_CMD_GET_ERROR_TABLE = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) MYRB_CMD_ADD_CAPACITY_ASYNC = 0x2A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) MYRB_CMD_BGI_CONTROL = 0x2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* Configuration Related Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) MYRB_CMD_READ_CONFIG2 = 0x3D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) MYRB_CMD_WRITE_CONFIG2 = 0x3C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) MYRB_CMD_READ_CONFIG_ONDISK = 0x4A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) MYRB_CMD_WRITE_CONFIG_ONDISK = 0x4B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) MYRB_CMD_READ_CONFIG = 0x4E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) MYRB_CMD_READ_BACKUP_CONFIG = 0x4D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) MYRB_CMD_WRITE_CONFIG = 0x4F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) MYRB_CMD_ADD_CONFIG = 0x4C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) MYRB_CMD_READ_CONFIG_LABEL = 0x48,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) MYRB_CMD_WRITE_CONFIG_LABEL = 0x49,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* Firmware Upgrade Related Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) MYRB_CMD_LOAD_IMAGE = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) MYRB_CMD_STORE_IMAGE = 0x21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) MYRB_CMD_PROGRAM_IMAGE = 0x22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* Diagnostic Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) MYRB_CMD_SET_DIAGNOSTIC_MODE = 0x31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) MYRB_CMD_RUN_DIAGNOSTIC = 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Subsystem Service Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) MYRB_CMD_GET_SUBSYS_DATA = 0x70,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) MYRB_CMD_SET_SUBSYS_PARAM = 0x71,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* Version 2.xx Firmware Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) MYRB_CMD_ENQUIRY_OLD = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) MYRB_CMD_GET_DEVICE_STATE_OLD = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) MYRB_CMD_READ_OLD = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) MYRB_CMD_WRITE_OLD = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) MYRB_CMD_READ_SG_OLD = 0x82,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) MYRB_CMD_WRITE_SG_OLD = 0x83
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * DAC960 V1 Firmware Command Status Codes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define MYRB_STATUS_SUCCESS 0x0000 /* Common */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define MYRB_STATUS_CHECK_CONDITION 0x0002 /* Common */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define MYRB_STATUS_NO_DEVICE 0x0102 /* Common */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define MYRB_STATUS_INVALID_ADDRESS 0x0105 /* Common */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define MYRB_STATUS_INVALID_PARAM 0x0105 /* Common */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define MYRB_STATUS_IRRECOVERABLE_DATA_ERROR 0x0001 /* I/O */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE 0x0002 /* I/O */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV 0x0105 /* I/O */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define MYRB_STATUS_BAD_DATA 0x010C /* I/O */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define MYRB_STATUS_DEVICE_BUSY 0x0008 /* DCDB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define MYRB_STATUS_DEVICE_NONRESPONSIVE 0x000E /* DCDB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define MYRB_STATUS_COMMAND_TERMINATED 0x000F /* DCDB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define MYRB_STATUS_START_DEVICE_FAILED 0x0002 /* Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define MYRB_STATUS_INVALID_CHANNEL_OR_TARGET 0x0105 /* Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define MYRB_STATUS_CHANNEL_BUSY 0x0106 /* Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define MYRB_STATUS_OUT_OF_MEMORY 0x0107 /* Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define MYRB_STATUS_CHANNEL_NOT_STOPPED 0x0002 /* Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE 0x0002 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define MYRB_STATUS_RBLD_BADBLOCKS 0x0003 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define MYRB_STATUS_RBLD_NEW_DISK_FAILED 0x0004 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS 0x0106 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define MYRB_STATUS_DEPENDENT_DISK_DEAD 0x0002 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define MYRB_STATUS_INCONSISTENT_BLOCKS 0x0003 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define MYRB_STATUS_INVALID_OR_NONREDUNDANT_LDRV 0x0105 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define MYRB_STATUS_NO_RBLD_OR_CHECK_INPROGRESS 0x0105 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define MYRB_STATUS_RBLD_IN_PROGRESS_DATA_VALID 0x0000 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE 0x0002 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define MYRB_STATUS_RBLD_FAILED_BADBLOCKS 0x0003 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED 0x0004 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define MYRB_STATUS_RBLD_SUCCESS 0x0100 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define MYRB_STATUS_RBLD_SUCCESS_TERMINATED 0x0107 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define MYRB_STATUS_RBLD_NOT_CHECKED 0x0108 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define MYRB_STATUS_BGI_SUCCESS 0x0100 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define MYRB_STATUS_BGI_ABORTED 0x0005 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define MYRB_STATUS_NO_BGI_INPROGRESS 0x0105 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define MYRB_STATUS_ADD_CAPACITY_INPROGRESS 0x0004 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define MYRB_STATUS_ADD_CAPACITY_FAILED_OR_SUSPENDED 0x00F4 /* Consistency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define MYRB_STATUS_CONFIG2_CSUM_ERROR 0x0002 /* Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define MYRB_STATUS_CONFIGURATION_SUSPENDED 0x0106 /* Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define MYRB_STATUS_FAILED_TO_CONFIGURE_NVRAM 0x0105 /* Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define MYRB_STATUS_CONFIGURATION_NOT_SAVED 0x0106 /* Configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define MYRB_STATUS_SUBSYS_NOTINSTALLED 0x0001 /* Subsystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define MYRB_STATUS_SUBSYS_FAILED 0x0002 /* Subsystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define MYRB_STATUS_SUBSYS_BUSY 0x0106 /* Subsystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define MYRB_STATUS_SUBSYS_TIMEOUT 0x0108 /* Subsystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * DAC960 V1 Firmware Enquiry Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct myrb_enquiry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) unsigned char ldev_count; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) unsigned int rsvd1:24; /* Bytes 1-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) unsigned int ldev_sizes[32]; /* Bytes 4-131 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) unsigned short flash_age; /* Bytes 132-133 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) unsigned char deferred:1; /* Byte 134 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) unsigned char low_bat:1; /* Byte 134 Bit 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) unsigned char rsvd2:6; /* Byte 134 Bits 2-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) } status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) unsigned char rsvd3:8; /* Byte 135 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) unsigned char fw_minor_version; /* Byte 136 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) unsigned char fw_major_version; /* Byte 137 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) MYRB_STDBY_RBLD_IN_PROGRESS = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) MYRB_BG_RBLD_IN_PROGRESS = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) MYRB_BG_CHECK_IN_PROGRESS = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR = 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED = 0xF0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED = 0xF1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER = 0xF2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED = 0xF3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) } __packed rbld; /* Byte 138 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) unsigned char max_tcq; /* Byte 139 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) unsigned char ldev_offline; /* Byte 140 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) unsigned char rsvd4:8; /* Byte 141 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) unsigned short ev_seq; /* Bytes 142-143 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) unsigned char ldev_critical; /* Byte 144 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) unsigned int rsvd5:24; /* Bytes 145-147 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) unsigned char pdev_dead; /* Byte 148 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) unsigned char rsvd6:8; /* Byte 149 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) unsigned char rbld_count; /* Byte 150 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) unsigned char rsvd7:3; /* Byte 151 Bits 0-2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) unsigned char bbu_present:1; /* Byte 151 Bit 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) unsigned char rsvd8:4; /* Byte 151 Bits 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) } misc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) unsigned char target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) unsigned char channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) } dead_drives[21]; /* Bytes 152-194 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) unsigned char rsvd9[62]; /* Bytes 195-255 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) * DAC960 V1 Firmware Enquiry2 Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct myrb_enquiry2 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) DAC960_V1_P_PD_PU = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) DAC960_V1_PL = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) DAC960_V1_PG = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) DAC960_V1_PJ = 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) DAC960_V1_PR = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) DAC960_V1_PT = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) DAC960_V1_PTL0 = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) DAC960_V1_PRL = 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) DAC960_V1_PTL1 = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) DAC960_V1_1164P = 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) } __packed sub_model; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) unsigned char actual_channels; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) MYRB_5_CHANNEL_BOARD = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) MYRB_3_CHANNEL_BOARD = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) MYRB_2_CHANNEL_BOARD = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) MYRB_3_CHANNEL_ASIC_DAC = 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) } __packed model; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) MYRB_EISA_CONTROLLER = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) MYRB_MCA_CONTROLLER = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) MYRB_PCI_CONTROLLER = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) MYRB_SCSI_TO_SCSI = 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) } __packed controller; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) } hw; /* Bytes 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* MajorVersion.MinorVersion-FirmwareType-TurnID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) unsigned char major_version; /* Byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) unsigned char minor_version; /* Byte 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) unsigned char turn_id; /* Byte 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) char firmware_type; /* Byte 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) } fw; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) unsigned int rsvd1; /* Byte 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) unsigned char cfg_chan; /* Byte 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) unsigned char cur_chan; /* Byte 13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) unsigned char max_targets; /* Byte 14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) unsigned char max_tcq; /* Byte 15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) unsigned char max_ldev; /* Byte 16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) unsigned char max_arms; /* Byte 17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) unsigned char max_spans; /* Byte 18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) unsigned char rsvd2; /* Byte 19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) unsigned int rsvd3; /* Bytes 20-23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) unsigned int mem_size; /* Bytes 24-27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) unsigned int cache_size; /* Bytes 28-31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) unsigned int flash_size; /* Bytes 32-35 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) unsigned int nvram_size; /* Bytes 36-39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) MYRB_RAM_TYPE_DRAM = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) MYRB_RAM_TYPE_EDO = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) MYRB_RAM_TYPE_SDRAM = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) MYRB_RAM_TYPE_Last = 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) } __packed ram:3; /* Byte 40 Bits 0-2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) MYRB_ERR_CORR_None = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) MYRB_ERR_CORR_Parity = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) MYRB_ERR_CORR_ECC = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) MYRB_ERR_CORR_Last = 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) } __packed ec:3; /* Byte 40 Bits 3-5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) unsigned char fast_page:1; /* Byte 40 Bit 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) unsigned char low_power:1; /* Byte 40 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) unsigned char rsvd4; /* Bytes 41 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) } mem_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) unsigned short clock_speed; /* Bytes 42-43 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) unsigned short mem_speed; /* Bytes 44-45 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) unsigned short hw_speed; /* Bytes 46-47 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) unsigned char rsvd5[12]; /* Bytes 48-59 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) unsigned short max_cmds; /* Bytes 60-61 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) unsigned short max_sge; /* Bytes 62-63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) unsigned short max_drv_cmds; /* Bytes 64-65 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) unsigned short max_io_desc; /* Bytes 66-67 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) unsigned short max_sectors; /* Bytes 68-69 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) unsigned char latency; /* Byte 70 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) unsigned char rsvd6; /* Byte 71 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) unsigned char scsi_tmo; /* Byte 72 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) unsigned char rsvd7; /* Byte 73 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) unsigned short min_freelines; /* Bytes 74-75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) unsigned char rsvd8[8]; /* Bytes 76-83 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) unsigned char rbld_rate_const; /* Byte 84 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) unsigned char rsvd9[11]; /* Byte 85-95 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) unsigned short pdrv_block_size; /* Bytes 96-97 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) unsigned short ldev_block_size; /* Bytes 98-99 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) unsigned short max_blocks_per_cmd; /* Bytes 100-101 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) unsigned short block_factor; /* Bytes 102-103 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) unsigned short cacheline_size; /* Bytes 104-105 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) MYRB_WIDTH_NARROW_8BIT = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) MYRB_WIDTH_WIDE_16BIT = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) MYRB_WIDTH_WIDE_32BIT = 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) } __packed bus_width:2; /* Byte 106 Bits 0-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) MYRB_SCSI_SPEED_FAST = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) MYRB_SCSI_SPEED_ULTRA = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) MYRB_SCSI_SPEED_ULTRA2 = 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) } __packed bus_speed:2; /* Byte 106 Bits 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) unsigned char differential:1; /* Byte 106 Bit 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) unsigned char rsvd10:3; /* Byte 106 Bits 5-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) } scsi_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) unsigned char rsvd11[5]; /* Byte 107-111 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) unsigned short fw_build; /* Bytes 112-113 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) MYRB_FAULT_AEMI = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) MYRB_FAULT_OEM1 = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) MYRB_FAULT_OEM2 = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) MYRB_FAULT_OEM3 = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) MYRB_FAULT_CONNER = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) MYRB_FAULT_SAFTE = 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) } __packed fault_mgmt; /* Byte 114 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) unsigned char rsvd12; /* Byte 115 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) unsigned int clustering:1; /* Byte 116 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) unsigned int online_RAID_expansion:1; /* Byte 116 Bit 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) unsigned int readahead:1; /* Byte 116 Bit 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) unsigned int bgi:1; /* Byte 116 Bit 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) unsigned int rsvd13:28; /* Bytes 116-119 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) } fw_features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) unsigned char rsvd14[8]; /* Bytes 120-127 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * DAC960 V1 Firmware Logical Drive State type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) enum myrb_devstate {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) MYRB_DEVICE_DEAD = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) MYRB_DEVICE_WO = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) MYRB_DEVICE_ONLINE = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) MYRB_DEVICE_CRITICAL = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) MYRB_DEVICE_STANDBY = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) MYRB_DEVICE_OFFLINE = 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) * DAC960 V1 RAID Levels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) enum myrb_raidlevel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) MYRB_RAID_LEVEL0 = 0x0, /* RAID 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) MYRB_RAID_LEVEL1 = 0x1, /* RAID 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) MYRB_RAID_LEVEL3 = 0x3, /* RAID 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) MYRB_RAID_LEVEL5 = 0x5, /* RAID 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) MYRB_RAID_LEVEL6 = 0x6, /* RAID 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) MYRB_RAID_JBOD = 0x7, /* RAID 7 (JBOD) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) * DAC960 V1 Firmware Logical Drive Information structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct myrb_ldev_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) unsigned int size; /* Bytes 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) enum myrb_devstate state; /* Byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) unsigned int raid_level:7; /* Byte 5 Bits 0-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) unsigned int wb_enabled:1; /* Byte 5 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) unsigned int rsvd:16; /* Bytes 6-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * DAC960 V1 Firmware Perform Event Log Operation Types.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #define DAC960_V1_GetEventLogEntry 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * DAC960 V1 Firmware Get Event Log Entry Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) struct myrb_log_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) unsigned char msg_type; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) unsigned char msg_len; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) unsigned char target:5; /* Byte 2 Bits 0-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) unsigned char channel:3; /* Byte 2 Bits 5-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) unsigned char lun:6; /* Byte 3 Bits 0-5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) unsigned char rsvd1:2; /* Byte 3 Bits 6-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) unsigned short seq_num; /* Bytes 4-5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) unsigned char sense[26]; /* Bytes 6-31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) * DAC960 V1 Firmware Get Device State Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * The structure is padded by 2 bytes for compatibility with Version 2.xx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) * Firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) struct myrb_pdev_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) unsigned int present:1; /* Byte 0 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) unsigned int :7; /* Byte 0 Bits 1-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) MYRB_TYPE_OTHER = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) MYRB_TYPE_DISK = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) MYRB_TYPE_TAPE = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) MYRB_TYPE_CDROM_OR_WORM = 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) } __packed devtype:2; /* Byte 1 Bits 0-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) unsigned int rsvd1:1; /* Byte 1 Bit 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) unsigned int fast20:1; /* Byte 1 Bit 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) unsigned int sync:1; /* Byte 1 Bit 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) unsigned int fast:1; /* Byte 1 Bit 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) unsigned int wide:1; /* Byte 1 Bit 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) unsigned int tcq_supported:1; /* Byte 1 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) enum myrb_devstate state; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) unsigned int rsvd2:8; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) unsigned int sync_multiplier; /* Byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) unsigned int sync_offset:5; /* Byte 5 Bits 0-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) unsigned int rsvd3:3; /* Byte 5 Bits 5-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) unsigned int size; /* Bytes 6-9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) unsigned int rsvd4:16; /* Bytes 10-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) * DAC960 V1 Firmware Get Rebuild Progress Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) struct myrb_rbld_progress {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) unsigned int ldev_num; /* Bytes 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) unsigned int ldev_size; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) unsigned int blocks_left; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * DAC960 V1 Firmware Background Initialization Status Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct myrb_bgi_status {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) unsigned int ldev_size; /* Bytes 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) unsigned int blocks_done; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) unsigned char rsvd1[12]; /* Bytes 8-19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) unsigned int ldev_num; /* Bytes 20-23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) unsigned char raid_level; /* Byte 24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) MYRB_BGI_INVALID = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) MYRB_BGI_STARTED = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) MYRB_BGI_INPROGRESS = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) MYRB_BGI_SUSPENDED = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) MYRB_BGI_CANCELLED = 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) } __packed status; /* Byte 25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) unsigned char rsvd2[6]; /* Bytes 26-31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) * DAC960 V1 Firmware Error Table Entry structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct myrb_error_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) unsigned char parity_err; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) unsigned char soft_err; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) unsigned char hard_err; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) unsigned char misc_err; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * DAC960 V1 Firmware Read Config2 Command reply structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) struct myrb_config2 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) unsigned rsvd1:1; /* Byte 0 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) unsigned active_negation:1; /* Byte 0 Bit 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) unsigned rsvd2:5; /* Byte 0 Bits 2-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) unsigned no_rescan_on_reset_during_scan:1; /* Byte 0 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) unsigned StorageWorks_support:1; /* Byte 1 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) unsigned HewlettPackard_support:1; /* Byte 1 Bit 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) unsigned no_disconnect_on_first_command:1; /* Byte 1 Bit 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) unsigned rsvd3:2; /* Byte 1 Bits 3-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) unsigned AEMI_ARM:1; /* Byte 1 Bit 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) unsigned AEMI_OFM:1; /* Byte 1 Bit 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) unsigned rsvd4:1; /* Byte 1 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) MYRB_OEMID_MYLEX = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) MYRB_OEMID_IBM = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) MYRB_OEMID_HP = 0x0A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) MYRB_OEMID_DEC = 0x0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) MYRB_OEMID_SIEMENS = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) MYRB_OEMID_INTEL = 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) } __packed OEMID; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) unsigned char oem_model_number; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) unsigned char physical_sector; /* Byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) unsigned char logical_sector; /* Byte 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) unsigned char block_factor; /* Byte 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) unsigned readahead_enabled:1; /* Byte 7 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) unsigned low_BIOS_delay:1; /* Byte 7 Bit 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) unsigned rsvd5:2; /* Byte 7 Bits 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) unsigned restrict_reassign_to_one_sector:1; /* Byte 7 Bit 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) unsigned rsvd6:1; /* Byte 7 Bit 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) unsigned FUA_during_write_recovery:1; /* Byte 7 Bit 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) unsigned enable_LeftSymmetricRAID5Algorithm:1; /* Byte 7 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) unsigned char default_rebuild_rate; /* Byte 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) unsigned char rsvd7; /* Byte 9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) unsigned char blocks_per_cacheline; /* Byte 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) unsigned char blocks_per_stripe; /* Byte 11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) MYRB_SPEED_ASYNC = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) MYRB_SPEED_SYNC_8MHz = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) MYRB_SPEED_SYNC_5MHz = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) MYRB_SPEED_SYNC_10_OR_20MHz = 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) } __packed speed:2; /* Byte 11 Bits 0-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) unsigned force_8bit:1; /* Byte 11 Bit 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) unsigned disable_fast20:1; /* Byte 11 Bit 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) unsigned rsvd8:3; /* Byte 11 Bits 4-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) unsigned enable_tcq:1; /* Byte 11 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) } __packed channelparam[6]; /* Bytes 12-17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) unsigned char SCSIInitiatorID; /* Byte 18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) unsigned char rsvd9; /* Byte 19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) MYRB_STARTUP_CONTROLLER_SPINUP = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) MYRB_STARTUP_POWERON_SPINUP = 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) } __packed startup; /* Byte 20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) unsigned char simultaneous_device_spinup_count; /* Byte 21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) unsigned char seconds_delay_between_spinups; /* Byte 22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) unsigned char rsvd10[29]; /* Bytes 23-51 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) unsigned BIOS_disabled:1; /* Byte 52 Bit 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) unsigned CDROM_boot_enabled:1; /* Byte 52 Bit 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) unsigned rsvd11:3; /* Byte 52 Bits 2-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) MYRB_GEOM_128_32 = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) MYRB_GEOM_255_63 = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) MYRB_GEOM_RESERVED1 = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) MYRB_GEOM_RESERVED2 = 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) } __packed drive_geometry:2; /* Byte 52 Bits 5-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) unsigned rsvd12:1; /* Byte 52 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) unsigned char rsvd13[9]; /* Bytes 53-61 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) unsigned short csum; /* Bytes 62-63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) * DAC960 V1 Firmware DCDB request structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) struct myrb_dcdb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) unsigned target:4; /* Byte 0 Bits 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) unsigned channel:4; /* Byte 0 Bits 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) MYRB_DCDB_XFER_NONE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) MYRB_DCDB_XFER_DEVICE_TO_SYSTEM = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) MYRB_DCDB_XFER_SYSTEM_TO_DEVICE = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) MYRB_DCDB_XFER_ILLEGAL = 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) } __packed data_xfer:2; /* Byte 1 Bits 0-1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) unsigned early_status:1; /* Byte 1 Bit 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) unsigned rsvd1:1; /* Byte 1 Bit 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) MYRB_DCDB_TMO_24_HRS = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) MYRB_DCDB_TMO_10_SECS = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) MYRB_DCDB_TMO_60_SECS = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) MYRB_DCDB_TMO_10_MINS = 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) } __packed timeout:2; /* Byte 1 Bits 4-5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) unsigned no_autosense:1; /* Byte 1 Bit 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) unsigned allow_disconnect:1; /* Byte 1 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) unsigned short xfer_len_lo; /* Bytes 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) u32 dma_addr; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) unsigned char cdb_len:4; /* Byte 8 Bits 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) unsigned char xfer_len_hi4:4; /* Byte 8 Bits 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) unsigned char sense_len; /* Byte 9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) unsigned char cdb[12]; /* Bytes 10-21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) unsigned char sense[64]; /* Bytes 22-85 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) unsigned char status; /* Byte 86 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) unsigned char rsvd2; /* Byte 87 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) *32 Bit Byte Count structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) struct myrb_sge {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) u32 sge_addr; /* Bytes 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) u32 sge_count; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) * 13 Byte DAC960 V1 Firmware Command Mailbox structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) * Bytes 13-15 are not used. The structure is padded to 16 bytes for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * efficient access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) union myrb_cmd_mbox {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) unsigned int words[4]; /* Words 0-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) unsigned char bytes[16]; /* Bytes 0-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) unsigned char rsvd[14]; /* Bytes 2-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) } __packed common;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) unsigned char rsvd1[6]; /* Bytes 2-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) unsigned char rsvd2[4]; /* Bytes 12-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) } __packed type3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) unsigned char optype; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) unsigned char rsvd1[5]; /* Bytes 3-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) unsigned char rsvd2[4]; /* Bytes 12-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) } __packed type3B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) unsigned char rsvd1[5]; /* Bytes 2-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) unsigned char ldev_num:6; /* Byte 7 Bits 0-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) unsigned char auto_restore:1; /* Byte 7 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) unsigned char rsvd2[8]; /* Bytes 8-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) } __packed type3C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) unsigned char channel; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) unsigned char target; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) enum myrb_devstate state; /* Byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) unsigned char rsvd1[3]; /* Bytes 5-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) unsigned char rsvd2[4]; /* Bytes 12-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) } __packed type3D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) unsigned char optype; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) unsigned char opqual; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) unsigned short ev_seq; /* Bytes 4-5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) unsigned char rsvd1[2]; /* Bytes 6-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) unsigned char rsvd2[4]; /* Bytes 12-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) } __packed type3E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) unsigned char rsvd1[2]; /* Bytes 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) unsigned char rbld_rate; /* Byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) unsigned char rsvd2[3]; /* Bytes 5-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) unsigned char rsvd3[4]; /* Bytes 12-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) } __packed type3R;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) unsigned short xfer_len; /* Bytes 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) unsigned int lba; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) unsigned char ldev_num; /* Byte 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) unsigned char rsvd[3]; /* Bytes 13-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) } __packed type4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) unsigned short xfer_len:11; /* Bytes 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) unsigned char ldev_num:5; /* Byte 3 Bits 3-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) } __packed ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) unsigned int lba; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) u32 addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) unsigned char sg_count:6; /* Byte 12 Bits 0-5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) MYRB_SGL_ADDR32_COUNT32 = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) MYRB_SGL_ADDR32_COUNT16 = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) MYRB_SGL_COUNT32_ADDR32 = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) MYRB_SGL_COUNT16_ADDR32 = 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) } __packed sg_type:2; /* Byte 12 Bits 6-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) unsigned char rsvd[3]; /* Bytes 13-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) } __packed type5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) enum myrb_cmd_opcode opcode; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) unsigned char id; /* Byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) unsigned char opcode2; /* Byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) unsigned char rsvd1:8; /* Byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) u32 cmd_mbox_addr; /* Bytes 4-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) u32 stat_mbox_addr; /* Bytes 8-11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) unsigned char rsvd2[4]; /* Bytes 12-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) } __packed typeX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * DAC960 V1 Firmware Controller Status Mailbox structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) struct myrb_stat_mbox {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) unsigned char id; /* Byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) unsigned char rsvd:7; /* Byte 1 Bits 0-6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) unsigned char valid:1; /* Byte 1 Bit 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) unsigned short status; /* Bytes 2-3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct myrb_cmdblk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) union myrb_cmd_mbox mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) unsigned short status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct completion *completion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) struct myrb_dcdb *dcdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) dma_addr_t dcdb_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) struct myrb_sge *sgl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) dma_addr_t sgl_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct myrb_hba {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) unsigned int ldev_block_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) unsigned char ldev_geom_heads;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) unsigned char ldev_geom_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) unsigned char bus_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) unsigned short stripe_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) unsigned short segment_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) unsigned short new_ev_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) unsigned short old_ev_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) bool dual_mode_interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) bool bgi_status_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) bool safte_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) bool need_ldev_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) bool need_err_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) bool need_rbld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) bool need_cc_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) bool need_bgi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) bool rbld_first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct pci_dev *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) struct Scsi_Host *host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) struct workqueue_struct *work_q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) char work_q_name[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) struct delayed_work monitor_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) unsigned long primary_monitor_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) unsigned long secondary_monitor_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) struct dma_pool *sg_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) struct dma_pool *dcdb_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) spinlock_t queue_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) void (*qcmd)(struct myrb_hba *cs, struct myrb_cmdblk *cmd_blk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) void (*write_cmd_mbox)(union myrb_cmd_mbox *next_mbox,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) union myrb_cmd_mbox *cmd_mbox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) void (*get_cmd_mbox)(void __iomem *base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) void (*disable_intr)(void __iomem *base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) void (*reset)(void __iomem *base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) unsigned int ctlr_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) unsigned char model_name[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) unsigned char fw_version[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) unsigned int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) phys_addr_t io_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) phys_addr_t pci_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) void __iomem *io_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) void __iomem *mmio_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) size_t cmd_mbox_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) dma_addr_t cmd_mbox_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) union myrb_cmd_mbox *first_cmd_mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) union myrb_cmd_mbox *last_cmd_mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) union myrb_cmd_mbox *next_cmd_mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) union myrb_cmd_mbox *prev_cmd_mbox1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) union myrb_cmd_mbox *prev_cmd_mbox2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) size_t stat_mbox_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) dma_addr_t stat_mbox_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) struct myrb_stat_mbox *first_stat_mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) struct myrb_stat_mbox *last_stat_mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) struct myrb_stat_mbox *next_stat_mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct myrb_cmdblk dcmd_blk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) struct myrb_cmdblk mcmd_blk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) struct mutex dcmd_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) struct myrb_enquiry *enquiry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) dma_addr_t enquiry_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) struct myrb_error_entry *err_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) dma_addr_t err_table_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) unsigned short last_rbld_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) struct myrb_ldev_info *ldev_info_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) dma_addr_t ldev_info_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) struct myrb_bgi_status bgi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct mutex dma_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) * DAC960 LA Series Controller Interface Register Offsets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) #define DAC960_LA_mmio_size 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) enum DAC960_LA_reg_offset {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) DAC960_LA_IRQMASK_OFFSET = 0x34,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) DAC960_LA_CMDOP_OFFSET = 0x50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) DAC960_LA_CMDID_OFFSET = 0x51,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) DAC960_LA_MBOX2_OFFSET = 0x52,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) DAC960_LA_MBOX3_OFFSET = 0x53,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) DAC960_LA_MBOX4_OFFSET = 0x54,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) DAC960_LA_MBOX5_OFFSET = 0x55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) DAC960_LA_MBOX6_OFFSET = 0x56,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) DAC960_LA_MBOX7_OFFSET = 0x57,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) DAC960_LA_MBOX8_OFFSET = 0x58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) DAC960_LA_MBOX9_OFFSET = 0x59,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) DAC960_LA_MBOX10_OFFSET = 0x5A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) DAC960_LA_MBOX11_OFFSET = 0x5B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) DAC960_LA_MBOX12_OFFSET = 0x5C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) DAC960_LA_STSID_OFFSET = 0x5D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) DAC960_LA_STS_OFFSET = 0x5E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) DAC960_LA_IDB_OFFSET = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) DAC960_LA_ODB_OFFSET = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) DAC960_LA_ERRSTS_OFFSET = 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) * DAC960 LA Series Inbound Door Bell Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) #define DAC960_LA_IDB_HWMBOX_NEW_CMD 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) #define DAC960_LA_IDB_HWMBOX_ACK_STS 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) #define DAC960_LA_IDB_GEN_IRQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) #define DAC960_LA_IDB_CTRL_RESET 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) #define DAC960_LA_IDB_MMBOX_NEW_CMD 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) #define DAC960_LA_IDB_HWMBOX_EMPTY 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) #define DAC960_LA_IDB_INIT_DONE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) * DAC960 LA Series Outbound Door Bell Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) #define DAC960_LA_ODB_HWMBOX_ACK_IRQ 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) #define DAC960_LA_ODB_MMBOX_ACK_IRQ 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) #define DAC960_LA_ODB_HWMBOX_STS_AVAIL 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) #define DAC960_LA_ODB_MMBOX_STS_AVAIL 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) * DAC960 LA Series Interrupt Mask Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) #define DAC960_LA_IRQMASK_DISABLE_IRQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) * DAC960 LA Series Error Status Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) #define DAC960_LA_ERRSTS_PENDING 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * DAC960 PG Series Controller Interface Register Offsets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) #define DAC960_PG_mmio_size 0x2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) enum DAC960_PG_reg_offset {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) DAC960_PG_IDB_OFFSET = 0x0020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) DAC960_PG_ODB_OFFSET = 0x002C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) DAC960_PG_IRQMASK_OFFSET = 0x0034,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) DAC960_PG_CMDOP_OFFSET = 0x1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) DAC960_PG_CMDID_OFFSET = 0x1001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) DAC960_PG_MBOX2_OFFSET = 0x1002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) DAC960_PG_MBOX3_OFFSET = 0x1003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) DAC960_PG_MBOX4_OFFSET = 0x1004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) DAC960_PG_MBOX5_OFFSET = 0x1005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) DAC960_PG_MBOX6_OFFSET = 0x1006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) DAC960_PG_MBOX7_OFFSET = 0x1007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) DAC960_PG_MBOX8_OFFSET = 0x1008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) DAC960_PG_MBOX9_OFFSET = 0x1009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) DAC960_PG_MBOX10_OFFSET = 0x100A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) DAC960_PG_MBOX11_OFFSET = 0x100B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) DAC960_PG_MBOX12_OFFSET = 0x100C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) DAC960_PG_STSID_OFFSET = 0x1018,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) DAC960_PG_STS_OFFSET = 0x101A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) DAC960_PG_ERRSTS_OFFSET = 0x103F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * DAC960 PG Series Inbound Door Bell Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) #define DAC960_PG_IDB_HWMBOX_NEW_CMD 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) #define DAC960_PG_IDB_HWMBOX_ACK_STS 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) #define DAC960_PG_IDB_GEN_IRQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) #define DAC960_PG_IDB_CTRL_RESET 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) #define DAC960_PG_IDB_MMBOX_NEW_CMD 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) #define DAC960_PG_IDB_HWMBOX_FULL 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) #define DAC960_PG_IDB_INIT_IN_PROGRESS 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * DAC960 PG Series Outbound Door Bell Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) #define DAC960_PG_ODB_HWMBOX_ACK_IRQ 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) #define DAC960_PG_ODB_MMBOX_ACK_IRQ 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) #define DAC960_PG_ODB_HWMBOX_STS_AVAIL 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) #define DAC960_PG_ODB_MMBOX_STS_AVAIL 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) * DAC960 PG Series Interrupt Mask Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) #define DAC960_PG_IRQMASK_MSI_MASK1 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) #define DAC960_PG_IRQMASK_DISABLE_IRQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) #define DAC960_PG_IRQMASK_MSI_MASK2 0xF8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) * DAC960 PG Series Error Status Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) #define DAC960_PG_ERRSTS_PENDING 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) * DAC960 PD Series Controller Interface Register Offsets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) #define DAC960_PD_mmio_size 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) enum DAC960_PD_reg_offset {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) DAC960_PD_CMDOP_OFFSET = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) DAC960_PD_CMDID_OFFSET = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) DAC960_PD_MBOX2_OFFSET = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) DAC960_PD_MBOX3_OFFSET = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) DAC960_PD_MBOX4_OFFSET = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) DAC960_PD_MBOX5_OFFSET = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) DAC960_PD_MBOX6_OFFSET = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) DAC960_PD_MBOX7_OFFSET = 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) DAC960_PD_MBOX8_OFFSET = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) DAC960_PD_MBOX9_OFFSET = 0x09,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) DAC960_PD_MBOX10_OFFSET = 0x0A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) DAC960_PD_MBOX11_OFFSET = 0x0B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) DAC960_PD_MBOX12_OFFSET = 0x0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) DAC960_PD_STSID_OFFSET = 0x0D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) DAC960_PD_STS_OFFSET = 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) DAC960_PD_ERRSTS_OFFSET = 0x3F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) DAC960_PD_IDB_OFFSET = 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) DAC960_PD_ODB_OFFSET = 0x41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) DAC960_PD_IRQEN_OFFSET = 0x43,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * DAC960 PD Series Inbound Door Bell Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) #define DAC960_PD_IDB_HWMBOX_NEW_CMD 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) #define DAC960_PD_IDB_HWMBOX_ACK_STS 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) #define DAC960_PD_IDB_GEN_IRQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) #define DAC960_PD_IDB_CTRL_RESET 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) #define DAC960_PD_IDB_HWMBOX_FULL 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) #define DAC960_PD_IDB_INIT_IN_PROGRESS 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) * DAC960 PD Series Outbound Door Bell Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) #define DAC960_PD_ODB_HWMBOX_ACK_IRQ 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) #define DAC960_PD_ODB_HWMBOX_STS_AVAIL 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) * DAC960 PD Series Interrupt Enable Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) #define DAC960_PD_IRQMASK_ENABLE_IRQ 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) * DAC960 PD Series Error Status Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) #define DAC960_PD_ERRSTS_PENDING 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) typedef int (*myrb_hw_init_t)(struct pci_dev *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) struct myrb_hba *cb, void __iomem *base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) typedef unsigned short (*mbox_mmio_init_t)(struct pci_dev *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) void __iomem *base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) union myrb_cmd_mbox *mbox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) struct myrb_privdata {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) myrb_hw_init_t hw_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) irq_handler_t irq_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) unsigned int mmio_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) #endif /* MYRB_H */