1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux MegaRAID driver for SAS based RAID controllers 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2003-2013 LSI Corporation 6*4882a593Smuzhiyun * Copyright (c) 2013-2016 Avago Technologies 7*4882a593Smuzhiyun * Copyright (c) 2016-2018 Broadcom Inc. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * FILE: megaraid_sas.h 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * Authors: Broadcom Inc. 12*4882a593Smuzhiyun * Kashyap Desai <kashyap.desai@broadcom.com> 13*4882a593Smuzhiyun * Sumit Saxena <sumit.saxena@broadcom.com> 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * Send feedback to: megaraidlinux.pdl@broadcom.com 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef LSI_MEGARAID_SAS_H 19*4882a593Smuzhiyun #define LSI_MEGARAID_SAS_H 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* 22*4882a593Smuzhiyun * MegaRAID SAS Driver meta data 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun #define MEGASAS_VERSION "07.714.04.00-rc1" 25*4882a593Smuzhiyun #define MEGASAS_RELDATE "Apr 14, 2020" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define MEGASAS_MSIX_NAME_LEN 32 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* 30*4882a593Smuzhiyun * Device IDs 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 33*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C 34*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 35*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_SAS1078GEN2 0x0078 36*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_SAS0079GEN2 0x0079 37*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_SAS0073SKINNY 0x0073 38*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_SAS0071SKINNY 0x0071 39*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_FUSION 0x005b 40*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_PLASMA 0x002f 41*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_INVADER 0x005d 42*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_FURY 0x005f 43*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_INTRUDER 0x00ce 44*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_INTRUDER_24 0x00cf 45*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_CUTLASS_52 0x0052 46*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_CUTLASS_53 0x0053 47*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_VENTURA 0x0014 48*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_CRUSADER 0x0015 49*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_HARPOON 0x0016 50*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_TOMCAT 0x0017 51*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_VENTURA_4PORT 0x001B 52*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_CRUSADER_4PORT 0x001C 53*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E1 0x10e1 54*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E2 0x10e2 55*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E5 0x10e5 56*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E6 0x10e6 57*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E0 0x10e0 58*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E3 0x10e3 59*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E4 0x10e4 60*4882a593Smuzhiyun #define PCI_DEVICE_ID_LSI_AERO_10E7 0x10e7 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* 63*4882a593Smuzhiyun * Intel HBA SSDIDs 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3DC080_SSDID 0x9360 66*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3DC040_SSDID 0x9362 67*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3SC008_SSDID 0x9380 68*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3MC044_SSDID 0x9381 69*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3WC080_SSDID 0x9341 70*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3WC040_SSDID 0x9343 71*4882a593Smuzhiyun #define MEGARAID_INTEL_RMS3BC160_SSDID 0x352B 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* 74*4882a593Smuzhiyun * Intruder HBA SSDIDs 75*4882a593Smuzhiyun */ 76*4882a593Smuzhiyun #define MEGARAID_INTRUDER_SSDID1 0x9371 77*4882a593Smuzhiyun #define MEGARAID_INTRUDER_SSDID2 0x9390 78*4882a593Smuzhiyun #define MEGARAID_INTRUDER_SSDID3 0x9370 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * Intel HBA branding 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3DC080_BRANDING \ 84*4882a593Smuzhiyun "Intel(R) RAID Controller RS3DC080" 85*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3DC040_BRANDING \ 86*4882a593Smuzhiyun "Intel(R) RAID Controller RS3DC040" 87*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3SC008_BRANDING \ 88*4882a593Smuzhiyun "Intel(R) RAID Controller RS3SC008" 89*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3MC044_BRANDING \ 90*4882a593Smuzhiyun "Intel(R) RAID Controller RS3MC044" 91*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3WC080_BRANDING \ 92*4882a593Smuzhiyun "Intel(R) RAID Controller RS3WC080" 93*4882a593Smuzhiyun #define MEGARAID_INTEL_RS3WC040_BRANDING \ 94*4882a593Smuzhiyun "Intel(R) RAID Controller RS3WC040" 95*4882a593Smuzhiyun #define MEGARAID_INTEL_RMS3BC160_BRANDING \ 96*4882a593Smuzhiyun "Intel(R) Integrated RAID Module RMS3BC160" 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* 99*4882a593Smuzhiyun * ===================================== 100*4882a593Smuzhiyun * MegaRAID SAS MFI firmware definitions 101*4882a593Smuzhiyun * ===================================== 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * MFI stands for MegaRAID SAS FW Interface. This is just a moniker for 106*4882a593Smuzhiyun * protocol between the software and firmware. Commands are issued using 107*4882a593Smuzhiyun * "message frames" 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * FW posts its state in upper 4 bits of outbound_msg_0 register 112*4882a593Smuzhiyun */ 113*4882a593Smuzhiyun #define MFI_STATE_MASK 0xF0000000 114*4882a593Smuzhiyun #define MFI_STATE_UNDEFINED 0x00000000 115*4882a593Smuzhiyun #define MFI_STATE_BB_INIT 0x10000000 116*4882a593Smuzhiyun #define MFI_STATE_FW_INIT 0x40000000 117*4882a593Smuzhiyun #define MFI_STATE_WAIT_HANDSHAKE 0x60000000 118*4882a593Smuzhiyun #define MFI_STATE_FW_INIT_2 0x70000000 119*4882a593Smuzhiyun #define MFI_STATE_DEVICE_SCAN 0x80000000 120*4882a593Smuzhiyun #define MFI_STATE_BOOT_MESSAGE_PENDING 0x90000000 121*4882a593Smuzhiyun #define MFI_STATE_FLUSH_CACHE 0xA0000000 122*4882a593Smuzhiyun #define MFI_STATE_READY 0xB0000000 123*4882a593Smuzhiyun #define MFI_STATE_OPERATIONAL 0xC0000000 124*4882a593Smuzhiyun #define MFI_STATE_FAULT 0xF0000000 125*4882a593Smuzhiyun #define MFI_STATE_FORCE_OCR 0x00000080 126*4882a593Smuzhiyun #define MFI_STATE_DMADONE 0x00000008 127*4882a593Smuzhiyun #define MFI_STATE_CRASH_DUMP_DONE 0x00000004 128*4882a593Smuzhiyun #define MFI_RESET_REQUIRED 0x00000001 129*4882a593Smuzhiyun #define MFI_RESET_ADAPTER 0x00000002 130*4882a593Smuzhiyun #define MEGAMFI_FRAME_SIZE 64 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define MFI_STATE_FAULT_CODE 0x0FFF0000 133*4882a593Smuzhiyun #define MFI_STATE_FAULT_SUBCODE 0x0000FF00 134*4882a593Smuzhiyun /* 135*4882a593Smuzhiyun * During FW init, clear pending cmds & reset state using inbound_msg_0 136*4882a593Smuzhiyun * 137*4882a593Smuzhiyun * ABORT : Abort all pending cmds 138*4882a593Smuzhiyun * READY : Move from OPERATIONAL to READY state; discard queue info 139*4882a593Smuzhiyun * MFIMODE : Discard (possible) low MFA posted in 64-bit mode (??) 140*4882a593Smuzhiyun * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver 141*4882a593Smuzhiyun * HOTPLUG : Resume from Hotplug 142*4882a593Smuzhiyun * MFI_STOP_ADP : Send signal to FW to stop processing 143*4882a593Smuzhiyun * MFI_ADP_TRIGGER_SNAP_DUMP: Inform firmware to initiate snap dump 144*4882a593Smuzhiyun */ 145*4882a593Smuzhiyun #define WRITE_SEQUENCE_OFFSET (0x0000000FC) /* I20 */ 146*4882a593Smuzhiyun #define HOST_DIAGNOSTIC_OFFSET (0x000000F8) /* I20 */ 147*4882a593Smuzhiyun #define DIAG_WRITE_ENABLE (0x00000080) 148*4882a593Smuzhiyun #define DIAG_RESET_ADAPTER (0x00000004) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define MFI_ADP_RESET 0x00000040 151*4882a593Smuzhiyun #define MFI_INIT_ABORT 0x00000001 152*4882a593Smuzhiyun #define MFI_INIT_READY 0x00000002 153*4882a593Smuzhiyun #define MFI_INIT_MFIMODE 0x00000004 154*4882a593Smuzhiyun #define MFI_INIT_CLEAR_HANDSHAKE 0x00000008 155*4882a593Smuzhiyun #define MFI_INIT_HOTPLUG 0x00000010 156*4882a593Smuzhiyun #define MFI_STOP_ADP 0x00000020 157*4882a593Smuzhiyun #define MFI_RESET_FLAGS MFI_INIT_READY| \ 158*4882a593Smuzhiyun MFI_INIT_MFIMODE| \ 159*4882a593Smuzhiyun MFI_INIT_ABORT 160*4882a593Smuzhiyun #define MFI_ADP_TRIGGER_SNAP_DUMP 0x00000100 161*4882a593Smuzhiyun #define MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE (0x01) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun /* 164*4882a593Smuzhiyun * MFI frame flags 165*4882a593Smuzhiyun */ 166*4882a593Smuzhiyun #define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 167*4882a593Smuzhiyun #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE 0x0001 168*4882a593Smuzhiyun #define MFI_FRAME_SGL32 0x0000 169*4882a593Smuzhiyun #define MFI_FRAME_SGL64 0x0002 170*4882a593Smuzhiyun #define MFI_FRAME_SENSE32 0x0000 171*4882a593Smuzhiyun #define MFI_FRAME_SENSE64 0x0004 172*4882a593Smuzhiyun #define MFI_FRAME_DIR_NONE 0x0000 173*4882a593Smuzhiyun #define MFI_FRAME_DIR_WRITE 0x0008 174*4882a593Smuzhiyun #define MFI_FRAME_DIR_READ 0x0010 175*4882a593Smuzhiyun #define MFI_FRAME_DIR_BOTH 0x0018 176*4882a593Smuzhiyun #define MFI_FRAME_IEEE 0x0020 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* Driver internal */ 179*4882a593Smuzhiyun #define DRV_DCMD_POLLED_MODE 0x1 180*4882a593Smuzhiyun #define DRV_DCMD_SKIP_REFIRE 0x2 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* 183*4882a593Smuzhiyun * Definition for cmd_status 184*4882a593Smuzhiyun */ 185*4882a593Smuzhiyun #define MFI_CMD_STATUS_POLL_MODE 0xFF 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* 188*4882a593Smuzhiyun * MFI command opcodes 189*4882a593Smuzhiyun */ 190*4882a593Smuzhiyun enum MFI_CMD_OP { 191*4882a593Smuzhiyun MFI_CMD_INIT = 0x0, 192*4882a593Smuzhiyun MFI_CMD_LD_READ = 0x1, 193*4882a593Smuzhiyun MFI_CMD_LD_WRITE = 0x2, 194*4882a593Smuzhiyun MFI_CMD_LD_SCSI_IO = 0x3, 195*4882a593Smuzhiyun MFI_CMD_PD_SCSI_IO = 0x4, 196*4882a593Smuzhiyun MFI_CMD_DCMD = 0x5, 197*4882a593Smuzhiyun MFI_CMD_ABORT = 0x6, 198*4882a593Smuzhiyun MFI_CMD_SMP = 0x7, 199*4882a593Smuzhiyun MFI_CMD_STP = 0x8, 200*4882a593Smuzhiyun MFI_CMD_NVME = 0x9, 201*4882a593Smuzhiyun MFI_CMD_TOOLBOX = 0xa, 202*4882a593Smuzhiyun MFI_CMD_OP_COUNT, 203*4882a593Smuzhiyun MFI_CMD_INVALID = 0xff 204*4882a593Smuzhiyun }; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun #define MR_DCMD_CTRL_GET_INFO 0x01010000 207*4882a593Smuzhiyun #define MR_DCMD_LD_GET_LIST 0x03010000 208*4882a593Smuzhiyun #define MR_DCMD_LD_LIST_QUERY 0x03010100 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #define MR_DCMD_CTRL_CACHE_FLUSH 0x01101000 211*4882a593Smuzhiyun #define MR_FLUSH_CTRL_CACHE 0x01 212*4882a593Smuzhiyun #define MR_FLUSH_DISK_CACHE 0x02 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define MR_DCMD_CTRL_SHUTDOWN 0x01050000 215*4882a593Smuzhiyun #define MR_DCMD_HIBERNATE_SHUTDOWN 0x01060000 216*4882a593Smuzhiyun #define MR_ENABLE_DRIVE_SPINDOWN 0x01 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #define MR_DCMD_CTRL_EVENT_GET_INFO 0x01040100 219*4882a593Smuzhiyun #define MR_DCMD_CTRL_EVENT_GET 0x01040300 220*4882a593Smuzhiyun #define MR_DCMD_CTRL_EVENT_WAIT 0x01040500 221*4882a593Smuzhiyun #define MR_DCMD_LD_GET_PROPERTIES 0x03030000 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #define MR_DCMD_CLUSTER 0x08000000 224*4882a593Smuzhiyun #define MR_DCMD_CLUSTER_RESET_ALL 0x08010100 225*4882a593Smuzhiyun #define MR_DCMD_CLUSTER_RESET_LD 0x08010200 226*4882a593Smuzhiyun #define MR_DCMD_PD_LIST_QUERY 0x02010100 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun #define MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS 0x01190100 229*4882a593Smuzhiyun #define MR_DRIVER_SET_APP_CRASHDUMP_MODE (0xF0010000 | 0x0600) 230*4882a593Smuzhiyun #define MR_DCMD_PD_GET_INFO 0x02020000 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* 233*4882a593Smuzhiyun * Global functions 234*4882a593Smuzhiyun */ 235*4882a593Smuzhiyun extern u8 MR_ValidateMapInfo(struct megasas_instance *instance, u64 map_id); 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* 239*4882a593Smuzhiyun * MFI command completion codes 240*4882a593Smuzhiyun */ 241*4882a593Smuzhiyun enum MFI_STAT { 242*4882a593Smuzhiyun MFI_STAT_OK = 0x00, 243*4882a593Smuzhiyun MFI_STAT_INVALID_CMD = 0x01, 244*4882a593Smuzhiyun MFI_STAT_INVALID_DCMD = 0x02, 245*4882a593Smuzhiyun MFI_STAT_INVALID_PARAMETER = 0x03, 246*4882a593Smuzhiyun MFI_STAT_INVALID_SEQUENCE_NUMBER = 0x04, 247*4882a593Smuzhiyun MFI_STAT_ABORT_NOT_POSSIBLE = 0x05, 248*4882a593Smuzhiyun MFI_STAT_APP_HOST_CODE_NOT_FOUND = 0x06, 249*4882a593Smuzhiyun MFI_STAT_APP_IN_USE = 0x07, 250*4882a593Smuzhiyun MFI_STAT_APP_NOT_INITIALIZED = 0x08, 251*4882a593Smuzhiyun MFI_STAT_ARRAY_INDEX_INVALID = 0x09, 252*4882a593Smuzhiyun MFI_STAT_ARRAY_ROW_NOT_EMPTY = 0x0a, 253*4882a593Smuzhiyun MFI_STAT_CONFIG_RESOURCE_CONFLICT = 0x0b, 254*4882a593Smuzhiyun MFI_STAT_DEVICE_NOT_FOUND = 0x0c, 255*4882a593Smuzhiyun MFI_STAT_DRIVE_TOO_SMALL = 0x0d, 256*4882a593Smuzhiyun MFI_STAT_FLASH_ALLOC_FAIL = 0x0e, 257*4882a593Smuzhiyun MFI_STAT_FLASH_BUSY = 0x0f, 258*4882a593Smuzhiyun MFI_STAT_FLASH_ERROR = 0x10, 259*4882a593Smuzhiyun MFI_STAT_FLASH_IMAGE_BAD = 0x11, 260*4882a593Smuzhiyun MFI_STAT_FLASH_IMAGE_INCOMPLETE = 0x12, 261*4882a593Smuzhiyun MFI_STAT_FLASH_NOT_OPEN = 0x13, 262*4882a593Smuzhiyun MFI_STAT_FLASH_NOT_STARTED = 0x14, 263*4882a593Smuzhiyun MFI_STAT_FLUSH_FAILED = 0x15, 264*4882a593Smuzhiyun MFI_STAT_HOST_CODE_NOT_FOUNT = 0x16, 265*4882a593Smuzhiyun MFI_STAT_LD_CC_IN_PROGRESS = 0x17, 266*4882a593Smuzhiyun MFI_STAT_LD_INIT_IN_PROGRESS = 0x18, 267*4882a593Smuzhiyun MFI_STAT_LD_LBA_OUT_OF_RANGE = 0x19, 268*4882a593Smuzhiyun MFI_STAT_LD_MAX_CONFIGURED = 0x1a, 269*4882a593Smuzhiyun MFI_STAT_LD_NOT_OPTIMAL = 0x1b, 270*4882a593Smuzhiyun MFI_STAT_LD_RBLD_IN_PROGRESS = 0x1c, 271*4882a593Smuzhiyun MFI_STAT_LD_RECON_IN_PROGRESS = 0x1d, 272*4882a593Smuzhiyun MFI_STAT_LD_WRONG_RAID_LEVEL = 0x1e, 273*4882a593Smuzhiyun MFI_STAT_MAX_SPARES_EXCEEDED = 0x1f, 274*4882a593Smuzhiyun MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, 275*4882a593Smuzhiyun MFI_STAT_MFC_HW_ERROR = 0x21, 276*4882a593Smuzhiyun MFI_STAT_NO_HW_PRESENT = 0x22, 277*4882a593Smuzhiyun MFI_STAT_NOT_FOUND = 0x23, 278*4882a593Smuzhiyun MFI_STAT_NOT_IN_ENCL = 0x24, 279*4882a593Smuzhiyun MFI_STAT_PD_CLEAR_IN_PROGRESS = 0x25, 280*4882a593Smuzhiyun MFI_STAT_PD_TYPE_WRONG = 0x26, 281*4882a593Smuzhiyun MFI_STAT_PR_DISABLED = 0x27, 282*4882a593Smuzhiyun MFI_STAT_ROW_INDEX_INVALID = 0x28, 283*4882a593Smuzhiyun MFI_STAT_SAS_CONFIG_INVALID_ACTION = 0x29, 284*4882a593Smuzhiyun MFI_STAT_SAS_CONFIG_INVALID_DATA = 0x2a, 285*4882a593Smuzhiyun MFI_STAT_SAS_CONFIG_INVALID_PAGE = 0x2b, 286*4882a593Smuzhiyun MFI_STAT_SAS_CONFIG_INVALID_TYPE = 0x2c, 287*4882a593Smuzhiyun MFI_STAT_SCSI_DONE_WITH_ERROR = 0x2d, 288*4882a593Smuzhiyun MFI_STAT_SCSI_IO_FAILED = 0x2e, 289*4882a593Smuzhiyun MFI_STAT_SCSI_RESERVATION_CONFLICT = 0x2f, 290*4882a593Smuzhiyun MFI_STAT_SHUTDOWN_FAILED = 0x30, 291*4882a593Smuzhiyun MFI_STAT_TIME_NOT_SET = 0x31, 292*4882a593Smuzhiyun MFI_STAT_WRONG_STATE = 0x32, 293*4882a593Smuzhiyun MFI_STAT_LD_OFFLINE = 0x33, 294*4882a593Smuzhiyun MFI_STAT_PEER_NOTIFICATION_REJECTED = 0x34, 295*4882a593Smuzhiyun MFI_STAT_PEER_NOTIFICATION_FAILED = 0x35, 296*4882a593Smuzhiyun MFI_STAT_RESERVATION_IN_PROGRESS = 0x36, 297*4882a593Smuzhiyun MFI_STAT_I2C_ERRORS_DETECTED = 0x37, 298*4882a593Smuzhiyun MFI_STAT_PCI_ERRORS_DETECTED = 0x38, 299*4882a593Smuzhiyun MFI_STAT_CONFIG_SEQ_MISMATCH = 0x67, 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun MFI_STAT_INVALID_STATUS = 0xFF 302*4882a593Smuzhiyun }; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun enum mfi_evt_class { 305*4882a593Smuzhiyun MFI_EVT_CLASS_DEBUG = -2, 306*4882a593Smuzhiyun MFI_EVT_CLASS_PROGRESS = -1, 307*4882a593Smuzhiyun MFI_EVT_CLASS_INFO = 0, 308*4882a593Smuzhiyun MFI_EVT_CLASS_WARNING = 1, 309*4882a593Smuzhiyun MFI_EVT_CLASS_CRITICAL = 2, 310*4882a593Smuzhiyun MFI_EVT_CLASS_FATAL = 3, 311*4882a593Smuzhiyun MFI_EVT_CLASS_DEAD = 4 312*4882a593Smuzhiyun }; 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* 315*4882a593Smuzhiyun * Crash dump related defines 316*4882a593Smuzhiyun */ 317*4882a593Smuzhiyun #define MAX_CRASH_DUMP_SIZE 512 318*4882a593Smuzhiyun #define CRASH_DMA_BUF_SIZE (1024 * 1024) 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun enum MR_FW_CRASH_DUMP_STATE { 321*4882a593Smuzhiyun UNAVAILABLE = 0, 322*4882a593Smuzhiyun AVAILABLE = 1, 323*4882a593Smuzhiyun COPYING = 2, 324*4882a593Smuzhiyun COPIED = 3, 325*4882a593Smuzhiyun COPY_ERROR = 4, 326*4882a593Smuzhiyun }; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun enum _MR_CRASH_BUF_STATUS { 329*4882a593Smuzhiyun MR_CRASH_BUF_TURN_OFF = 0, 330*4882a593Smuzhiyun MR_CRASH_BUF_TURN_ON = 1, 331*4882a593Smuzhiyun }; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* 334*4882a593Smuzhiyun * Number of mailbox bytes in DCMD message frame 335*4882a593Smuzhiyun */ 336*4882a593Smuzhiyun #define MFI_MBOX_SIZE 12 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun enum MR_EVT_CLASS { 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun MR_EVT_CLASS_DEBUG = -2, 341*4882a593Smuzhiyun MR_EVT_CLASS_PROGRESS = -1, 342*4882a593Smuzhiyun MR_EVT_CLASS_INFO = 0, 343*4882a593Smuzhiyun MR_EVT_CLASS_WARNING = 1, 344*4882a593Smuzhiyun MR_EVT_CLASS_CRITICAL = 2, 345*4882a593Smuzhiyun MR_EVT_CLASS_FATAL = 3, 346*4882a593Smuzhiyun MR_EVT_CLASS_DEAD = 4, 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun }; 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun enum MR_EVT_LOCALE { 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun MR_EVT_LOCALE_LD = 0x0001, 353*4882a593Smuzhiyun MR_EVT_LOCALE_PD = 0x0002, 354*4882a593Smuzhiyun MR_EVT_LOCALE_ENCL = 0x0004, 355*4882a593Smuzhiyun MR_EVT_LOCALE_BBU = 0x0008, 356*4882a593Smuzhiyun MR_EVT_LOCALE_SAS = 0x0010, 357*4882a593Smuzhiyun MR_EVT_LOCALE_CTRL = 0x0020, 358*4882a593Smuzhiyun MR_EVT_LOCALE_CONFIG = 0x0040, 359*4882a593Smuzhiyun MR_EVT_LOCALE_CLUSTER = 0x0080, 360*4882a593Smuzhiyun MR_EVT_LOCALE_ALL = 0xffff, 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun }; 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun enum MR_EVT_ARGS { 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun MR_EVT_ARGS_NONE, 367*4882a593Smuzhiyun MR_EVT_ARGS_CDB_SENSE, 368*4882a593Smuzhiyun MR_EVT_ARGS_LD, 369*4882a593Smuzhiyun MR_EVT_ARGS_LD_COUNT, 370*4882a593Smuzhiyun MR_EVT_ARGS_LD_LBA, 371*4882a593Smuzhiyun MR_EVT_ARGS_LD_OWNER, 372*4882a593Smuzhiyun MR_EVT_ARGS_LD_LBA_PD_LBA, 373*4882a593Smuzhiyun MR_EVT_ARGS_LD_PROG, 374*4882a593Smuzhiyun MR_EVT_ARGS_LD_STATE, 375*4882a593Smuzhiyun MR_EVT_ARGS_LD_STRIP, 376*4882a593Smuzhiyun MR_EVT_ARGS_PD, 377*4882a593Smuzhiyun MR_EVT_ARGS_PD_ERR, 378*4882a593Smuzhiyun MR_EVT_ARGS_PD_LBA, 379*4882a593Smuzhiyun MR_EVT_ARGS_PD_LBA_LD, 380*4882a593Smuzhiyun MR_EVT_ARGS_PD_PROG, 381*4882a593Smuzhiyun MR_EVT_ARGS_PD_STATE, 382*4882a593Smuzhiyun MR_EVT_ARGS_PCI, 383*4882a593Smuzhiyun MR_EVT_ARGS_RATE, 384*4882a593Smuzhiyun MR_EVT_ARGS_STR, 385*4882a593Smuzhiyun MR_EVT_ARGS_TIME, 386*4882a593Smuzhiyun MR_EVT_ARGS_ECC, 387*4882a593Smuzhiyun MR_EVT_ARGS_LD_PROP, 388*4882a593Smuzhiyun MR_EVT_ARGS_PD_SPARE, 389*4882a593Smuzhiyun MR_EVT_ARGS_PD_INDEX, 390*4882a593Smuzhiyun MR_EVT_ARGS_DIAG_PASS, 391*4882a593Smuzhiyun MR_EVT_ARGS_DIAG_FAIL, 392*4882a593Smuzhiyun MR_EVT_ARGS_PD_LBA_LBA, 393*4882a593Smuzhiyun MR_EVT_ARGS_PORT_PHY, 394*4882a593Smuzhiyun MR_EVT_ARGS_PD_MISSING, 395*4882a593Smuzhiyun MR_EVT_ARGS_PD_ADDRESS, 396*4882a593Smuzhiyun MR_EVT_ARGS_BITMAP, 397*4882a593Smuzhiyun MR_EVT_ARGS_CONNECTOR, 398*4882a593Smuzhiyun MR_EVT_ARGS_PD_PD, 399*4882a593Smuzhiyun MR_EVT_ARGS_PD_FRU, 400*4882a593Smuzhiyun MR_EVT_ARGS_PD_PATHINFO, 401*4882a593Smuzhiyun MR_EVT_ARGS_PD_POWER_STATE, 402*4882a593Smuzhiyun MR_EVT_ARGS_GENERIC, 403*4882a593Smuzhiyun }; 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun #define SGE_BUFFER_SIZE 4096 407*4882a593Smuzhiyun #define MEGASAS_CLUSTER_ID_SIZE 16 408*4882a593Smuzhiyun /* 409*4882a593Smuzhiyun * define constants for device list query options 410*4882a593Smuzhiyun */ 411*4882a593Smuzhiyun enum MR_PD_QUERY_TYPE { 412*4882a593Smuzhiyun MR_PD_QUERY_TYPE_ALL = 0, 413*4882a593Smuzhiyun MR_PD_QUERY_TYPE_STATE = 1, 414*4882a593Smuzhiyun MR_PD_QUERY_TYPE_POWER_STATE = 2, 415*4882a593Smuzhiyun MR_PD_QUERY_TYPE_MEDIA_TYPE = 3, 416*4882a593Smuzhiyun MR_PD_QUERY_TYPE_SPEED = 4, 417*4882a593Smuzhiyun MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5, 418*4882a593Smuzhiyun }; 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun enum MR_LD_QUERY_TYPE { 421*4882a593Smuzhiyun MR_LD_QUERY_TYPE_ALL = 0, 422*4882a593Smuzhiyun MR_LD_QUERY_TYPE_EXPOSED_TO_HOST = 1, 423*4882a593Smuzhiyun MR_LD_QUERY_TYPE_USED_TGT_IDS = 2, 424*4882a593Smuzhiyun MR_LD_QUERY_TYPE_CLUSTER_ACCESS = 3, 425*4882a593Smuzhiyun MR_LD_QUERY_TYPE_CLUSTER_LOCALE = 4, 426*4882a593Smuzhiyun }; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun #define MR_EVT_CFG_CLEARED 0x0004 430*4882a593Smuzhiyun #define MR_EVT_LD_STATE_CHANGE 0x0051 431*4882a593Smuzhiyun #define MR_EVT_PD_INSERTED 0x005b 432*4882a593Smuzhiyun #define MR_EVT_PD_REMOVED 0x0070 433*4882a593Smuzhiyun #define MR_EVT_LD_CREATED 0x008a 434*4882a593Smuzhiyun #define MR_EVT_LD_DELETED 0x008b 435*4882a593Smuzhiyun #define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db 436*4882a593Smuzhiyun #define MR_EVT_LD_OFFLINE 0x00fc 437*4882a593Smuzhiyun #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 438*4882a593Smuzhiyun #define MR_EVT_CTRL_PROP_CHANGED 0x012f 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun enum MR_PD_STATE { 441*4882a593Smuzhiyun MR_PD_STATE_UNCONFIGURED_GOOD = 0x00, 442*4882a593Smuzhiyun MR_PD_STATE_UNCONFIGURED_BAD = 0x01, 443*4882a593Smuzhiyun MR_PD_STATE_HOT_SPARE = 0x02, 444*4882a593Smuzhiyun MR_PD_STATE_OFFLINE = 0x10, 445*4882a593Smuzhiyun MR_PD_STATE_FAILED = 0x11, 446*4882a593Smuzhiyun MR_PD_STATE_REBUILD = 0x14, 447*4882a593Smuzhiyun MR_PD_STATE_ONLINE = 0x18, 448*4882a593Smuzhiyun MR_PD_STATE_COPYBACK = 0x20, 449*4882a593Smuzhiyun MR_PD_STATE_SYSTEM = 0x40, 450*4882a593Smuzhiyun }; 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun union MR_PD_REF { 453*4882a593Smuzhiyun struct { 454*4882a593Smuzhiyun u16 deviceId; 455*4882a593Smuzhiyun u16 seqNum; 456*4882a593Smuzhiyun } mrPdRef; 457*4882a593Smuzhiyun u32 ref; 458*4882a593Smuzhiyun }; 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun /* 461*4882a593Smuzhiyun * define the DDF Type bit structure 462*4882a593Smuzhiyun */ 463*4882a593Smuzhiyun union MR_PD_DDF_TYPE { 464*4882a593Smuzhiyun struct { 465*4882a593Smuzhiyun union { 466*4882a593Smuzhiyun struct { 467*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 468*4882a593Smuzhiyun u16 forcedPDGUID:1; 469*4882a593Smuzhiyun u16 inVD:1; 470*4882a593Smuzhiyun u16 isGlobalSpare:1; 471*4882a593Smuzhiyun u16 isSpare:1; 472*4882a593Smuzhiyun u16 isForeign:1; 473*4882a593Smuzhiyun u16 reserved:7; 474*4882a593Smuzhiyun u16 intf:4; 475*4882a593Smuzhiyun #else 476*4882a593Smuzhiyun u16 intf:4; 477*4882a593Smuzhiyun u16 reserved:7; 478*4882a593Smuzhiyun u16 isForeign:1; 479*4882a593Smuzhiyun u16 isSpare:1; 480*4882a593Smuzhiyun u16 isGlobalSpare:1; 481*4882a593Smuzhiyun u16 inVD:1; 482*4882a593Smuzhiyun u16 forcedPDGUID:1; 483*4882a593Smuzhiyun #endif 484*4882a593Smuzhiyun } pdType; 485*4882a593Smuzhiyun u16 type; 486*4882a593Smuzhiyun }; 487*4882a593Smuzhiyun u16 reserved; 488*4882a593Smuzhiyun } ddf; 489*4882a593Smuzhiyun struct { 490*4882a593Smuzhiyun u32 reserved; 491*4882a593Smuzhiyun } nonDisk; 492*4882a593Smuzhiyun u32 type; 493*4882a593Smuzhiyun } __packed; 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun /* 496*4882a593Smuzhiyun * defines the progress structure 497*4882a593Smuzhiyun */ 498*4882a593Smuzhiyun union MR_PROGRESS { 499*4882a593Smuzhiyun struct { 500*4882a593Smuzhiyun u16 progress; 501*4882a593Smuzhiyun union { 502*4882a593Smuzhiyun u16 elapsedSecs; 503*4882a593Smuzhiyun u16 elapsedSecsForLastPercent; 504*4882a593Smuzhiyun }; 505*4882a593Smuzhiyun } mrProgress; 506*4882a593Smuzhiyun u32 w; 507*4882a593Smuzhiyun } __packed; 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun /* 510*4882a593Smuzhiyun * defines the physical drive progress structure 511*4882a593Smuzhiyun */ 512*4882a593Smuzhiyun struct MR_PD_PROGRESS { 513*4882a593Smuzhiyun struct { 514*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 515*4882a593Smuzhiyun u32 rbld:1; 516*4882a593Smuzhiyun u32 patrol:1; 517*4882a593Smuzhiyun u32 clear:1; 518*4882a593Smuzhiyun u32 copyBack:1; 519*4882a593Smuzhiyun u32 erase:1; 520*4882a593Smuzhiyun u32 locate:1; 521*4882a593Smuzhiyun u32 reserved:26; 522*4882a593Smuzhiyun #else 523*4882a593Smuzhiyun u32 reserved:26; 524*4882a593Smuzhiyun u32 locate:1; 525*4882a593Smuzhiyun u32 erase:1; 526*4882a593Smuzhiyun u32 copyBack:1; 527*4882a593Smuzhiyun u32 clear:1; 528*4882a593Smuzhiyun u32 patrol:1; 529*4882a593Smuzhiyun u32 rbld:1; 530*4882a593Smuzhiyun #endif 531*4882a593Smuzhiyun } active; 532*4882a593Smuzhiyun union MR_PROGRESS rbld; 533*4882a593Smuzhiyun union MR_PROGRESS patrol; 534*4882a593Smuzhiyun union { 535*4882a593Smuzhiyun union MR_PROGRESS clear; 536*4882a593Smuzhiyun union MR_PROGRESS erase; 537*4882a593Smuzhiyun }; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun struct { 540*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 541*4882a593Smuzhiyun u32 rbld:1; 542*4882a593Smuzhiyun u32 patrol:1; 543*4882a593Smuzhiyun u32 clear:1; 544*4882a593Smuzhiyun u32 copyBack:1; 545*4882a593Smuzhiyun u32 erase:1; 546*4882a593Smuzhiyun u32 reserved:27; 547*4882a593Smuzhiyun #else 548*4882a593Smuzhiyun u32 reserved:27; 549*4882a593Smuzhiyun u32 erase:1; 550*4882a593Smuzhiyun u32 copyBack:1; 551*4882a593Smuzhiyun u32 clear:1; 552*4882a593Smuzhiyun u32 patrol:1; 553*4882a593Smuzhiyun u32 rbld:1; 554*4882a593Smuzhiyun #endif 555*4882a593Smuzhiyun } pause; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun union MR_PROGRESS reserved[3]; 558*4882a593Smuzhiyun } __packed; 559*4882a593Smuzhiyun 560*4882a593Smuzhiyun struct MR_PD_INFO { 561*4882a593Smuzhiyun union MR_PD_REF ref; 562*4882a593Smuzhiyun u8 inquiryData[96]; 563*4882a593Smuzhiyun u8 vpdPage83[64]; 564*4882a593Smuzhiyun u8 notSupported; 565*4882a593Smuzhiyun u8 scsiDevType; 566*4882a593Smuzhiyun 567*4882a593Smuzhiyun union { 568*4882a593Smuzhiyun u8 connectedPortBitmap; 569*4882a593Smuzhiyun u8 connectedPortNumbers; 570*4882a593Smuzhiyun }; 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun u8 deviceSpeed; 573*4882a593Smuzhiyun u32 mediaErrCount; 574*4882a593Smuzhiyun u32 otherErrCount; 575*4882a593Smuzhiyun u32 predFailCount; 576*4882a593Smuzhiyun u32 lastPredFailEventSeqNum; 577*4882a593Smuzhiyun 578*4882a593Smuzhiyun u16 fwState; 579*4882a593Smuzhiyun u8 disabledForRemoval; 580*4882a593Smuzhiyun u8 linkSpeed; 581*4882a593Smuzhiyun union MR_PD_DDF_TYPE state; 582*4882a593Smuzhiyun 583*4882a593Smuzhiyun struct { 584*4882a593Smuzhiyun u8 count; 585*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 586*4882a593Smuzhiyun u8 isPathBroken:4; 587*4882a593Smuzhiyun u8 reserved3:3; 588*4882a593Smuzhiyun u8 widePortCapable:1; 589*4882a593Smuzhiyun #else 590*4882a593Smuzhiyun u8 widePortCapable:1; 591*4882a593Smuzhiyun u8 reserved3:3; 592*4882a593Smuzhiyun u8 isPathBroken:4; 593*4882a593Smuzhiyun #endif 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun u8 connectorIndex[2]; 596*4882a593Smuzhiyun u8 reserved[4]; 597*4882a593Smuzhiyun u64 sasAddr[2]; 598*4882a593Smuzhiyun u8 reserved2[16]; 599*4882a593Smuzhiyun } pathInfo; 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun u64 rawSize; 602*4882a593Smuzhiyun u64 nonCoercedSize; 603*4882a593Smuzhiyun u64 coercedSize; 604*4882a593Smuzhiyun u16 enclDeviceId; 605*4882a593Smuzhiyun u8 enclIndex; 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun union { 608*4882a593Smuzhiyun u8 slotNumber; 609*4882a593Smuzhiyun u8 enclConnectorIndex; 610*4882a593Smuzhiyun }; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun struct MR_PD_PROGRESS progInfo; 613*4882a593Smuzhiyun u8 badBlockTableFull; 614*4882a593Smuzhiyun u8 unusableInCurrentConfig; 615*4882a593Smuzhiyun u8 vpdPage83Ext[64]; 616*4882a593Smuzhiyun u8 powerState; 617*4882a593Smuzhiyun u8 enclPosition; 618*4882a593Smuzhiyun u32 allowedOps; 619*4882a593Smuzhiyun u16 copyBackPartnerId; 620*4882a593Smuzhiyun u16 enclPartnerDeviceId; 621*4882a593Smuzhiyun struct { 622*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 623*4882a593Smuzhiyun u16 fdeCapable:1; 624*4882a593Smuzhiyun u16 fdeEnabled:1; 625*4882a593Smuzhiyun u16 secured:1; 626*4882a593Smuzhiyun u16 locked:1; 627*4882a593Smuzhiyun u16 foreign:1; 628*4882a593Smuzhiyun u16 needsEKM:1; 629*4882a593Smuzhiyun u16 reserved:10; 630*4882a593Smuzhiyun #else 631*4882a593Smuzhiyun u16 reserved:10; 632*4882a593Smuzhiyun u16 needsEKM:1; 633*4882a593Smuzhiyun u16 foreign:1; 634*4882a593Smuzhiyun u16 locked:1; 635*4882a593Smuzhiyun u16 secured:1; 636*4882a593Smuzhiyun u16 fdeEnabled:1; 637*4882a593Smuzhiyun u16 fdeCapable:1; 638*4882a593Smuzhiyun #endif 639*4882a593Smuzhiyun } security; 640*4882a593Smuzhiyun u8 mediaType; 641*4882a593Smuzhiyun u8 notCertified; 642*4882a593Smuzhiyun u8 bridgeVendor[8]; 643*4882a593Smuzhiyun u8 bridgeProductIdentification[16]; 644*4882a593Smuzhiyun u8 bridgeProductRevisionLevel[4]; 645*4882a593Smuzhiyun u8 satBridgeExists; 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun u8 interfaceType; 648*4882a593Smuzhiyun u8 temperature; 649*4882a593Smuzhiyun u8 emulatedBlockSize; 650*4882a593Smuzhiyun u16 userDataBlockSize; 651*4882a593Smuzhiyun u16 reserved2; 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun struct { 654*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 655*4882a593Smuzhiyun u32 piType:3; 656*4882a593Smuzhiyun u32 piFormatted:1; 657*4882a593Smuzhiyun u32 piEligible:1; 658*4882a593Smuzhiyun u32 NCQ:1; 659*4882a593Smuzhiyun u32 WCE:1; 660*4882a593Smuzhiyun u32 commissionedSpare:1; 661*4882a593Smuzhiyun u32 emergencySpare:1; 662*4882a593Smuzhiyun u32 ineligibleForSSCD:1; 663*4882a593Smuzhiyun u32 ineligibleForLd:1; 664*4882a593Smuzhiyun u32 useSSEraseType:1; 665*4882a593Smuzhiyun u32 wceUnchanged:1; 666*4882a593Smuzhiyun u32 supportScsiUnmap:1; 667*4882a593Smuzhiyun u32 reserved:18; 668*4882a593Smuzhiyun #else 669*4882a593Smuzhiyun u32 reserved:18; 670*4882a593Smuzhiyun u32 supportScsiUnmap:1; 671*4882a593Smuzhiyun u32 wceUnchanged:1; 672*4882a593Smuzhiyun u32 useSSEraseType:1; 673*4882a593Smuzhiyun u32 ineligibleForLd:1; 674*4882a593Smuzhiyun u32 ineligibleForSSCD:1; 675*4882a593Smuzhiyun u32 emergencySpare:1; 676*4882a593Smuzhiyun u32 commissionedSpare:1; 677*4882a593Smuzhiyun u32 WCE:1; 678*4882a593Smuzhiyun u32 NCQ:1; 679*4882a593Smuzhiyun u32 piEligible:1; 680*4882a593Smuzhiyun u32 piFormatted:1; 681*4882a593Smuzhiyun u32 piType:3; 682*4882a593Smuzhiyun #endif 683*4882a593Smuzhiyun } properties; 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun u64 shieldDiagCompletionTime; 686*4882a593Smuzhiyun u8 shieldCounter; 687*4882a593Smuzhiyun 688*4882a593Smuzhiyun u8 linkSpeedOther; 689*4882a593Smuzhiyun u8 reserved4[2]; 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun struct { 692*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 693*4882a593Smuzhiyun u32 bbmErrCountSupported:1; 694*4882a593Smuzhiyun u32 bbmErrCount:31; 695*4882a593Smuzhiyun #else 696*4882a593Smuzhiyun u32 bbmErrCount:31; 697*4882a593Smuzhiyun u32 bbmErrCountSupported:1; 698*4882a593Smuzhiyun #endif 699*4882a593Smuzhiyun } bbmErr; 700*4882a593Smuzhiyun 701*4882a593Smuzhiyun u8 reserved1[512-428]; 702*4882a593Smuzhiyun } __packed; 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun /* 705*4882a593Smuzhiyun * Definition of structure used to expose attributes of VD or JBOD 706*4882a593Smuzhiyun * (this structure is to be filled by firmware when MR_DCMD_DRV_GET_TARGET_PROP 707*4882a593Smuzhiyun * is fired by driver) 708*4882a593Smuzhiyun */ 709*4882a593Smuzhiyun struct MR_TARGET_PROPERTIES { 710*4882a593Smuzhiyun u32 max_io_size_kb; 711*4882a593Smuzhiyun u32 device_qdepth; 712*4882a593Smuzhiyun u32 sector_size; 713*4882a593Smuzhiyun u8 reset_tmo; 714*4882a593Smuzhiyun u8 reserved[499]; 715*4882a593Smuzhiyun } __packed; 716*4882a593Smuzhiyun 717*4882a593Smuzhiyun /* 718*4882a593Smuzhiyun * defines the physical drive address structure 719*4882a593Smuzhiyun */ 720*4882a593Smuzhiyun struct MR_PD_ADDRESS { 721*4882a593Smuzhiyun __le16 deviceId; 722*4882a593Smuzhiyun u16 enclDeviceId; 723*4882a593Smuzhiyun 724*4882a593Smuzhiyun union { 725*4882a593Smuzhiyun struct { 726*4882a593Smuzhiyun u8 enclIndex; 727*4882a593Smuzhiyun u8 slotNumber; 728*4882a593Smuzhiyun } mrPdAddress; 729*4882a593Smuzhiyun struct { 730*4882a593Smuzhiyun u8 enclPosition; 731*4882a593Smuzhiyun u8 enclConnectorIndex; 732*4882a593Smuzhiyun } mrEnclAddress; 733*4882a593Smuzhiyun }; 734*4882a593Smuzhiyun u8 scsiDevType; 735*4882a593Smuzhiyun union { 736*4882a593Smuzhiyun u8 connectedPortBitmap; 737*4882a593Smuzhiyun u8 connectedPortNumbers; 738*4882a593Smuzhiyun }; 739*4882a593Smuzhiyun u64 sasAddr[2]; 740*4882a593Smuzhiyun } __packed; 741*4882a593Smuzhiyun 742*4882a593Smuzhiyun /* 743*4882a593Smuzhiyun * defines the physical drive list structure 744*4882a593Smuzhiyun */ 745*4882a593Smuzhiyun struct MR_PD_LIST { 746*4882a593Smuzhiyun __le32 size; 747*4882a593Smuzhiyun __le32 count; 748*4882a593Smuzhiyun struct MR_PD_ADDRESS addr[1]; 749*4882a593Smuzhiyun } __packed; 750*4882a593Smuzhiyun 751*4882a593Smuzhiyun struct megasas_pd_list { 752*4882a593Smuzhiyun u16 tid; 753*4882a593Smuzhiyun u8 driveType; 754*4882a593Smuzhiyun u8 driveState; 755*4882a593Smuzhiyun } __packed; 756*4882a593Smuzhiyun 757*4882a593Smuzhiyun /* 758*4882a593Smuzhiyun * defines the logical drive reference structure 759*4882a593Smuzhiyun */ 760*4882a593Smuzhiyun union MR_LD_REF { 761*4882a593Smuzhiyun struct { 762*4882a593Smuzhiyun u8 targetId; 763*4882a593Smuzhiyun u8 reserved; 764*4882a593Smuzhiyun __le16 seqNum; 765*4882a593Smuzhiyun }; 766*4882a593Smuzhiyun __le32 ref; 767*4882a593Smuzhiyun } __packed; 768*4882a593Smuzhiyun 769*4882a593Smuzhiyun /* 770*4882a593Smuzhiyun * defines the logical drive list structure 771*4882a593Smuzhiyun */ 772*4882a593Smuzhiyun struct MR_LD_LIST { 773*4882a593Smuzhiyun __le32 ldCount; 774*4882a593Smuzhiyun __le32 reserved; 775*4882a593Smuzhiyun struct { 776*4882a593Smuzhiyun union MR_LD_REF ref; 777*4882a593Smuzhiyun u8 state; 778*4882a593Smuzhiyun u8 reserved[3]; 779*4882a593Smuzhiyun __le64 size; 780*4882a593Smuzhiyun } ldList[MAX_LOGICAL_DRIVES_EXT]; 781*4882a593Smuzhiyun } __packed; 782*4882a593Smuzhiyun 783*4882a593Smuzhiyun struct MR_LD_TARGETID_LIST { 784*4882a593Smuzhiyun __le32 size; 785*4882a593Smuzhiyun __le32 count; 786*4882a593Smuzhiyun u8 pad[3]; 787*4882a593Smuzhiyun u8 targetId[MAX_LOGICAL_DRIVES_EXT]; 788*4882a593Smuzhiyun }; 789*4882a593Smuzhiyun 790*4882a593Smuzhiyun struct MR_HOST_DEVICE_LIST_ENTRY { 791*4882a593Smuzhiyun struct { 792*4882a593Smuzhiyun union { 793*4882a593Smuzhiyun struct { 794*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 795*4882a593Smuzhiyun u8 reserved:7; 796*4882a593Smuzhiyun u8 is_sys_pd:1; 797*4882a593Smuzhiyun #else 798*4882a593Smuzhiyun u8 is_sys_pd:1; 799*4882a593Smuzhiyun u8 reserved:7; 800*4882a593Smuzhiyun #endif 801*4882a593Smuzhiyun } bits; 802*4882a593Smuzhiyun u8 byte; 803*4882a593Smuzhiyun } u; 804*4882a593Smuzhiyun } flags; 805*4882a593Smuzhiyun u8 scsi_type; 806*4882a593Smuzhiyun __le16 target_id; 807*4882a593Smuzhiyun u8 reserved[4]; 808*4882a593Smuzhiyun __le64 sas_addr[2]; 809*4882a593Smuzhiyun } __packed; 810*4882a593Smuzhiyun 811*4882a593Smuzhiyun struct MR_HOST_DEVICE_LIST { 812*4882a593Smuzhiyun __le32 size; 813*4882a593Smuzhiyun __le32 count; 814*4882a593Smuzhiyun __le32 reserved[2]; 815*4882a593Smuzhiyun struct MR_HOST_DEVICE_LIST_ENTRY host_device_list[1]; 816*4882a593Smuzhiyun } __packed; 817*4882a593Smuzhiyun 818*4882a593Smuzhiyun #define HOST_DEVICE_LIST_SZ (sizeof(struct MR_HOST_DEVICE_LIST) + \ 819*4882a593Smuzhiyun (sizeof(struct MR_HOST_DEVICE_LIST_ENTRY) * \ 820*4882a593Smuzhiyun (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT - 1))) 821*4882a593Smuzhiyun 822*4882a593Smuzhiyun 823*4882a593Smuzhiyun /* 824*4882a593Smuzhiyun * SAS controller properties 825*4882a593Smuzhiyun */ 826*4882a593Smuzhiyun struct megasas_ctrl_prop { 827*4882a593Smuzhiyun 828*4882a593Smuzhiyun u16 seq_num; 829*4882a593Smuzhiyun u16 pred_fail_poll_interval; 830*4882a593Smuzhiyun u16 intr_throttle_count; 831*4882a593Smuzhiyun u16 intr_throttle_timeouts; 832*4882a593Smuzhiyun u8 rebuild_rate; 833*4882a593Smuzhiyun u8 patrol_read_rate; 834*4882a593Smuzhiyun u8 bgi_rate; 835*4882a593Smuzhiyun u8 cc_rate; 836*4882a593Smuzhiyun u8 recon_rate; 837*4882a593Smuzhiyun u8 cache_flush_interval; 838*4882a593Smuzhiyun u8 spinup_drv_count; 839*4882a593Smuzhiyun u8 spinup_delay; 840*4882a593Smuzhiyun u8 cluster_enable; 841*4882a593Smuzhiyun u8 coercion_mode; 842*4882a593Smuzhiyun u8 alarm_enable; 843*4882a593Smuzhiyun u8 disable_auto_rebuild; 844*4882a593Smuzhiyun u8 disable_battery_warn; 845*4882a593Smuzhiyun u8 ecc_bucket_size; 846*4882a593Smuzhiyun u16 ecc_bucket_leak_rate; 847*4882a593Smuzhiyun u8 restore_hotspare_on_insertion; 848*4882a593Smuzhiyun u8 expose_encl_devices; 849*4882a593Smuzhiyun u8 maintainPdFailHistory; 850*4882a593Smuzhiyun u8 disallowHostRequestReordering; 851*4882a593Smuzhiyun u8 abortCCOnError; 852*4882a593Smuzhiyun u8 loadBalanceMode; 853*4882a593Smuzhiyun u8 disableAutoDetectBackplane; 854*4882a593Smuzhiyun 855*4882a593Smuzhiyun u8 snapVDSpace; 856*4882a593Smuzhiyun 857*4882a593Smuzhiyun /* 858*4882a593Smuzhiyun * Add properties that can be controlled by 859*4882a593Smuzhiyun * a bit in the following structure. 860*4882a593Smuzhiyun */ 861*4882a593Smuzhiyun struct { 862*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 863*4882a593Smuzhiyun u32 reserved:18; 864*4882a593Smuzhiyun u32 enableJBOD:1; 865*4882a593Smuzhiyun u32 disableSpinDownHS:1; 866*4882a593Smuzhiyun u32 allowBootWithPinnedCache:1; 867*4882a593Smuzhiyun u32 disableOnlineCtrlReset:1; 868*4882a593Smuzhiyun u32 enableSecretKeyControl:1; 869*4882a593Smuzhiyun u32 autoEnhancedImport:1; 870*4882a593Smuzhiyun u32 enableSpinDownUnconfigured:1; 871*4882a593Smuzhiyun u32 SSDPatrolReadEnabled:1; 872*4882a593Smuzhiyun u32 SSDSMARTerEnabled:1; 873*4882a593Smuzhiyun u32 disableNCQ:1; 874*4882a593Smuzhiyun u32 useFdeOnly:1; 875*4882a593Smuzhiyun u32 prCorrectUnconfiguredAreas:1; 876*4882a593Smuzhiyun u32 SMARTerEnabled:1; 877*4882a593Smuzhiyun u32 copyBackDisabled:1; 878*4882a593Smuzhiyun #else 879*4882a593Smuzhiyun u32 copyBackDisabled:1; 880*4882a593Smuzhiyun u32 SMARTerEnabled:1; 881*4882a593Smuzhiyun u32 prCorrectUnconfiguredAreas:1; 882*4882a593Smuzhiyun u32 useFdeOnly:1; 883*4882a593Smuzhiyun u32 disableNCQ:1; 884*4882a593Smuzhiyun u32 SSDSMARTerEnabled:1; 885*4882a593Smuzhiyun u32 SSDPatrolReadEnabled:1; 886*4882a593Smuzhiyun u32 enableSpinDownUnconfigured:1; 887*4882a593Smuzhiyun u32 autoEnhancedImport:1; 888*4882a593Smuzhiyun u32 enableSecretKeyControl:1; 889*4882a593Smuzhiyun u32 disableOnlineCtrlReset:1; 890*4882a593Smuzhiyun u32 allowBootWithPinnedCache:1; 891*4882a593Smuzhiyun u32 disableSpinDownHS:1; 892*4882a593Smuzhiyun u32 enableJBOD:1; 893*4882a593Smuzhiyun u32 reserved:18; 894*4882a593Smuzhiyun #endif 895*4882a593Smuzhiyun } OnOffProperties; 896*4882a593Smuzhiyun 897*4882a593Smuzhiyun union { 898*4882a593Smuzhiyun u8 autoSnapVDSpace; 899*4882a593Smuzhiyun u8 viewSpace; 900*4882a593Smuzhiyun struct { 901*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 902*4882a593Smuzhiyun u16 reserved3:9; 903*4882a593Smuzhiyun u16 enable_fw_dev_list:1; 904*4882a593Smuzhiyun u16 reserved2:1; 905*4882a593Smuzhiyun u16 enable_snap_dump:1; 906*4882a593Smuzhiyun u16 reserved1:4; 907*4882a593Smuzhiyun #else 908*4882a593Smuzhiyun u16 reserved1:4; 909*4882a593Smuzhiyun u16 enable_snap_dump:1; 910*4882a593Smuzhiyun u16 reserved2:1; 911*4882a593Smuzhiyun u16 enable_fw_dev_list:1; 912*4882a593Smuzhiyun u16 reserved3:9; 913*4882a593Smuzhiyun #endif 914*4882a593Smuzhiyun } on_off_properties2; 915*4882a593Smuzhiyun }; 916*4882a593Smuzhiyun __le16 spinDownTime; 917*4882a593Smuzhiyun u8 reserved[24]; 918*4882a593Smuzhiyun } __packed; 919*4882a593Smuzhiyun 920*4882a593Smuzhiyun /* 921*4882a593Smuzhiyun * SAS controller information 922*4882a593Smuzhiyun */ 923*4882a593Smuzhiyun struct megasas_ctrl_info { 924*4882a593Smuzhiyun 925*4882a593Smuzhiyun /* 926*4882a593Smuzhiyun * PCI device information 927*4882a593Smuzhiyun */ 928*4882a593Smuzhiyun struct { 929*4882a593Smuzhiyun 930*4882a593Smuzhiyun __le16 vendor_id; 931*4882a593Smuzhiyun __le16 device_id; 932*4882a593Smuzhiyun __le16 sub_vendor_id; 933*4882a593Smuzhiyun __le16 sub_device_id; 934*4882a593Smuzhiyun u8 reserved[24]; 935*4882a593Smuzhiyun 936*4882a593Smuzhiyun } __attribute__ ((packed)) pci; 937*4882a593Smuzhiyun 938*4882a593Smuzhiyun /* 939*4882a593Smuzhiyun * Host interface information 940*4882a593Smuzhiyun */ 941*4882a593Smuzhiyun struct { 942*4882a593Smuzhiyun 943*4882a593Smuzhiyun u8 PCIX:1; 944*4882a593Smuzhiyun u8 PCIE:1; 945*4882a593Smuzhiyun u8 iSCSI:1; 946*4882a593Smuzhiyun u8 SAS_3G:1; 947*4882a593Smuzhiyun u8 SRIOV:1; 948*4882a593Smuzhiyun u8 reserved_0:3; 949*4882a593Smuzhiyun u8 reserved_1[6]; 950*4882a593Smuzhiyun u8 port_count; 951*4882a593Smuzhiyun u64 port_addr[8]; 952*4882a593Smuzhiyun 953*4882a593Smuzhiyun } __attribute__ ((packed)) host_interface; 954*4882a593Smuzhiyun 955*4882a593Smuzhiyun /* 956*4882a593Smuzhiyun * Device (backend) interface information 957*4882a593Smuzhiyun */ 958*4882a593Smuzhiyun struct { 959*4882a593Smuzhiyun 960*4882a593Smuzhiyun u8 SPI:1; 961*4882a593Smuzhiyun u8 SAS_3G:1; 962*4882a593Smuzhiyun u8 SATA_1_5G:1; 963*4882a593Smuzhiyun u8 SATA_3G:1; 964*4882a593Smuzhiyun u8 reserved_0:4; 965*4882a593Smuzhiyun u8 reserved_1[6]; 966*4882a593Smuzhiyun u8 port_count; 967*4882a593Smuzhiyun u64 port_addr[8]; 968*4882a593Smuzhiyun 969*4882a593Smuzhiyun } __attribute__ ((packed)) device_interface; 970*4882a593Smuzhiyun 971*4882a593Smuzhiyun /* 972*4882a593Smuzhiyun * List of components residing in flash. All str are null terminated 973*4882a593Smuzhiyun */ 974*4882a593Smuzhiyun __le32 image_check_word; 975*4882a593Smuzhiyun __le32 image_component_count; 976*4882a593Smuzhiyun 977*4882a593Smuzhiyun struct { 978*4882a593Smuzhiyun 979*4882a593Smuzhiyun char name[8]; 980*4882a593Smuzhiyun char version[32]; 981*4882a593Smuzhiyun char build_date[16]; 982*4882a593Smuzhiyun char built_time[16]; 983*4882a593Smuzhiyun 984*4882a593Smuzhiyun } __attribute__ ((packed)) image_component[8]; 985*4882a593Smuzhiyun 986*4882a593Smuzhiyun /* 987*4882a593Smuzhiyun * List of flash components that have been flashed on the card, but 988*4882a593Smuzhiyun * are not in use, pending reset of the adapter. This list will be 989*4882a593Smuzhiyun * empty if a flash operation has not occurred. All stings are null 990*4882a593Smuzhiyun * terminated 991*4882a593Smuzhiyun */ 992*4882a593Smuzhiyun __le32 pending_image_component_count; 993*4882a593Smuzhiyun 994*4882a593Smuzhiyun struct { 995*4882a593Smuzhiyun 996*4882a593Smuzhiyun char name[8]; 997*4882a593Smuzhiyun char version[32]; 998*4882a593Smuzhiyun char build_date[16]; 999*4882a593Smuzhiyun char build_time[16]; 1000*4882a593Smuzhiyun 1001*4882a593Smuzhiyun } __attribute__ ((packed)) pending_image_component[8]; 1002*4882a593Smuzhiyun 1003*4882a593Smuzhiyun u8 max_arms; 1004*4882a593Smuzhiyun u8 max_spans; 1005*4882a593Smuzhiyun u8 max_arrays; 1006*4882a593Smuzhiyun u8 max_lds; 1007*4882a593Smuzhiyun 1008*4882a593Smuzhiyun char product_name[80]; 1009*4882a593Smuzhiyun char serial_no[32]; 1010*4882a593Smuzhiyun 1011*4882a593Smuzhiyun /* 1012*4882a593Smuzhiyun * Other physical/controller/operation information. Indicates the 1013*4882a593Smuzhiyun * presence of the hardware 1014*4882a593Smuzhiyun */ 1015*4882a593Smuzhiyun struct { 1016*4882a593Smuzhiyun 1017*4882a593Smuzhiyun u32 bbu:1; 1018*4882a593Smuzhiyun u32 alarm:1; 1019*4882a593Smuzhiyun u32 nvram:1; 1020*4882a593Smuzhiyun u32 uart:1; 1021*4882a593Smuzhiyun u32 reserved:28; 1022*4882a593Smuzhiyun 1023*4882a593Smuzhiyun } __attribute__ ((packed)) hw_present; 1024*4882a593Smuzhiyun 1025*4882a593Smuzhiyun __le32 current_fw_time; 1026*4882a593Smuzhiyun 1027*4882a593Smuzhiyun /* 1028*4882a593Smuzhiyun * Maximum data transfer sizes 1029*4882a593Smuzhiyun */ 1030*4882a593Smuzhiyun __le16 max_concurrent_cmds; 1031*4882a593Smuzhiyun __le16 max_sge_count; 1032*4882a593Smuzhiyun __le32 max_request_size; 1033*4882a593Smuzhiyun 1034*4882a593Smuzhiyun /* 1035*4882a593Smuzhiyun * Logical and physical device counts 1036*4882a593Smuzhiyun */ 1037*4882a593Smuzhiyun __le16 ld_present_count; 1038*4882a593Smuzhiyun __le16 ld_degraded_count; 1039*4882a593Smuzhiyun __le16 ld_offline_count; 1040*4882a593Smuzhiyun 1041*4882a593Smuzhiyun __le16 pd_present_count; 1042*4882a593Smuzhiyun __le16 pd_disk_present_count; 1043*4882a593Smuzhiyun __le16 pd_disk_pred_failure_count; 1044*4882a593Smuzhiyun __le16 pd_disk_failed_count; 1045*4882a593Smuzhiyun 1046*4882a593Smuzhiyun /* 1047*4882a593Smuzhiyun * Memory size information 1048*4882a593Smuzhiyun */ 1049*4882a593Smuzhiyun __le16 nvram_size; 1050*4882a593Smuzhiyun __le16 memory_size; 1051*4882a593Smuzhiyun __le16 flash_size; 1052*4882a593Smuzhiyun 1053*4882a593Smuzhiyun /* 1054*4882a593Smuzhiyun * Error counters 1055*4882a593Smuzhiyun */ 1056*4882a593Smuzhiyun __le16 mem_correctable_error_count; 1057*4882a593Smuzhiyun __le16 mem_uncorrectable_error_count; 1058*4882a593Smuzhiyun 1059*4882a593Smuzhiyun /* 1060*4882a593Smuzhiyun * Cluster information 1061*4882a593Smuzhiyun */ 1062*4882a593Smuzhiyun u8 cluster_permitted; 1063*4882a593Smuzhiyun u8 cluster_active; 1064*4882a593Smuzhiyun 1065*4882a593Smuzhiyun /* 1066*4882a593Smuzhiyun * Additional max data transfer sizes 1067*4882a593Smuzhiyun */ 1068*4882a593Smuzhiyun __le16 max_strips_per_io; 1069*4882a593Smuzhiyun 1070*4882a593Smuzhiyun /* 1071*4882a593Smuzhiyun * Controller capabilities structures 1072*4882a593Smuzhiyun */ 1073*4882a593Smuzhiyun struct { 1074*4882a593Smuzhiyun 1075*4882a593Smuzhiyun u32 raid_level_0:1; 1076*4882a593Smuzhiyun u32 raid_level_1:1; 1077*4882a593Smuzhiyun u32 raid_level_5:1; 1078*4882a593Smuzhiyun u32 raid_level_1E:1; 1079*4882a593Smuzhiyun u32 raid_level_6:1; 1080*4882a593Smuzhiyun u32 reserved:27; 1081*4882a593Smuzhiyun 1082*4882a593Smuzhiyun } __attribute__ ((packed)) raid_levels; 1083*4882a593Smuzhiyun 1084*4882a593Smuzhiyun struct { 1085*4882a593Smuzhiyun 1086*4882a593Smuzhiyun u32 rbld_rate:1; 1087*4882a593Smuzhiyun u32 cc_rate:1; 1088*4882a593Smuzhiyun u32 bgi_rate:1; 1089*4882a593Smuzhiyun u32 recon_rate:1; 1090*4882a593Smuzhiyun u32 patrol_rate:1; 1091*4882a593Smuzhiyun u32 alarm_control:1; 1092*4882a593Smuzhiyun u32 cluster_supported:1; 1093*4882a593Smuzhiyun u32 bbu:1; 1094*4882a593Smuzhiyun u32 spanning_allowed:1; 1095*4882a593Smuzhiyun u32 dedicated_hotspares:1; 1096*4882a593Smuzhiyun u32 revertible_hotspares:1; 1097*4882a593Smuzhiyun u32 foreign_config_import:1; 1098*4882a593Smuzhiyun u32 self_diagnostic:1; 1099*4882a593Smuzhiyun u32 mixed_redundancy_arr:1; 1100*4882a593Smuzhiyun u32 global_hot_spares:1; 1101*4882a593Smuzhiyun u32 reserved:17; 1102*4882a593Smuzhiyun 1103*4882a593Smuzhiyun } __attribute__ ((packed)) adapter_operations; 1104*4882a593Smuzhiyun 1105*4882a593Smuzhiyun struct { 1106*4882a593Smuzhiyun 1107*4882a593Smuzhiyun u32 read_policy:1; 1108*4882a593Smuzhiyun u32 write_policy:1; 1109*4882a593Smuzhiyun u32 io_policy:1; 1110*4882a593Smuzhiyun u32 access_policy:1; 1111*4882a593Smuzhiyun u32 disk_cache_policy:1; 1112*4882a593Smuzhiyun u32 reserved:27; 1113*4882a593Smuzhiyun 1114*4882a593Smuzhiyun } __attribute__ ((packed)) ld_operations; 1115*4882a593Smuzhiyun 1116*4882a593Smuzhiyun struct { 1117*4882a593Smuzhiyun 1118*4882a593Smuzhiyun u8 min; 1119*4882a593Smuzhiyun u8 max; 1120*4882a593Smuzhiyun u8 reserved[2]; 1121*4882a593Smuzhiyun 1122*4882a593Smuzhiyun } __attribute__ ((packed)) stripe_sz_ops; 1123*4882a593Smuzhiyun 1124*4882a593Smuzhiyun struct { 1125*4882a593Smuzhiyun 1126*4882a593Smuzhiyun u32 force_online:1; 1127*4882a593Smuzhiyun u32 force_offline:1; 1128*4882a593Smuzhiyun u32 force_rebuild:1; 1129*4882a593Smuzhiyun u32 reserved:29; 1130*4882a593Smuzhiyun 1131*4882a593Smuzhiyun } __attribute__ ((packed)) pd_operations; 1132*4882a593Smuzhiyun 1133*4882a593Smuzhiyun struct { 1134*4882a593Smuzhiyun 1135*4882a593Smuzhiyun u32 ctrl_supports_sas:1; 1136*4882a593Smuzhiyun u32 ctrl_supports_sata:1; 1137*4882a593Smuzhiyun u32 allow_mix_in_encl:1; 1138*4882a593Smuzhiyun u32 allow_mix_in_ld:1; 1139*4882a593Smuzhiyun u32 allow_sata_in_cluster:1; 1140*4882a593Smuzhiyun u32 reserved:27; 1141*4882a593Smuzhiyun 1142*4882a593Smuzhiyun } __attribute__ ((packed)) pd_mix_support; 1143*4882a593Smuzhiyun 1144*4882a593Smuzhiyun /* 1145*4882a593Smuzhiyun * Define ECC single-bit-error bucket information 1146*4882a593Smuzhiyun */ 1147*4882a593Smuzhiyun u8 ecc_bucket_count; 1148*4882a593Smuzhiyun u8 reserved_2[11]; 1149*4882a593Smuzhiyun 1150*4882a593Smuzhiyun /* 1151*4882a593Smuzhiyun * Include the controller properties (changeable items) 1152*4882a593Smuzhiyun */ 1153*4882a593Smuzhiyun struct megasas_ctrl_prop properties; 1154*4882a593Smuzhiyun 1155*4882a593Smuzhiyun /* 1156*4882a593Smuzhiyun * Define FW pkg version (set in envt v'bles on OEM basis) 1157*4882a593Smuzhiyun */ 1158*4882a593Smuzhiyun char package_version[0x60]; 1159*4882a593Smuzhiyun 1160*4882a593Smuzhiyun 1161*4882a593Smuzhiyun /* 1162*4882a593Smuzhiyun * If adapterOperations.supportMoreThan8Phys is set, 1163*4882a593Smuzhiyun * and deviceInterface.portCount is greater than 8, 1164*4882a593Smuzhiyun * SAS Addrs for first 8 ports shall be populated in 1165*4882a593Smuzhiyun * deviceInterface.portAddr, and the rest shall be 1166*4882a593Smuzhiyun * populated in deviceInterfacePortAddr2. 1167*4882a593Smuzhiyun */ 1168*4882a593Smuzhiyun __le64 deviceInterfacePortAddr2[8]; /*6a0h */ 1169*4882a593Smuzhiyun u8 reserved3[128]; /*6e0h */ 1170*4882a593Smuzhiyun 1171*4882a593Smuzhiyun struct { /*760h */ 1172*4882a593Smuzhiyun u16 minPdRaidLevel_0:4; 1173*4882a593Smuzhiyun u16 maxPdRaidLevel_0:12; 1174*4882a593Smuzhiyun 1175*4882a593Smuzhiyun u16 minPdRaidLevel_1:4; 1176*4882a593Smuzhiyun u16 maxPdRaidLevel_1:12; 1177*4882a593Smuzhiyun 1178*4882a593Smuzhiyun u16 minPdRaidLevel_5:4; 1179*4882a593Smuzhiyun u16 maxPdRaidLevel_5:12; 1180*4882a593Smuzhiyun 1181*4882a593Smuzhiyun u16 minPdRaidLevel_1E:4; 1182*4882a593Smuzhiyun u16 maxPdRaidLevel_1E:12; 1183*4882a593Smuzhiyun 1184*4882a593Smuzhiyun u16 minPdRaidLevel_6:4; 1185*4882a593Smuzhiyun u16 maxPdRaidLevel_6:12; 1186*4882a593Smuzhiyun 1187*4882a593Smuzhiyun u16 minPdRaidLevel_10:4; 1188*4882a593Smuzhiyun u16 maxPdRaidLevel_10:12; 1189*4882a593Smuzhiyun 1190*4882a593Smuzhiyun u16 minPdRaidLevel_50:4; 1191*4882a593Smuzhiyun u16 maxPdRaidLevel_50:12; 1192*4882a593Smuzhiyun 1193*4882a593Smuzhiyun u16 minPdRaidLevel_60:4; 1194*4882a593Smuzhiyun u16 maxPdRaidLevel_60:12; 1195*4882a593Smuzhiyun 1196*4882a593Smuzhiyun u16 minPdRaidLevel_1E_RLQ0:4; 1197*4882a593Smuzhiyun u16 maxPdRaidLevel_1E_RLQ0:12; 1198*4882a593Smuzhiyun 1199*4882a593Smuzhiyun u16 minPdRaidLevel_1E0_RLQ0:4; 1200*4882a593Smuzhiyun u16 maxPdRaidLevel_1E0_RLQ0:12; 1201*4882a593Smuzhiyun 1202*4882a593Smuzhiyun u16 reserved[6]; 1203*4882a593Smuzhiyun } pdsForRaidLevels; 1204*4882a593Smuzhiyun 1205*4882a593Smuzhiyun __le16 maxPds; /*780h */ 1206*4882a593Smuzhiyun __le16 maxDedHSPs; /*782h */ 1207*4882a593Smuzhiyun __le16 maxGlobalHSP; /*784h */ 1208*4882a593Smuzhiyun __le16 ddfSize; /*786h */ 1209*4882a593Smuzhiyun u8 maxLdsPerArray; /*788h */ 1210*4882a593Smuzhiyun u8 partitionsInDDF; /*789h */ 1211*4882a593Smuzhiyun u8 lockKeyBinding; /*78ah */ 1212*4882a593Smuzhiyun u8 maxPITsPerLd; /*78bh */ 1213*4882a593Smuzhiyun u8 maxViewsPerLd; /*78ch */ 1214*4882a593Smuzhiyun u8 maxTargetId; /*78dh */ 1215*4882a593Smuzhiyun __le16 maxBvlVdSize; /*78eh */ 1216*4882a593Smuzhiyun 1217*4882a593Smuzhiyun __le16 maxConfigurableSSCSize; /*790h */ 1218*4882a593Smuzhiyun __le16 currentSSCsize; /*792h */ 1219*4882a593Smuzhiyun 1220*4882a593Smuzhiyun char expanderFwVersion[12]; /*794h */ 1221*4882a593Smuzhiyun 1222*4882a593Smuzhiyun __le16 PFKTrialTimeRemaining; /*7A0h */ 1223*4882a593Smuzhiyun 1224*4882a593Smuzhiyun __le16 cacheMemorySize; /*7A2h */ 1225*4882a593Smuzhiyun 1226*4882a593Smuzhiyun struct { /*7A4h */ 1227*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1228*4882a593Smuzhiyun u32 reserved:5; 1229*4882a593Smuzhiyun u32 activePassive:2; 1230*4882a593Smuzhiyun u32 supportConfigAutoBalance:1; 1231*4882a593Smuzhiyun u32 mpio:1; 1232*4882a593Smuzhiyun u32 supportDataLDonSSCArray:1; 1233*4882a593Smuzhiyun u32 supportPointInTimeProgress:1; 1234*4882a593Smuzhiyun u32 supportUnevenSpans:1; 1235*4882a593Smuzhiyun u32 dedicatedHotSparesLimited:1; 1236*4882a593Smuzhiyun u32 headlessMode:1; 1237*4882a593Smuzhiyun u32 supportEmulatedDrives:1; 1238*4882a593Smuzhiyun u32 supportResetNow:1; 1239*4882a593Smuzhiyun u32 realTimeScheduler:1; 1240*4882a593Smuzhiyun u32 supportSSDPatrolRead:1; 1241*4882a593Smuzhiyun u32 supportPerfTuning:1; 1242*4882a593Smuzhiyun u32 disableOnlinePFKChange:1; 1243*4882a593Smuzhiyun u32 supportJBOD:1; 1244*4882a593Smuzhiyun u32 supportBootTimePFKChange:1; 1245*4882a593Smuzhiyun u32 supportSetLinkSpeed:1; 1246*4882a593Smuzhiyun u32 supportEmergencySpares:1; 1247*4882a593Smuzhiyun u32 supportSuspendResumeBGops:1; 1248*4882a593Smuzhiyun u32 blockSSDWriteCacheChange:1; 1249*4882a593Smuzhiyun u32 supportShieldState:1; 1250*4882a593Smuzhiyun u32 supportLdBBMInfo:1; 1251*4882a593Smuzhiyun u32 supportLdPIType3:1; 1252*4882a593Smuzhiyun u32 supportLdPIType2:1; 1253*4882a593Smuzhiyun u32 supportLdPIType1:1; 1254*4882a593Smuzhiyun u32 supportPIcontroller:1; 1255*4882a593Smuzhiyun #else 1256*4882a593Smuzhiyun u32 supportPIcontroller:1; 1257*4882a593Smuzhiyun u32 supportLdPIType1:1; 1258*4882a593Smuzhiyun u32 supportLdPIType2:1; 1259*4882a593Smuzhiyun u32 supportLdPIType3:1; 1260*4882a593Smuzhiyun u32 supportLdBBMInfo:1; 1261*4882a593Smuzhiyun u32 supportShieldState:1; 1262*4882a593Smuzhiyun u32 blockSSDWriteCacheChange:1; 1263*4882a593Smuzhiyun u32 supportSuspendResumeBGops:1; 1264*4882a593Smuzhiyun u32 supportEmergencySpares:1; 1265*4882a593Smuzhiyun u32 supportSetLinkSpeed:1; 1266*4882a593Smuzhiyun u32 supportBootTimePFKChange:1; 1267*4882a593Smuzhiyun u32 supportJBOD:1; 1268*4882a593Smuzhiyun u32 disableOnlinePFKChange:1; 1269*4882a593Smuzhiyun u32 supportPerfTuning:1; 1270*4882a593Smuzhiyun u32 supportSSDPatrolRead:1; 1271*4882a593Smuzhiyun u32 realTimeScheduler:1; 1272*4882a593Smuzhiyun 1273*4882a593Smuzhiyun u32 supportResetNow:1; 1274*4882a593Smuzhiyun u32 supportEmulatedDrives:1; 1275*4882a593Smuzhiyun u32 headlessMode:1; 1276*4882a593Smuzhiyun u32 dedicatedHotSparesLimited:1; 1277*4882a593Smuzhiyun 1278*4882a593Smuzhiyun 1279*4882a593Smuzhiyun u32 supportUnevenSpans:1; 1280*4882a593Smuzhiyun u32 supportPointInTimeProgress:1; 1281*4882a593Smuzhiyun u32 supportDataLDonSSCArray:1; 1282*4882a593Smuzhiyun u32 mpio:1; 1283*4882a593Smuzhiyun u32 supportConfigAutoBalance:1; 1284*4882a593Smuzhiyun u32 activePassive:2; 1285*4882a593Smuzhiyun u32 reserved:5; 1286*4882a593Smuzhiyun #endif 1287*4882a593Smuzhiyun } adapterOperations2; 1288*4882a593Smuzhiyun 1289*4882a593Smuzhiyun u8 driverVersion[32]; /*7A8h */ 1290*4882a593Smuzhiyun u8 maxDAPdCountSpinup60; /*7C8h */ 1291*4882a593Smuzhiyun u8 temperatureROC; /*7C9h */ 1292*4882a593Smuzhiyun u8 temperatureCtrl; /*7CAh */ 1293*4882a593Smuzhiyun u8 reserved4; /*7CBh */ 1294*4882a593Smuzhiyun __le16 maxConfigurablePds; /*7CCh */ 1295*4882a593Smuzhiyun 1296*4882a593Smuzhiyun 1297*4882a593Smuzhiyun u8 reserved5[2]; /*0x7CDh */ 1298*4882a593Smuzhiyun 1299*4882a593Smuzhiyun /* 1300*4882a593Smuzhiyun * HA cluster information 1301*4882a593Smuzhiyun */ 1302*4882a593Smuzhiyun struct { 1303*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1304*4882a593Smuzhiyun u32 reserved:25; 1305*4882a593Smuzhiyun u32 passive:1; 1306*4882a593Smuzhiyun u32 premiumFeatureMismatch:1; 1307*4882a593Smuzhiyun u32 ctrlPropIncompatible:1; 1308*4882a593Smuzhiyun u32 fwVersionMismatch:1; 1309*4882a593Smuzhiyun u32 hwIncompatible:1; 1310*4882a593Smuzhiyun u32 peerIsIncompatible:1; 1311*4882a593Smuzhiyun u32 peerIsPresent:1; 1312*4882a593Smuzhiyun #else 1313*4882a593Smuzhiyun u32 peerIsPresent:1; 1314*4882a593Smuzhiyun u32 peerIsIncompatible:1; 1315*4882a593Smuzhiyun u32 hwIncompatible:1; 1316*4882a593Smuzhiyun u32 fwVersionMismatch:1; 1317*4882a593Smuzhiyun u32 ctrlPropIncompatible:1; 1318*4882a593Smuzhiyun u32 premiumFeatureMismatch:1; 1319*4882a593Smuzhiyun u32 passive:1; 1320*4882a593Smuzhiyun u32 reserved:25; 1321*4882a593Smuzhiyun #endif 1322*4882a593Smuzhiyun } cluster; 1323*4882a593Smuzhiyun 1324*4882a593Smuzhiyun char clusterId[MEGASAS_CLUSTER_ID_SIZE]; /*0x7D4 */ 1325*4882a593Smuzhiyun struct { 1326*4882a593Smuzhiyun u8 maxVFsSupported; /*0x7E4*/ 1327*4882a593Smuzhiyun u8 numVFsEnabled; /*0x7E5*/ 1328*4882a593Smuzhiyun u8 requestorId; /*0x7E6 0:PF, 1:VF1, 2:VF2*/ 1329*4882a593Smuzhiyun u8 reserved; /*0x7E7*/ 1330*4882a593Smuzhiyun } iov; 1331*4882a593Smuzhiyun 1332*4882a593Smuzhiyun struct { 1333*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1334*4882a593Smuzhiyun u32 reserved:7; 1335*4882a593Smuzhiyun u32 useSeqNumJbodFP:1; 1336*4882a593Smuzhiyun u32 supportExtendedSSCSize:1; 1337*4882a593Smuzhiyun u32 supportDiskCacheSettingForSysPDs:1; 1338*4882a593Smuzhiyun u32 supportCPLDUpdate:1; 1339*4882a593Smuzhiyun u32 supportTTYLogCompression:1; 1340*4882a593Smuzhiyun u32 discardCacheDuringLDDelete:1; 1341*4882a593Smuzhiyun u32 supportSecurityonJBOD:1; 1342*4882a593Smuzhiyun u32 supportCacheBypassModes:1; 1343*4882a593Smuzhiyun u32 supportDisableSESMonitoring:1; 1344*4882a593Smuzhiyun u32 supportForceFlash:1; 1345*4882a593Smuzhiyun u32 supportNVDRAM:1; 1346*4882a593Smuzhiyun u32 supportDrvActivityLEDSetting:1; 1347*4882a593Smuzhiyun u32 supportAllowedOpsforDrvRemoval:1; 1348*4882a593Smuzhiyun u32 supportHOQRebuild:1; 1349*4882a593Smuzhiyun u32 supportForceTo512e:1; 1350*4882a593Smuzhiyun u32 supportNVCacheErase:1; 1351*4882a593Smuzhiyun u32 supportDebugQueue:1; 1352*4882a593Smuzhiyun u32 supportSwZone:1; 1353*4882a593Smuzhiyun u32 supportCrashDump:1; 1354*4882a593Smuzhiyun u32 supportMaxExtLDs:1; 1355*4882a593Smuzhiyun u32 supportT10RebuildAssist:1; 1356*4882a593Smuzhiyun u32 supportDisableImmediateIO:1; 1357*4882a593Smuzhiyun u32 supportThermalPollInterval:1; 1358*4882a593Smuzhiyun u32 supportPersonalityChange:2; 1359*4882a593Smuzhiyun #else 1360*4882a593Smuzhiyun u32 supportPersonalityChange:2; 1361*4882a593Smuzhiyun u32 supportThermalPollInterval:1; 1362*4882a593Smuzhiyun u32 supportDisableImmediateIO:1; 1363*4882a593Smuzhiyun u32 supportT10RebuildAssist:1; 1364*4882a593Smuzhiyun u32 supportMaxExtLDs:1; 1365*4882a593Smuzhiyun u32 supportCrashDump:1; 1366*4882a593Smuzhiyun u32 supportSwZone:1; 1367*4882a593Smuzhiyun u32 supportDebugQueue:1; 1368*4882a593Smuzhiyun u32 supportNVCacheErase:1; 1369*4882a593Smuzhiyun u32 supportForceTo512e:1; 1370*4882a593Smuzhiyun u32 supportHOQRebuild:1; 1371*4882a593Smuzhiyun u32 supportAllowedOpsforDrvRemoval:1; 1372*4882a593Smuzhiyun u32 supportDrvActivityLEDSetting:1; 1373*4882a593Smuzhiyun u32 supportNVDRAM:1; 1374*4882a593Smuzhiyun u32 supportForceFlash:1; 1375*4882a593Smuzhiyun u32 supportDisableSESMonitoring:1; 1376*4882a593Smuzhiyun u32 supportCacheBypassModes:1; 1377*4882a593Smuzhiyun u32 supportSecurityonJBOD:1; 1378*4882a593Smuzhiyun u32 discardCacheDuringLDDelete:1; 1379*4882a593Smuzhiyun u32 supportTTYLogCompression:1; 1380*4882a593Smuzhiyun u32 supportCPLDUpdate:1; 1381*4882a593Smuzhiyun u32 supportDiskCacheSettingForSysPDs:1; 1382*4882a593Smuzhiyun u32 supportExtendedSSCSize:1; 1383*4882a593Smuzhiyun u32 useSeqNumJbodFP:1; 1384*4882a593Smuzhiyun u32 reserved:7; 1385*4882a593Smuzhiyun #endif 1386*4882a593Smuzhiyun } adapterOperations3; 1387*4882a593Smuzhiyun 1388*4882a593Smuzhiyun struct { 1389*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1390*4882a593Smuzhiyun u8 reserved:7; 1391*4882a593Smuzhiyun /* Indicates whether the CPLD image is part of 1392*4882a593Smuzhiyun * the package and stored in flash 1393*4882a593Smuzhiyun */ 1394*4882a593Smuzhiyun u8 cpld_in_flash:1; 1395*4882a593Smuzhiyun #else 1396*4882a593Smuzhiyun u8 cpld_in_flash:1; 1397*4882a593Smuzhiyun u8 reserved:7; 1398*4882a593Smuzhiyun #endif 1399*4882a593Smuzhiyun u8 reserved1[3]; 1400*4882a593Smuzhiyun /* Null terminated string. Has the version 1401*4882a593Smuzhiyun * information if cpld_in_flash = FALSE 1402*4882a593Smuzhiyun */ 1403*4882a593Smuzhiyun u8 userCodeDefinition[12]; 1404*4882a593Smuzhiyun } cpld; /* Valid only if upgradableCPLD is TRUE */ 1405*4882a593Smuzhiyun 1406*4882a593Smuzhiyun struct { 1407*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1408*4882a593Smuzhiyun u16 reserved:2; 1409*4882a593Smuzhiyun u16 support_nvme_passthru:1; 1410*4882a593Smuzhiyun u16 support_pl_debug_info:1; 1411*4882a593Smuzhiyun u16 support_flash_comp_info:1; 1412*4882a593Smuzhiyun u16 support_host_info:1; 1413*4882a593Smuzhiyun u16 support_dual_fw_update:1; 1414*4882a593Smuzhiyun u16 support_ssc_rev3:1; 1415*4882a593Smuzhiyun u16 fw_swaps_bbu_vpd_info:1; 1416*4882a593Smuzhiyun u16 support_pd_map_target_id:1; 1417*4882a593Smuzhiyun u16 support_ses_ctrl_in_multipathcfg:1; 1418*4882a593Smuzhiyun u16 image_upload_supported:1; 1419*4882a593Smuzhiyun u16 support_encrypted_mfc:1; 1420*4882a593Smuzhiyun u16 supported_enc_algo:1; 1421*4882a593Smuzhiyun u16 support_ibutton_less:1; 1422*4882a593Smuzhiyun u16 ctrl_info_ext_supported:1; 1423*4882a593Smuzhiyun #else 1424*4882a593Smuzhiyun 1425*4882a593Smuzhiyun u16 ctrl_info_ext_supported:1; 1426*4882a593Smuzhiyun u16 support_ibutton_less:1; 1427*4882a593Smuzhiyun u16 supported_enc_algo:1; 1428*4882a593Smuzhiyun u16 support_encrypted_mfc:1; 1429*4882a593Smuzhiyun u16 image_upload_supported:1; 1430*4882a593Smuzhiyun /* FW supports LUN based association and target port based */ 1431*4882a593Smuzhiyun u16 support_ses_ctrl_in_multipathcfg:1; 1432*4882a593Smuzhiyun /* association for the SES device connected in multipath mode */ 1433*4882a593Smuzhiyun /* FW defines Jbod target Id within MR_PD_CFG_SEQ */ 1434*4882a593Smuzhiyun u16 support_pd_map_target_id:1; 1435*4882a593Smuzhiyun /* FW swaps relevant fields in MR_BBU_VPD_INFO_FIXED to 1436*4882a593Smuzhiyun * provide the data in little endian order 1437*4882a593Smuzhiyun */ 1438*4882a593Smuzhiyun u16 fw_swaps_bbu_vpd_info:1; 1439*4882a593Smuzhiyun u16 support_ssc_rev3:1; 1440*4882a593Smuzhiyun /* FW supports CacheCade 3.0, only one SSCD creation allowed */ 1441*4882a593Smuzhiyun u16 support_dual_fw_update:1; 1442*4882a593Smuzhiyun /* FW supports dual firmware update feature */ 1443*4882a593Smuzhiyun u16 support_host_info:1; 1444*4882a593Smuzhiyun /* FW supports MR_DCMD_CTRL_HOST_INFO_SET/GET */ 1445*4882a593Smuzhiyun u16 support_flash_comp_info:1; 1446*4882a593Smuzhiyun /* FW supports MR_DCMD_CTRL_FLASH_COMP_INFO_GET */ 1447*4882a593Smuzhiyun u16 support_pl_debug_info:1; 1448*4882a593Smuzhiyun /* FW supports retrieval of PL debug information through apps */ 1449*4882a593Smuzhiyun u16 support_nvme_passthru:1; 1450*4882a593Smuzhiyun /* FW supports NVMe passthru commands */ 1451*4882a593Smuzhiyun u16 reserved:2; 1452*4882a593Smuzhiyun #endif 1453*4882a593Smuzhiyun } adapter_operations4; 1454*4882a593Smuzhiyun u8 pad[0x800 - 0x7FE]; /* 0x7FE pad to 2K for expansion */ 1455*4882a593Smuzhiyun 1456*4882a593Smuzhiyun u32 size; 1457*4882a593Smuzhiyun u32 pad1; 1458*4882a593Smuzhiyun 1459*4882a593Smuzhiyun u8 reserved6[64]; 1460*4882a593Smuzhiyun 1461*4882a593Smuzhiyun struct { 1462*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1463*4882a593Smuzhiyun u32 reserved:19; 1464*4882a593Smuzhiyun u32 support_pci_lane_margining: 1; 1465*4882a593Smuzhiyun u32 support_psoc_update:1; 1466*4882a593Smuzhiyun u32 support_force_personality_change:1; 1467*4882a593Smuzhiyun u32 support_fde_type_mix:1; 1468*4882a593Smuzhiyun u32 support_snap_dump:1; 1469*4882a593Smuzhiyun u32 support_nvme_tm:1; 1470*4882a593Smuzhiyun u32 support_oce_only:1; 1471*4882a593Smuzhiyun u32 support_ext_mfg_vpd:1; 1472*4882a593Smuzhiyun u32 support_pcie:1; 1473*4882a593Smuzhiyun u32 support_cvhealth_info:1; 1474*4882a593Smuzhiyun u32 support_profile_change:2; 1475*4882a593Smuzhiyun u32 mr_config_ext2_supported:1; 1476*4882a593Smuzhiyun #else 1477*4882a593Smuzhiyun u32 mr_config_ext2_supported:1; 1478*4882a593Smuzhiyun u32 support_profile_change:2; 1479*4882a593Smuzhiyun u32 support_cvhealth_info:1; 1480*4882a593Smuzhiyun u32 support_pcie:1; 1481*4882a593Smuzhiyun u32 support_ext_mfg_vpd:1; 1482*4882a593Smuzhiyun u32 support_oce_only:1; 1483*4882a593Smuzhiyun u32 support_nvme_tm:1; 1484*4882a593Smuzhiyun u32 support_snap_dump:1; 1485*4882a593Smuzhiyun u32 support_fde_type_mix:1; 1486*4882a593Smuzhiyun u32 support_force_personality_change:1; 1487*4882a593Smuzhiyun u32 support_psoc_update:1; 1488*4882a593Smuzhiyun u32 support_pci_lane_margining: 1; 1489*4882a593Smuzhiyun u32 reserved:19; 1490*4882a593Smuzhiyun #endif 1491*4882a593Smuzhiyun } adapter_operations5; 1492*4882a593Smuzhiyun 1493*4882a593Smuzhiyun u32 rsvdForAdptOp[63]; 1494*4882a593Smuzhiyun 1495*4882a593Smuzhiyun u8 reserved7[3]; 1496*4882a593Smuzhiyun 1497*4882a593Smuzhiyun u8 TaskAbortTO; /* Timeout value in seconds used by Abort Task TM */ 1498*4882a593Smuzhiyun u8 MaxResetTO; /* Max Supported Reset timeout in seconds. */ 1499*4882a593Smuzhiyun u8 reserved8[3]; 1500*4882a593Smuzhiyun } __packed; 1501*4882a593Smuzhiyun 1502*4882a593Smuzhiyun /* 1503*4882a593Smuzhiyun * =============================== 1504*4882a593Smuzhiyun * MegaRAID SAS driver definitions 1505*4882a593Smuzhiyun * =============================== 1506*4882a593Smuzhiyun */ 1507*4882a593Smuzhiyun #define MEGASAS_MAX_PD_CHANNELS 2 1508*4882a593Smuzhiyun #define MEGASAS_MAX_LD_CHANNELS 2 1509*4882a593Smuzhiyun #define MEGASAS_MAX_CHANNELS (MEGASAS_MAX_PD_CHANNELS + \ 1510*4882a593Smuzhiyun MEGASAS_MAX_LD_CHANNELS) 1511*4882a593Smuzhiyun #define MEGASAS_MAX_DEV_PER_CHANNEL 128 1512*4882a593Smuzhiyun #define MEGASAS_DEFAULT_INIT_ID -1 1513*4882a593Smuzhiyun #define MEGASAS_MAX_LUN 8 1514*4882a593Smuzhiyun #define MEGASAS_DEFAULT_CMD_PER_LUN 256 1515*4882a593Smuzhiyun #define MEGASAS_MAX_PD (MEGASAS_MAX_PD_CHANNELS * \ 1516*4882a593Smuzhiyun MEGASAS_MAX_DEV_PER_CHANNEL) 1517*4882a593Smuzhiyun #define MEGASAS_MAX_LD_IDS (MEGASAS_MAX_LD_CHANNELS * \ 1518*4882a593Smuzhiyun MEGASAS_MAX_DEV_PER_CHANNEL) 1519*4882a593Smuzhiyun 1520*4882a593Smuzhiyun #define MEGASAS_MAX_SECTORS (2*1024) 1521*4882a593Smuzhiyun #define MEGASAS_MAX_SECTORS_IEEE (2*128) 1522*4882a593Smuzhiyun #define MEGASAS_DBG_LVL 1 1523*4882a593Smuzhiyun 1524*4882a593Smuzhiyun #define MEGASAS_FW_BUSY 1 1525*4882a593Smuzhiyun 1526*4882a593Smuzhiyun /* Driver's internal Logging levels*/ 1527*4882a593Smuzhiyun #define OCR_DEBUG (1 << 0) 1528*4882a593Smuzhiyun #define TM_DEBUG (1 << 1) 1529*4882a593Smuzhiyun #define LD_PD_DEBUG (1 << 2) 1530*4882a593Smuzhiyun 1531*4882a593Smuzhiyun #define SCAN_PD_CHANNEL 0x1 1532*4882a593Smuzhiyun #define SCAN_VD_CHANNEL 0x2 1533*4882a593Smuzhiyun 1534*4882a593Smuzhiyun #define MEGASAS_KDUMP_QUEUE_DEPTH 100 1535*4882a593Smuzhiyun #define MR_LARGE_IO_MIN_SIZE (32 * 1024) 1536*4882a593Smuzhiyun #define MR_R1_LDIO_PIGGYBACK_DEFAULT 4 1537*4882a593Smuzhiyun 1538*4882a593Smuzhiyun enum MR_SCSI_CMD_TYPE { 1539*4882a593Smuzhiyun READ_WRITE_LDIO = 0, 1540*4882a593Smuzhiyun NON_READ_WRITE_LDIO = 1, 1541*4882a593Smuzhiyun READ_WRITE_SYSPDIO = 2, 1542*4882a593Smuzhiyun NON_READ_WRITE_SYSPDIO = 3, 1543*4882a593Smuzhiyun }; 1544*4882a593Smuzhiyun 1545*4882a593Smuzhiyun enum DCMD_TIMEOUT_ACTION { 1546*4882a593Smuzhiyun INITIATE_OCR = 0, 1547*4882a593Smuzhiyun KILL_ADAPTER = 1, 1548*4882a593Smuzhiyun IGNORE_TIMEOUT = 2, 1549*4882a593Smuzhiyun }; 1550*4882a593Smuzhiyun 1551*4882a593Smuzhiyun enum FW_BOOT_CONTEXT { 1552*4882a593Smuzhiyun PROBE_CONTEXT = 0, 1553*4882a593Smuzhiyun OCR_CONTEXT = 1, 1554*4882a593Smuzhiyun }; 1555*4882a593Smuzhiyun 1556*4882a593Smuzhiyun /* Frame Type */ 1557*4882a593Smuzhiyun #define IO_FRAME 0 1558*4882a593Smuzhiyun #define PTHRU_FRAME 1 1559*4882a593Smuzhiyun 1560*4882a593Smuzhiyun /* 1561*4882a593Smuzhiyun * When SCSI mid-layer calls driver's reset routine, driver waits for 1562*4882a593Smuzhiyun * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note 1563*4882a593Smuzhiyun * that the driver cannot _actually_ abort or reset pending commands. While 1564*4882a593Smuzhiyun * it is waiting for the commands to complete, it prints a diagnostic message 1565*4882a593Smuzhiyun * every MEGASAS_RESET_NOTICE_INTERVAL seconds 1566*4882a593Smuzhiyun */ 1567*4882a593Smuzhiyun #define MEGASAS_RESET_WAIT_TIME 180 1568*4882a593Smuzhiyun #define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 1569*4882a593Smuzhiyun #define MEGASAS_RESET_NOTICE_INTERVAL 5 1570*4882a593Smuzhiyun #define MEGASAS_IOCTL_CMD 0 1571*4882a593Smuzhiyun #define MEGASAS_DEFAULT_CMD_TIMEOUT 90 1572*4882a593Smuzhiyun #define MEGASAS_THROTTLE_QUEUE_DEPTH 16 1573*4882a593Smuzhiyun #define MEGASAS_DEFAULT_TM_TIMEOUT 50 1574*4882a593Smuzhiyun /* 1575*4882a593Smuzhiyun * FW reports the maximum of number of commands that it can accept (maximum 1576*4882a593Smuzhiyun * commands that can be outstanding) at any time. The driver must report a 1577*4882a593Smuzhiyun * lower number to the mid layer because it can issue a few internal commands 1578*4882a593Smuzhiyun * itself (E.g, AEN, abort cmd, IOCTLs etc). The number of commands it needs 1579*4882a593Smuzhiyun * is shown below 1580*4882a593Smuzhiyun */ 1581*4882a593Smuzhiyun #define MEGASAS_INT_CMDS 32 1582*4882a593Smuzhiyun #define MEGASAS_SKINNY_INT_CMDS 5 1583*4882a593Smuzhiyun #define MEGASAS_FUSION_INTERNAL_CMDS 8 1584*4882a593Smuzhiyun #define MEGASAS_FUSION_IOCTL_CMDS 3 1585*4882a593Smuzhiyun #define MEGASAS_MFI_IOCTL_CMDS 27 1586*4882a593Smuzhiyun 1587*4882a593Smuzhiyun #define MEGASAS_MAX_MSIX_QUEUES 128 1588*4882a593Smuzhiyun /* 1589*4882a593Smuzhiyun * FW can accept both 32 and 64 bit SGLs. We want to allocate 32/64 bit 1590*4882a593Smuzhiyun * SGLs based on the size of dma_addr_t 1591*4882a593Smuzhiyun */ 1592*4882a593Smuzhiyun #define IS_DMA64 (sizeof(dma_addr_t) == 8) 1593*4882a593Smuzhiyun 1594*4882a593Smuzhiyun #define MFI_XSCALE_OMR0_CHANGE_INTERRUPT 0x00000001 1595*4882a593Smuzhiyun 1596*4882a593Smuzhiyun #define MFI_INTR_FLAG_REPLY_MESSAGE 0x00000001 1597*4882a593Smuzhiyun #define MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE 0x00000002 1598*4882a593Smuzhiyun #define MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT 0x00000004 1599*4882a593Smuzhiyun 1600*4882a593Smuzhiyun #define MFI_OB_INTR_STATUS_MASK 0x00000002 1601*4882a593Smuzhiyun #define MFI_POLL_TIMEOUT_SECS 60 1602*4882a593Smuzhiyun #define MFI_IO_TIMEOUT_SECS 180 1603*4882a593Smuzhiyun #define MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF (5 * HZ) 1604*4882a593Smuzhiyun #define MEGASAS_OCR_SETTLE_TIME_VF (1000 * 30) 1605*4882a593Smuzhiyun #define MEGASAS_SRIOV_MAX_RESET_TRIES_VF 1 1606*4882a593Smuzhiyun #define MEGASAS_ROUTINE_WAIT_TIME_VF 300 1607*4882a593Smuzhiyun #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 1608*4882a593Smuzhiyun #define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001 1609*4882a593Smuzhiyun #define MFI_GEN2_ENABLE_INTERRUPT_MASK (0x00000001 | 0x00000004) 1610*4882a593Smuzhiyun #define MFI_REPLY_SKINNY_MESSAGE_INTERRUPT 0x40000000 1611*4882a593Smuzhiyun #define MFI_SKINNY_ENABLE_INTERRUPT_MASK (0x00000001) 1612*4882a593Smuzhiyun 1613*4882a593Smuzhiyun #define MFI_1068_PCSR_OFFSET 0x84 1614*4882a593Smuzhiyun #define MFI_1068_FW_HANDSHAKE_OFFSET 0x64 1615*4882a593Smuzhiyun #define MFI_1068_FW_READY 0xDDDD0000 1616*4882a593Smuzhiyun 1617*4882a593Smuzhiyun #define MR_MAX_REPLY_QUEUES_OFFSET 0X0000001F 1618*4882a593Smuzhiyun #define MR_MAX_REPLY_QUEUES_EXT_OFFSET 0X003FC000 1619*4882a593Smuzhiyun #define MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT 14 1620*4882a593Smuzhiyun #define MR_MAX_MSIX_REG_ARRAY 16 1621*4882a593Smuzhiyun #define MR_RDPQ_MODE_OFFSET 0X00800000 1622*4882a593Smuzhiyun 1623*4882a593Smuzhiyun #define MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT 16 1624*4882a593Smuzhiyun #define MR_MAX_RAID_MAP_SIZE_MASK 0x1FF 1625*4882a593Smuzhiyun #define MR_MIN_MAP_SIZE 0x10000 1626*4882a593Smuzhiyun /* 64k */ 1627*4882a593Smuzhiyun 1628*4882a593Smuzhiyun #define MR_CAN_HANDLE_SYNC_CACHE_OFFSET 0X01000000 1629*4882a593Smuzhiyun 1630*4882a593Smuzhiyun #define MR_ATOMIC_DESCRIPTOR_SUPPORT_OFFSET (1 << 24) 1631*4882a593Smuzhiyun 1632*4882a593Smuzhiyun #define MR_CAN_HANDLE_64_BIT_DMA_OFFSET (1 << 25) 1633*4882a593Smuzhiyun #define MR_INTR_COALESCING_SUPPORT_OFFSET (1 << 26) 1634*4882a593Smuzhiyun 1635*4882a593Smuzhiyun #define MEGASAS_WATCHDOG_THREAD_INTERVAL 1000 1636*4882a593Smuzhiyun #define MEGASAS_WAIT_FOR_NEXT_DMA_MSECS 20 1637*4882a593Smuzhiyun #define MEGASAS_WATCHDOG_WAIT_COUNT 50 1638*4882a593Smuzhiyun 1639*4882a593Smuzhiyun enum MR_ADAPTER_TYPE { 1640*4882a593Smuzhiyun MFI_SERIES = 1, 1641*4882a593Smuzhiyun THUNDERBOLT_SERIES = 2, 1642*4882a593Smuzhiyun INVADER_SERIES = 3, 1643*4882a593Smuzhiyun VENTURA_SERIES = 4, 1644*4882a593Smuzhiyun AERO_SERIES = 5, 1645*4882a593Smuzhiyun }; 1646*4882a593Smuzhiyun 1647*4882a593Smuzhiyun /* 1648*4882a593Smuzhiyun * register set for both 1068 and 1078 controllers 1649*4882a593Smuzhiyun * structure extended for 1078 registers 1650*4882a593Smuzhiyun */ 1651*4882a593Smuzhiyun 1652*4882a593Smuzhiyun struct megasas_register_set { 1653*4882a593Smuzhiyun u32 doorbell; /*0000h*/ 1654*4882a593Smuzhiyun u32 fusion_seq_offset; /*0004h*/ 1655*4882a593Smuzhiyun u32 fusion_host_diag; /*0008h*/ 1656*4882a593Smuzhiyun u32 reserved_01; /*000Ch*/ 1657*4882a593Smuzhiyun 1658*4882a593Smuzhiyun u32 inbound_msg_0; /*0010h*/ 1659*4882a593Smuzhiyun u32 inbound_msg_1; /*0014h*/ 1660*4882a593Smuzhiyun u32 outbound_msg_0; /*0018h*/ 1661*4882a593Smuzhiyun u32 outbound_msg_1; /*001Ch*/ 1662*4882a593Smuzhiyun 1663*4882a593Smuzhiyun u32 inbound_doorbell; /*0020h*/ 1664*4882a593Smuzhiyun u32 inbound_intr_status; /*0024h*/ 1665*4882a593Smuzhiyun u32 inbound_intr_mask; /*0028h*/ 1666*4882a593Smuzhiyun 1667*4882a593Smuzhiyun u32 outbound_doorbell; /*002Ch*/ 1668*4882a593Smuzhiyun u32 outbound_intr_status; /*0030h*/ 1669*4882a593Smuzhiyun u32 outbound_intr_mask; /*0034h*/ 1670*4882a593Smuzhiyun 1671*4882a593Smuzhiyun u32 reserved_1[2]; /*0038h*/ 1672*4882a593Smuzhiyun 1673*4882a593Smuzhiyun u32 inbound_queue_port; /*0040h*/ 1674*4882a593Smuzhiyun u32 outbound_queue_port; /*0044h*/ 1675*4882a593Smuzhiyun 1676*4882a593Smuzhiyun u32 reserved_2[9]; /*0048h*/ 1677*4882a593Smuzhiyun u32 reply_post_host_index; /*006Ch*/ 1678*4882a593Smuzhiyun u32 reserved_2_2[12]; /*0070h*/ 1679*4882a593Smuzhiyun 1680*4882a593Smuzhiyun u32 outbound_doorbell_clear; /*00A0h*/ 1681*4882a593Smuzhiyun 1682*4882a593Smuzhiyun u32 reserved_3[3]; /*00A4h*/ 1683*4882a593Smuzhiyun 1684*4882a593Smuzhiyun u32 outbound_scratch_pad_0; /*00B0h*/ 1685*4882a593Smuzhiyun u32 outbound_scratch_pad_1; /*00B4h*/ 1686*4882a593Smuzhiyun u32 outbound_scratch_pad_2; /*00B8h*/ 1687*4882a593Smuzhiyun u32 outbound_scratch_pad_3; /*00BCh*/ 1688*4882a593Smuzhiyun 1689*4882a593Smuzhiyun u32 inbound_low_queue_port ; /*00C0h*/ 1690*4882a593Smuzhiyun 1691*4882a593Smuzhiyun u32 inbound_high_queue_port ; /*00C4h*/ 1692*4882a593Smuzhiyun 1693*4882a593Smuzhiyun u32 inbound_single_queue_port; /*00C8h*/ 1694*4882a593Smuzhiyun u32 res_6[11]; /*CCh*/ 1695*4882a593Smuzhiyun u32 host_diag; 1696*4882a593Smuzhiyun u32 seq_offset; 1697*4882a593Smuzhiyun u32 index_registers[807]; /*00CCh*/ 1698*4882a593Smuzhiyun } __attribute__ ((packed)); 1699*4882a593Smuzhiyun 1700*4882a593Smuzhiyun struct megasas_sge32 { 1701*4882a593Smuzhiyun 1702*4882a593Smuzhiyun __le32 phys_addr; 1703*4882a593Smuzhiyun __le32 length; 1704*4882a593Smuzhiyun 1705*4882a593Smuzhiyun } __attribute__ ((packed)); 1706*4882a593Smuzhiyun 1707*4882a593Smuzhiyun struct megasas_sge64 { 1708*4882a593Smuzhiyun 1709*4882a593Smuzhiyun __le64 phys_addr; 1710*4882a593Smuzhiyun __le32 length; 1711*4882a593Smuzhiyun 1712*4882a593Smuzhiyun } __attribute__ ((packed)); 1713*4882a593Smuzhiyun 1714*4882a593Smuzhiyun struct megasas_sge_skinny { 1715*4882a593Smuzhiyun __le64 phys_addr; 1716*4882a593Smuzhiyun __le32 length; 1717*4882a593Smuzhiyun __le32 flag; 1718*4882a593Smuzhiyun } __packed; 1719*4882a593Smuzhiyun 1720*4882a593Smuzhiyun union megasas_sgl { 1721*4882a593Smuzhiyun 1722*4882a593Smuzhiyun struct megasas_sge32 sge32[1]; 1723*4882a593Smuzhiyun struct megasas_sge64 sge64[1]; 1724*4882a593Smuzhiyun struct megasas_sge_skinny sge_skinny[1]; 1725*4882a593Smuzhiyun 1726*4882a593Smuzhiyun } __attribute__ ((packed)); 1727*4882a593Smuzhiyun 1728*4882a593Smuzhiyun struct megasas_header { 1729*4882a593Smuzhiyun 1730*4882a593Smuzhiyun u8 cmd; /*00h */ 1731*4882a593Smuzhiyun u8 sense_len; /*01h */ 1732*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1733*4882a593Smuzhiyun u8 scsi_status; /*03h */ 1734*4882a593Smuzhiyun 1735*4882a593Smuzhiyun u8 target_id; /*04h */ 1736*4882a593Smuzhiyun u8 lun; /*05h */ 1737*4882a593Smuzhiyun u8 cdb_len; /*06h */ 1738*4882a593Smuzhiyun u8 sge_count; /*07h */ 1739*4882a593Smuzhiyun 1740*4882a593Smuzhiyun __le32 context; /*08h */ 1741*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1742*4882a593Smuzhiyun 1743*4882a593Smuzhiyun __le16 flags; /*10h */ 1744*4882a593Smuzhiyun __le16 timeout; /*12h */ 1745*4882a593Smuzhiyun __le32 data_xferlen; /*14h */ 1746*4882a593Smuzhiyun 1747*4882a593Smuzhiyun } __attribute__ ((packed)); 1748*4882a593Smuzhiyun 1749*4882a593Smuzhiyun union megasas_sgl_frame { 1750*4882a593Smuzhiyun 1751*4882a593Smuzhiyun struct megasas_sge32 sge32[8]; 1752*4882a593Smuzhiyun struct megasas_sge64 sge64[5]; 1753*4882a593Smuzhiyun 1754*4882a593Smuzhiyun } __attribute__ ((packed)); 1755*4882a593Smuzhiyun 1756*4882a593Smuzhiyun typedef union _MFI_CAPABILITIES { 1757*4882a593Smuzhiyun struct { 1758*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 1759*4882a593Smuzhiyun u32 reserved:16; 1760*4882a593Smuzhiyun u32 support_fw_exposed_dev_list:1; 1761*4882a593Smuzhiyun u32 support_nvme_passthru:1; 1762*4882a593Smuzhiyun u32 support_64bit_mode:1; 1763*4882a593Smuzhiyun u32 support_pd_map_target_id:1; 1764*4882a593Smuzhiyun u32 support_qd_throttling:1; 1765*4882a593Smuzhiyun u32 support_fp_rlbypass:1; 1766*4882a593Smuzhiyun u32 support_vfid_in_ioframe:1; 1767*4882a593Smuzhiyun u32 support_ext_io_size:1; 1768*4882a593Smuzhiyun u32 support_ext_queue_depth:1; 1769*4882a593Smuzhiyun u32 security_protocol_cmds_fw:1; 1770*4882a593Smuzhiyun u32 support_core_affinity:1; 1771*4882a593Smuzhiyun u32 support_ndrive_r1_lb:1; 1772*4882a593Smuzhiyun u32 support_max_255lds:1; 1773*4882a593Smuzhiyun u32 support_fastpath_wb:1; 1774*4882a593Smuzhiyun u32 support_additional_msix:1; 1775*4882a593Smuzhiyun u32 support_fp_remote_lun:1; 1776*4882a593Smuzhiyun #else 1777*4882a593Smuzhiyun u32 support_fp_remote_lun:1; 1778*4882a593Smuzhiyun u32 support_additional_msix:1; 1779*4882a593Smuzhiyun u32 support_fastpath_wb:1; 1780*4882a593Smuzhiyun u32 support_max_255lds:1; 1781*4882a593Smuzhiyun u32 support_ndrive_r1_lb:1; 1782*4882a593Smuzhiyun u32 support_core_affinity:1; 1783*4882a593Smuzhiyun u32 security_protocol_cmds_fw:1; 1784*4882a593Smuzhiyun u32 support_ext_queue_depth:1; 1785*4882a593Smuzhiyun u32 support_ext_io_size:1; 1786*4882a593Smuzhiyun u32 support_vfid_in_ioframe:1; 1787*4882a593Smuzhiyun u32 support_fp_rlbypass:1; 1788*4882a593Smuzhiyun u32 support_qd_throttling:1; 1789*4882a593Smuzhiyun u32 support_pd_map_target_id:1; 1790*4882a593Smuzhiyun u32 support_64bit_mode:1; 1791*4882a593Smuzhiyun u32 support_nvme_passthru:1; 1792*4882a593Smuzhiyun u32 support_fw_exposed_dev_list:1; 1793*4882a593Smuzhiyun u32 reserved:16; 1794*4882a593Smuzhiyun #endif 1795*4882a593Smuzhiyun } mfi_capabilities; 1796*4882a593Smuzhiyun __le32 reg; 1797*4882a593Smuzhiyun } MFI_CAPABILITIES; 1798*4882a593Smuzhiyun 1799*4882a593Smuzhiyun struct megasas_init_frame { 1800*4882a593Smuzhiyun 1801*4882a593Smuzhiyun u8 cmd; /*00h */ 1802*4882a593Smuzhiyun u8 reserved_0; /*01h */ 1803*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1804*4882a593Smuzhiyun 1805*4882a593Smuzhiyun u8 reserved_1; /*03h */ 1806*4882a593Smuzhiyun MFI_CAPABILITIES driver_operations; /*04h*/ 1807*4882a593Smuzhiyun 1808*4882a593Smuzhiyun __le32 context; /*08h */ 1809*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1810*4882a593Smuzhiyun 1811*4882a593Smuzhiyun __le16 flags; /*10h */ 1812*4882a593Smuzhiyun __le16 replyqueue_mask; /*12h */ 1813*4882a593Smuzhiyun __le32 data_xfer_len; /*14h */ 1814*4882a593Smuzhiyun 1815*4882a593Smuzhiyun __le32 queue_info_new_phys_addr_lo; /*18h */ 1816*4882a593Smuzhiyun __le32 queue_info_new_phys_addr_hi; /*1Ch */ 1817*4882a593Smuzhiyun __le32 queue_info_old_phys_addr_lo; /*20h */ 1818*4882a593Smuzhiyun __le32 queue_info_old_phys_addr_hi; /*24h */ 1819*4882a593Smuzhiyun __le32 reserved_4[2]; /*28h */ 1820*4882a593Smuzhiyun __le32 system_info_lo; /*30h */ 1821*4882a593Smuzhiyun __le32 system_info_hi; /*34h */ 1822*4882a593Smuzhiyun __le32 reserved_5[2]; /*38h */ 1823*4882a593Smuzhiyun 1824*4882a593Smuzhiyun } __attribute__ ((packed)); 1825*4882a593Smuzhiyun 1826*4882a593Smuzhiyun struct megasas_init_queue_info { 1827*4882a593Smuzhiyun 1828*4882a593Smuzhiyun __le32 init_flags; /*00h */ 1829*4882a593Smuzhiyun __le32 reply_queue_entries; /*04h */ 1830*4882a593Smuzhiyun 1831*4882a593Smuzhiyun __le32 reply_queue_start_phys_addr_lo; /*08h */ 1832*4882a593Smuzhiyun __le32 reply_queue_start_phys_addr_hi; /*0Ch */ 1833*4882a593Smuzhiyun __le32 producer_index_phys_addr_lo; /*10h */ 1834*4882a593Smuzhiyun __le32 producer_index_phys_addr_hi; /*14h */ 1835*4882a593Smuzhiyun __le32 consumer_index_phys_addr_lo; /*18h */ 1836*4882a593Smuzhiyun __le32 consumer_index_phys_addr_hi; /*1Ch */ 1837*4882a593Smuzhiyun 1838*4882a593Smuzhiyun } __attribute__ ((packed)); 1839*4882a593Smuzhiyun 1840*4882a593Smuzhiyun struct megasas_io_frame { 1841*4882a593Smuzhiyun 1842*4882a593Smuzhiyun u8 cmd; /*00h */ 1843*4882a593Smuzhiyun u8 sense_len; /*01h */ 1844*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1845*4882a593Smuzhiyun u8 scsi_status; /*03h */ 1846*4882a593Smuzhiyun 1847*4882a593Smuzhiyun u8 target_id; /*04h */ 1848*4882a593Smuzhiyun u8 access_byte; /*05h */ 1849*4882a593Smuzhiyun u8 reserved_0; /*06h */ 1850*4882a593Smuzhiyun u8 sge_count; /*07h */ 1851*4882a593Smuzhiyun 1852*4882a593Smuzhiyun __le32 context; /*08h */ 1853*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1854*4882a593Smuzhiyun 1855*4882a593Smuzhiyun __le16 flags; /*10h */ 1856*4882a593Smuzhiyun __le16 timeout; /*12h */ 1857*4882a593Smuzhiyun __le32 lba_count; /*14h */ 1858*4882a593Smuzhiyun 1859*4882a593Smuzhiyun __le32 sense_buf_phys_addr_lo; /*18h */ 1860*4882a593Smuzhiyun __le32 sense_buf_phys_addr_hi; /*1Ch */ 1861*4882a593Smuzhiyun 1862*4882a593Smuzhiyun __le32 start_lba_lo; /*20h */ 1863*4882a593Smuzhiyun __le32 start_lba_hi; /*24h */ 1864*4882a593Smuzhiyun 1865*4882a593Smuzhiyun union megasas_sgl sgl; /*28h */ 1866*4882a593Smuzhiyun 1867*4882a593Smuzhiyun } __attribute__ ((packed)); 1868*4882a593Smuzhiyun 1869*4882a593Smuzhiyun struct megasas_pthru_frame { 1870*4882a593Smuzhiyun 1871*4882a593Smuzhiyun u8 cmd; /*00h */ 1872*4882a593Smuzhiyun u8 sense_len; /*01h */ 1873*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1874*4882a593Smuzhiyun u8 scsi_status; /*03h */ 1875*4882a593Smuzhiyun 1876*4882a593Smuzhiyun u8 target_id; /*04h */ 1877*4882a593Smuzhiyun u8 lun; /*05h */ 1878*4882a593Smuzhiyun u8 cdb_len; /*06h */ 1879*4882a593Smuzhiyun u8 sge_count; /*07h */ 1880*4882a593Smuzhiyun 1881*4882a593Smuzhiyun __le32 context; /*08h */ 1882*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1883*4882a593Smuzhiyun 1884*4882a593Smuzhiyun __le16 flags; /*10h */ 1885*4882a593Smuzhiyun __le16 timeout; /*12h */ 1886*4882a593Smuzhiyun __le32 data_xfer_len; /*14h */ 1887*4882a593Smuzhiyun 1888*4882a593Smuzhiyun __le32 sense_buf_phys_addr_lo; /*18h */ 1889*4882a593Smuzhiyun __le32 sense_buf_phys_addr_hi; /*1Ch */ 1890*4882a593Smuzhiyun 1891*4882a593Smuzhiyun u8 cdb[16]; /*20h */ 1892*4882a593Smuzhiyun union megasas_sgl sgl; /*30h */ 1893*4882a593Smuzhiyun 1894*4882a593Smuzhiyun } __attribute__ ((packed)); 1895*4882a593Smuzhiyun 1896*4882a593Smuzhiyun struct megasas_dcmd_frame { 1897*4882a593Smuzhiyun 1898*4882a593Smuzhiyun u8 cmd; /*00h */ 1899*4882a593Smuzhiyun u8 reserved_0; /*01h */ 1900*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1901*4882a593Smuzhiyun u8 reserved_1[4]; /*03h */ 1902*4882a593Smuzhiyun u8 sge_count; /*07h */ 1903*4882a593Smuzhiyun 1904*4882a593Smuzhiyun __le32 context; /*08h */ 1905*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1906*4882a593Smuzhiyun 1907*4882a593Smuzhiyun __le16 flags; /*10h */ 1908*4882a593Smuzhiyun __le16 timeout; /*12h */ 1909*4882a593Smuzhiyun 1910*4882a593Smuzhiyun __le32 data_xfer_len; /*14h */ 1911*4882a593Smuzhiyun __le32 opcode; /*18h */ 1912*4882a593Smuzhiyun 1913*4882a593Smuzhiyun union { /*1Ch */ 1914*4882a593Smuzhiyun u8 b[12]; 1915*4882a593Smuzhiyun __le16 s[6]; 1916*4882a593Smuzhiyun __le32 w[3]; 1917*4882a593Smuzhiyun } mbox; 1918*4882a593Smuzhiyun 1919*4882a593Smuzhiyun union megasas_sgl sgl; /*28h */ 1920*4882a593Smuzhiyun 1921*4882a593Smuzhiyun } __attribute__ ((packed)); 1922*4882a593Smuzhiyun 1923*4882a593Smuzhiyun struct megasas_abort_frame { 1924*4882a593Smuzhiyun 1925*4882a593Smuzhiyun u8 cmd; /*00h */ 1926*4882a593Smuzhiyun u8 reserved_0; /*01h */ 1927*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1928*4882a593Smuzhiyun 1929*4882a593Smuzhiyun u8 reserved_1; /*03h */ 1930*4882a593Smuzhiyun __le32 reserved_2; /*04h */ 1931*4882a593Smuzhiyun 1932*4882a593Smuzhiyun __le32 context; /*08h */ 1933*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1934*4882a593Smuzhiyun 1935*4882a593Smuzhiyun __le16 flags; /*10h */ 1936*4882a593Smuzhiyun __le16 reserved_3; /*12h */ 1937*4882a593Smuzhiyun __le32 reserved_4; /*14h */ 1938*4882a593Smuzhiyun 1939*4882a593Smuzhiyun __le32 abort_context; /*18h */ 1940*4882a593Smuzhiyun __le32 pad_1; /*1Ch */ 1941*4882a593Smuzhiyun 1942*4882a593Smuzhiyun __le32 abort_mfi_phys_addr_lo; /*20h */ 1943*4882a593Smuzhiyun __le32 abort_mfi_phys_addr_hi; /*24h */ 1944*4882a593Smuzhiyun 1945*4882a593Smuzhiyun __le32 reserved_5[6]; /*28h */ 1946*4882a593Smuzhiyun 1947*4882a593Smuzhiyun } __attribute__ ((packed)); 1948*4882a593Smuzhiyun 1949*4882a593Smuzhiyun struct megasas_smp_frame { 1950*4882a593Smuzhiyun 1951*4882a593Smuzhiyun u8 cmd; /*00h */ 1952*4882a593Smuzhiyun u8 reserved_1; /*01h */ 1953*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1954*4882a593Smuzhiyun u8 connection_status; /*03h */ 1955*4882a593Smuzhiyun 1956*4882a593Smuzhiyun u8 reserved_2[3]; /*04h */ 1957*4882a593Smuzhiyun u8 sge_count; /*07h */ 1958*4882a593Smuzhiyun 1959*4882a593Smuzhiyun __le32 context; /*08h */ 1960*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1961*4882a593Smuzhiyun 1962*4882a593Smuzhiyun __le16 flags; /*10h */ 1963*4882a593Smuzhiyun __le16 timeout; /*12h */ 1964*4882a593Smuzhiyun 1965*4882a593Smuzhiyun __le32 data_xfer_len; /*14h */ 1966*4882a593Smuzhiyun __le64 sas_addr; /*18h */ 1967*4882a593Smuzhiyun 1968*4882a593Smuzhiyun union { 1969*4882a593Smuzhiyun struct megasas_sge32 sge32[2]; /* [0]: resp [1]: req */ 1970*4882a593Smuzhiyun struct megasas_sge64 sge64[2]; /* [0]: resp [1]: req */ 1971*4882a593Smuzhiyun } sgl; 1972*4882a593Smuzhiyun 1973*4882a593Smuzhiyun } __attribute__ ((packed)); 1974*4882a593Smuzhiyun 1975*4882a593Smuzhiyun struct megasas_stp_frame { 1976*4882a593Smuzhiyun 1977*4882a593Smuzhiyun u8 cmd; /*00h */ 1978*4882a593Smuzhiyun u8 reserved_1; /*01h */ 1979*4882a593Smuzhiyun u8 cmd_status; /*02h */ 1980*4882a593Smuzhiyun u8 reserved_2; /*03h */ 1981*4882a593Smuzhiyun 1982*4882a593Smuzhiyun u8 target_id; /*04h */ 1983*4882a593Smuzhiyun u8 reserved_3[2]; /*05h */ 1984*4882a593Smuzhiyun u8 sge_count; /*07h */ 1985*4882a593Smuzhiyun 1986*4882a593Smuzhiyun __le32 context; /*08h */ 1987*4882a593Smuzhiyun __le32 pad_0; /*0Ch */ 1988*4882a593Smuzhiyun 1989*4882a593Smuzhiyun __le16 flags; /*10h */ 1990*4882a593Smuzhiyun __le16 timeout; /*12h */ 1991*4882a593Smuzhiyun 1992*4882a593Smuzhiyun __le32 data_xfer_len; /*14h */ 1993*4882a593Smuzhiyun 1994*4882a593Smuzhiyun __le16 fis[10]; /*18h */ 1995*4882a593Smuzhiyun __le32 stp_flags; 1996*4882a593Smuzhiyun 1997*4882a593Smuzhiyun union { 1998*4882a593Smuzhiyun struct megasas_sge32 sge32[2]; /* [0]: resp [1]: data */ 1999*4882a593Smuzhiyun struct megasas_sge64 sge64[2]; /* [0]: resp [1]: data */ 2000*4882a593Smuzhiyun } sgl; 2001*4882a593Smuzhiyun 2002*4882a593Smuzhiyun } __attribute__ ((packed)); 2003*4882a593Smuzhiyun 2004*4882a593Smuzhiyun union megasas_frame { 2005*4882a593Smuzhiyun 2006*4882a593Smuzhiyun struct megasas_header hdr; 2007*4882a593Smuzhiyun struct megasas_init_frame init; 2008*4882a593Smuzhiyun struct megasas_io_frame io; 2009*4882a593Smuzhiyun struct megasas_pthru_frame pthru; 2010*4882a593Smuzhiyun struct megasas_dcmd_frame dcmd; 2011*4882a593Smuzhiyun struct megasas_abort_frame abort; 2012*4882a593Smuzhiyun struct megasas_smp_frame smp; 2013*4882a593Smuzhiyun struct megasas_stp_frame stp; 2014*4882a593Smuzhiyun 2015*4882a593Smuzhiyun u8 raw_bytes[64]; 2016*4882a593Smuzhiyun }; 2017*4882a593Smuzhiyun 2018*4882a593Smuzhiyun /** 2019*4882a593Smuzhiyun * struct MR_PRIV_DEVICE - sdev private hostdata 2020*4882a593Smuzhiyun * @is_tm_capable: firmware managed tm_capable flag 2021*4882a593Smuzhiyun * @tm_busy: TM request is in progress 2022*4882a593Smuzhiyun */ 2023*4882a593Smuzhiyun struct MR_PRIV_DEVICE { 2024*4882a593Smuzhiyun bool is_tm_capable; 2025*4882a593Smuzhiyun bool tm_busy; 2026*4882a593Smuzhiyun atomic_t r1_ldio_hint; 2027*4882a593Smuzhiyun u8 interface_type; 2028*4882a593Smuzhiyun u8 task_abort_tmo; 2029*4882a593Smuzhiyun u8 target_reset_tmo; 2030*4882a593Smuzhiyun }; 2031*4882a593Smuzhiyun struct megasas_cmd; 2032*4882a593Smuzhiyun 2033*4882a593Smuzhiyun union megasas_evt_class_locale { 2034*4882a593Smuzhiyun 2035*4882a593Smuzhiyun struct { 2036*4882a593Smuzhiyun #ifndef __BIG_ENDIAN_BITFIELD 2037*4882a593Smuzhiyun u16 locale; 2038*4882a593Smuzhiyun u8 reserved; 2039*4882a593Smuzhiyun s8 class; 2040*4882a593Smuzhiyun #else 2041*4882a593Smuzhiyun s8 class; 2042*4882a593Smuzhiyun u8 reserved; 2043*4882a593Smuzhiyun u16 locale; 2044*4882a593Smuzhiyun #endif 2045*4882a593Smuzhiyun } __attribute__ ((packed)) members; 2046*4882a593Smuzhiyun 2047*4882a593Smuzhiyun u32 word; 2048*4882a593Smuzhiyun 2049*4882a593Smuzhiyun } __attribute__ ((packed)); 2050*4882a593Smuzhiyun 2051*4882a593Smuzhiyun struct megasas_evt_log_info { 2052*4882a593Smuzhiyun __le32 newest_seq_num; 2053*4882a593Smuzhiyun __le32 oldest_seq_num; 2054*4882a593Smuzhiyun __le32 clear_seq_num; 2055*4882a593Smuzhiyun __le32 shutdown_seq_num; 2056*4882a593Smuzhiyun __le32 boot_seq_num; 2057*4882a593Smuzhiyun 2058*4882a593Smuzhiyun } __attribute__ ((packed)); 2059*4882a593Smuzhiyun 2060*4882a593Smuzhiyun struct megasas_progress { 2061*4882a593Smuzhiyun 2062*4882a593Smuzhiyun __le16 progress; 2063*4882a593Smuzhiyun __le16 elapsed_seconds; 2064*4882a593Smuzhiyun 2065*4882a593Smuzhiyun } __attribute__ ((packed)); 2066*4882a593Smuzhiyun 2067*4882a593Smuzhiyun struct megasas_evtarg_ld { 2068*4882a593Smuzhiyun 2069*4882a593Smuzhiyun u16 target_id; 2070*4882a593Smuzhiyun u8 ld_index; 2071*4882a593Smuzhiyun u8 reserved; 2072*4882a593Smuzhiyun 2073*4882a593Smuzhiyun } __attribute__ ((packed)); 2074*4882a593Smuzhiyun 2075*4882a593Smuzhiyun struct megasas_evtarg_pd { 2076*4882a593Smuzhiyun u16 device_id; 2077*4882a593Smuzhiyun u8 encl_index; 2078*4882a593Smuzhiyun u8 slot_number; 2079*4882a593Smuzhiyun 2080*4882a593Smuzhiyun } __attribute__ ((packed)); 2081*4882a593Smuzhiyun 2082*4882a593Smuzhiyun struct megasas_evt_detail { 2083*4882a593Smuzhiyun 2084*4882a593Smuzhiyun __le32 seq_num; 2085*4882a593Smuzhiyun __le32 time_stamp; 2086*4882a593Smuzhiyun __le32 code; 2087*4882a593Smuzhiyun union megasas_evt_class_locale cl; 2088*4882a593Smuzhiyun u8 arg_type; 2089*4882a593Smuzhiyun u8 reserved1[15]; 2090*4882a593Smuzhiyun 2091*4882a593Smuzhiyun union { 2092*4882a593Smuzhiyun struct { 2093*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2094*4882a593Smuzhiyun u8 cdb_length; 2095*4882a593Smuzhiyun u8 sense_length; 2096*4882a593Smuzhiyun u8 reserved[2]; 2097*4882a593Smuzhiyun u8 cdb[16]; 2098*4882a593Smuzhiyun u8 sense[64]; 2099*4882a593Smuzhiyun } __attribute__ ((packed)) cdbSense; 2100*4882a593Smuzhiyun 2101*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2102*4882a593Smuzhiyun 2103*4882a593Smuzhiyun struct { 2104*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2105*4882a593Smuzhiyun __le64 count; 2106*4882a593Smuzhiyun } __attribute__ ((packed)) ld_count; 2107*4882a593Smuzhiyun 2108*4882a593Smuzhiyun struct { 2109*4882a593Smuzhiyun __le64 lba; 2110*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2111*4882a593Smuzhiyun } __attribute__ ((packed)) ld_lba; 2112*4882a593Smuzhiyun 2113*4882a593Smuzhiyun struct { 2114*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2115*4882a593Smuzhiyun __le32 prevOwner; 2116*4882a593Smuzhiyun __le32 newOwner; 2117*4882a593Smuzhiyun } __attribute__ ((packed)) ld_owner; 2118*4882a593Smuzhiyun 2119*4882a593Smuzhiyun struct { 2120*4882a593Smuzhiyun u64 ld_lba; 2121*4882a593Smuzhiyun u64 pd_lba; 2122*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2123*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2124*4882a593Smuzhiyun } __attribute__ ((packed)) ld_lba_pd_lba; 2125*4882a593Smuzhiyun 2126*4882a593Smuzhiyun struct { 2127*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2128*4882a593Smuzhiyun struct megasas_progress prog; 2129*4882a593Smuzhiyun } __attribute__ ((packed)) ld_prog; 2130*4882a593Smuzhiyun 2131*4882a593Smuzhiyun struct { 2132*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2133*4882a593Smuzhiyun u32 prev_state; 2134*4882a593Smuzhiyun u32 new_state; 2135*4882a593Smuzhiyun } __attribute__ ((packed)) ld_state; 2136*4882a593Smuzhiyun 2137*4882a593Smuzhiyun struct { 2138*4882a593Smuzhiyun u64 strip; 2139*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2140*4882a593Smuzhiyun } __attribute__ ((packed)) ld_strip; 2141*4882a593Smuzhiyun 2142*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2143*4882a593Smuzhiyun 2144*4882a593Smuzhiyun struct { 2145*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2146*4882a593Smuzhiyun u32 err; 2147*4882a593Smuzhiyun } __attribute__ ((packed)) pd_err; 2148*4882a593Smuzhiyun 2149*4882a593Smuzhiyun struct { 2150*4882a593Smuzhiyun u64 lba; 2151*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2152*4882a593Smuzhiyun } __attribute__ ((packed)) pd_lba; 2153*4882a593Smuzhiyun 2154*4882a593Smuzhiyun struct { 2155*4882a593Smuzhiyun u64 lba; 2156*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2157*4882a593Smuzhiyun struct megasas_evtarg_ld ld; 2158*4882a593Smuzhiyun } __attribute__ ((packed)) pd_lba_ld; 2159*4882a593Smuzhiyun 2160*4882a593Smuzhiyun struct { 2161*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2162*4882a593Smuzhiyun struct megasas_progress prog; 2163*4882a593Smuzhiyun } __attribute__ ((packed)) pd_prog; 2164*4882a593Smuzhiyun 2165*4882a593Smuzhiyun struct { 2166*4882a593Smuzhiyun struct megasas_evtarg_pd pd; 2167*4882a593Smuzhiyun u32 prevState; 2168*4882a593Smuzhiyun u32 newState; 2169*4882a593Smuzhiyun } __attribute__ ((packed)) pd_state; 2170*4882a593Smuzhiyun 2171*4882a593Smuzhiyun struct { 2172*4882a593Smuzhiyun u16 vendorId; 2173*4882a593Smuzhiyun __le16 deviceId; 2174*4882a593Smuzhiyun u16 subVendorId; 2175*4882a593Smuzhiyun u16 subDeviceId; 2176*4882a593Smuzhiyun } __attribute__ ((packed)) pci; 2177*4882a593Smuzhiyun 2178*4882a593Smuzhiyun u32 rate; 2179*4882a593Smuzhiyun char str[96]; 2180*4882a593Smuzhiyun 2181*4882a593Smuzhiyun struct { 2182*4882a593Smuzhiyun u32 rtc; 2183*4882a593Smuzhiyun u32 elapsedSeconds; 2184*4882a593Smuzhiyun } __attribute__ ((packed)) time; 2185*4882a593Smuzhiyun 2186*4882a593Smuzhiyun struct { 2187*4882a593Smuzhiyun u32 ecar; 2188*4882a593Smuzhiyun u32 elog; 2189*4882a593Smuzhiyun char str[64]; 2190*4882a593Smuzhiyun } __attribute__ ((packed)) ecc; 2191*4882a593Smuzhiyun 2192*4882a593Smuzhiyun u8 b[96]; 2193*4882a593Smuzhiyun __le16 s[48]; 2194*4882a593Smuzhiyun __le32 w[24]; 2195*4882a593Smuzhiyun __le64 d[12]; 2196*4882a593Smuzhiyun } args; 2197*4882a593Smuzhiyun 2198*4882a593Smuzhiyun char description[128]; 2199*4882a593Smuzhiyun 2200*4882a593Smuzhiyun } __attribute__ ((packed)); 2201*4882a593Smuzhiyun 2202*4882a593Smuzhiyun struct megasas_aen_event { 2203*4882a593Smuzhiyun struct delayed_work hotplug_work; 2204*4882a593Smuzhiyun struct megasas_instance *instance; 2205*4882a593Smuzhiyun }; 2206*4882a593Smuzhiyun 2207*4882a593Smuzhiyun struct megasas_irq_context { 2208*4882a593Smuzhiyun char name[MEGASAS_MSIX_NAME_LEN]; 2209*4882a593Smuzhiyun struct megasas_instance *instance; 2210*4882a593Smuzhiyun u32 MSIxIndex; 2211*4882a593Smuzhiyun u32 os_irq; 2212*4882a593Smuzhiyun struct irq_poll irqpoll; 2213*4882a593Smuzhiyun bool irq_poll_scheduled; 2214*4882a593Smuzhiyun bool irq_line_enable; 2215*4882a593Smuzhiyun }; 2216*4882a593Smuzhiyun 2217*4882a593Smuzhiyun struct MR_DRV_SYSTEM_INFO { 2218*4882a593Smuzhiyun u8 infoVersion; 2219*4882a593Smuzhiyun u8 systemIdLength; 2220*4882a593Smuzhiyun u16 reserved0; 2221*4882a593Smuzhiyun u8 systemId[64]; 2222*4882a593Smuzhiyun u8 reserved[1980]; 2223*4882a593Smuzhiyun }; 2224*4882a593Smuzhiyun 2225*4882a593Smuzhiyun enum MR_PD_TYPE { 2226*4882a593Smuzhiyun UNKNOWN_DRIVE = 0, 2227*4882a593Smuzhiyun PARALLEL_SCSI = 1, 2228*4882a593Smuzhiyun SAS_PD = 2, 2229*4882a593Smuzhiyun SATA_PD = 3, 2230*4882a593Smuzhiyun FC_PD = 4, 2231*4882a593Smuzhiyun NVME_PD = 5, 2232*4882a593Smuzhiyun }; 2233*4882a593Smuzhiyun 2234*4882a593Smuzhiyun /* JBOD Queue depth definitions */ 2235*4882a593Smuzhiyun #define MEGASAS_SATA_QD 32 2236*4882a593Smuzhiyun #define MEGASAS_SAS_QD 256 2237*4882a593Smuzhiyun #define MEGASAS_DEFAULT_PD_QD 64 2238*4882a593Smuzhiyun #define MEGASAS_NVME_QD 64 2239*4882a593Smuzhiyun 2240*4882a593Smuzhiyun #define MR_DEFAULT_NVME_PAGE_SIZE 4096 2241*4882a593Smuzhiyun #define MR_DEFAULT_NVME_PAGE_SHIFT 12 2242*4882a593Smuzhiyun #define MR_DEFAULT_NVME_MDTS_KB 128 2243*4882a593Smuzhiyun #define MR_NVME_PAGE_SIZE_MASK 0x000000FF 2244*4882a593Smuzhiyun 2245*4882a593Smuzhiyun /*Aero performance parameters*/ 2246*4882a593Smuzhiyun #define MR_HIGH_IOPS_QUEUE_COUNT 8 2247*4882a593Smuzhiyun #define MR_DEVICE_HIGH_IOPS_DEPTH 8 2248*4882a593Smuzhiyun #define MR_HIGH_IOPS_BATCH_COUNT 16 2249*4882a593Smuzhiyun 2250*4882a593Smuzhiyun enum MR_PERF_MODE { 2251*4882a593Smuzhiyun MR_BALANCED_PERF_MODE = 0, 2252*4882a593Smuzhiyun MR_IOPS_PERF_MODE = 1, 2253*4882a593Smuzhiyun MR_LATENCY_PERF_MODE = 2, 2254*4882a593Smuzhiyun }; 2255*4882a593Smuzhiyun 2256*4882a593Smuzhiyun #define MEGASAS_PERF_MODE_2STR(mode) \ 2257*4882a593Smuzhiyun ((mode) == MR_BALANCED_PERF_MODE ? "Balanced" : \ 2258*4882a593Smuzhiyun (mode) == MR_IOPS_PERF_MODE ? "IOPS" : \ 2259*4882a593Smuzhiyun (mode) == MR_LATENCY_PERF_MODE ? "Latency" : \ 2260*4882a593Smuzhiyun "Unknown") 2261*4882a593Smuzhiyun 2262*4882a593Smuzhiyun enum MEGASAS_LD_TARGET_ID_STATUS { 2263*4882a593Smuzhiyun LD_TARGET_ID_INITIAL, 2264*4882a593Smuzhiyun LD_TARGET_ID_ACTIVE, 2265*4882a593Smuzhiyun LD_TARGET_ID_DELETED, 2266*4882a593Smuzhiyun }; 2267*4882a593Smuzhiyun 2268*4882a593Smuzhiyun #define MEGASAS_TARGET_ID(sdev) \ 2269*4882a593Smuzhiyun (((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id) 2270*4882a593Smuzhiyun 2271*4882a593Smuzhiyun struct megasas_instance { 2272*4882a593Smuzhiyun 2273*4882a593Smuzhiyun unsigned int *reply_map; 2274*4882a593Smuzhiyun __le32 *producer; 2275*4882a593Smuzhiyun dma_addr_t producer_h; 2276*4882a593Smuzhiyun __le32 *consumer; 2277*4882a593Smuzhiyun dma_addr_t consumer_h; 2278*4882a593Smuzhiyun struct MR_DRV_SYSTEM_INFO *system_info_buf; 2279*4882a593Smuzhiyun dma_addr_t system_info_h; 2280*4882a593Smuzhiyun struct MR_LD_VF_AFFILIATION *vf_affiliation; 2281*4882a593Smuzhiyun dma_addr_t vf_affiliation_h; 2282*4882a593Smuzhiyun struct MR_LD_VF_AFFILIATION_111 *vf_affiliation_111; 2283*4882a593Smuzhiyun dma_addr_t vf_affiliation_111_h; 2284*4882a593Smuzhiyun struct MR_CTRL_HB_HOST_MEM *hb_host_mem; 2285*4882a593Smuzhiyun dma_addr_t hb_host_mem_h; 2286*4882a593Smuzhiyun struct MR_PD_INFO *pd_info; 2287*4882a593Smuzhiyun dma_addr_t pd_info_h; 2288*4882a593Smuzhiyun struct MR_TARGET_PROPERTIES *tgt_prop; 2289*4882a593Smuzhiyun dma_addr_t tgt_prop_h; 2290*4882a593Smuzhiyun 2291*4882a593Smuzhiyun __le32 *reply_queue; 2292*4882a593Smuzhiyun dma_addr_t reply_queue_h; 2293*4882a593Smuzhiyun 2294*4882a593Smuzhiyun u32 *crash_dump_buf; 2295*4882a593Smuzhiyun dma_addr_t crash_dump_h; 2296*4882a593Smuzhiyun 2297*4882a593Smuzhiyun struct MR_PD_LIST *pd_list_buf; 2298*4882a593Smuzhiyun dma_addr_t pd_list_buf_h; 2299*4882a593Smuzhiyun 2300*4882a593Smuzhiyun struct megasas_ctrl_info *ctrl_info_buf; 2301*4882a593Smuzhiyun dma_addr_t ctrl_info_buf_h; 2302*4882a593Smuzhiyun 2303*4882a593Smuzhiyun struct MR_LD_LIST *ld_list_buf; 2304*4882a593Smuzhiyun dma_addr_t ld_list_buf_h; 2305*4882a593Smuzhiyun 2306*4882a593Smuzhiyun struct MR_LD_TARGETID_LIST *ld_targetid_list_buf; 2307*4882a593Smuzhiyun dma_addr_t ld_targetid_list_buf_h; 2308*4882a593Smuzhiyun 2309*4882a593Smuzhiyun struct MR_HOST_DEVICE_LIST *host_device_list_buf; 2310*4882a593Smuzhiyun dma_addr_t host_device_list_buf_h; 2311*4882a593Smuzhiyun 2312*4882a593Smuzhiyun struct MR_SNAPDUMP_PROPERTIES *snapdump_prop; 2313*4882a593Smuzhiyun dma_addr_t snapdump_prop_h; 2314*4882a593Smuzhiyun 2315*4882a593Smuzhiyun void *crash_buf[MAX_CRASH_DUMP_SIZE]; 2316*4882a593Smuzhiyun unsigned int fw_crash_buffer_size; 2317*4882a593Smuzhiyun unsigned int fw_crash_state; 2318*4882a593Smuzhiyun unsigned int fw_crash_buffer_offset; 2319*4882a593Smuzhiyun u32 drv_buf_index; 2320*4882a593Smuzhiyun u32 drv_buf_alloc; 2321*4882a593Smuzhiyun u32 crash_dump_fw_support; 2322*4882a593Smuzhiyun u32 crash_dump_drv_support; 2323*4882a593Smuzhiyun u32 crash_dump_app_support; 2324*4882a593Smuzhiyun u32 secure_jbod_support; 2325*4882a593Smuzhiyun u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */ 2326*4882a593Smuzhiyun bool use_seqnum_jbod_fp; /* Added for PD sequence */ 2327*4882a593Smuzhiyun bool smp_affinity_enable; 2328*4882a593Smuzhiyun spinlock_t crashdump_lock; 2329*4882a593Smuzhiyun 2330*4882a593Smuzhiyun struct megasas_register_set __iomem *reg_set; 2331*4882a593Smuzhiyun u32 __iomem *reply_post_host_index_addr[MR_MAX_MSIX_REG_ARRAY]; 2332*4882a593Smuzhiyun struct megasas_pd_list pd_list[MEGASAS_MAX_PD]; 2333*4882a593Smuzhiyun struct megasas_pd_list local_pd_list[MEGASAS_MAX_PD]; 2334*4882a593Smuzhiyun u8 ld_ids[MEGASAS_MAX_LD_IDS]; 2335*4882a593Smuzhiyun u8 ld_tgtid_status[MEGASAS_MAX_LD_IDS]; 2336*4882a593Smuzhiyun u8 ld_ids_prev[MEGASAS_MAX_LD_IDS]; 2337*4882a593Smuzhiyun u8 ld_ids_from_raidmap[MEGASAS_MAX_LD_IDS]; 2338*4882a593Smuzhiyun s8 init_id; 2339*4882a593Smuzhiyun 2340*4882a593Smuzhiyun u16 max_num_sge; 2341*4882a593Smuzhiyun u16 max_fw_cmds; 2342*4882a593Smuzhiyun u16 max_mpt_cmds; 2343*4882a593Smuzhiyun u16 max_mfi_cmds; 2344*4882a593Smuzhiyun u16 max_scsi_cmds; 2345*4882a593Smuzhiyun u16 ldio_threshold; 2346*4882a593Smuzhiyun u16 cur_can_queue; 2347*4882a593Smuzhiyun u32 max_sectors_per_req; 2348*4882a593Smuzhiyun bool msix_load_balance; 2349*4882a593Smuzhiyun struct megasas_aen_event *ev; 2350*4882a593Smuzhiyun 2351*4882a593Smuzhiyun struct megasas_cmd **cmd_list; 2352*4882a593Smuzhiyun struct list_head cmd_pool; 2353*4882a593Smuzhiyun /* used to sync fire the cmd to fw */ 2354*4882a593Smuzhiyun spinlock_t mfi_pool_lock; 2355*4882a593Smuzhiyun /* used to sync fire the cmd to fw */ 2356*4882a593Smuzhiyun spinlock_t hba_lock; 2357*4882a593Smuzhiyun /* used to synch producer, consumer ptrs in dpc */ 2358*4882a593Smuzhiyun spinlock_t stream_lock; 2359*4882a593Smuzhiyun spinlock_t completion_lock; 2360*4882a593Smuzhiyun struct dma_pool *frame_dma_pool; 2361*4882a593Smuzhiyun struct dma_pool *sense_dma_pool; 2362*4882a593Smuzhiyun 2363*4882a593Smuzhiyun struct megasas_evt_detail *evt_detail; 2364*4882a593Smuzhiyun dma_addr_t evt_detail_h; 2365*4882a593Smuzhiyun struct megasas_cmd *aen_cmd; 2366*4882a593Smuzhiyun struct semaphore ioctl_sem; 2367*4882a593Smuzhiyun 2368*4882a593Smuzhiyun struct Scsi_Host *host; 2369*4882a593Smuzhiyun 2370*4882a593Smuzhiyun wait_queue_head_t int_cmd_wait_q; 2371*4882a593Smuzhiyun wait_queue_head_t abort_cmd_wait_q; 2372*4882a593Smuzhiyun 2373*4882a593Smuzhiyun struct pci_dev *pdev; 2374*4882a593Smuzhiyun u32 unique_id; 2375*4882a593Smuzhiyun u32 fw_support_ieee; 2376*4882a593Smuzhiyun u32 threshold_reply_count; 2377*4882a593Smuzhiyun 2378*4882a593Smuzhiyun atomic_t fw_outstanding; 2379*4882a593Smuzhiyun atomic_t ldio_outstanding; 2380*4882a593Smuzhiyun atomic_t fw_reset_no_pci_access; 2381*4882a593Smuzhiyun atomic64_t total_io_count; 2382*4882a593Smuzhiyun atomic64_t high_iops_outstanding; 2383*4882a593Smuzhiyun 2384*4882a593Smuzhiyun struct megasas_instance_template *instancet; 2385*4882a593Smuzhiyun struct tasklet_struct isr_tasklet; 2386*4882a593Smuzhiyun struct work_struct work_init; 2387*4882a593Smuzhiyun struct delayed_work fw_fault_work; 2388*4882a593Smuzhiyun struct workqueue_struct *fw_fault_work_q; 2389*4882a593Smuzhiyun char fault_handler_work_q_name[48]; 2390*4882a593Smuzhiyun 2391*4882a593Smuzhiyun u8 flag; 2392*4882a593Smuzhiyun u8 unload; 2393*4882a593Smuzhiyun u8 flag_ieee; 2394*4882a593Smuzhiyun u8 issuepend_done; 2395*4882a593Smuzhiyun u8 disableOnlineCtrlReset; 2396*4882a593Smuzhiyun u8 UnevenSpanSupport; 2397*4882a593Smuzhiyun 2398*4882a593Smuzhiyun u8 supportmax256vd; 2399*4882a593Smuzhiyun u8 pd_list_not_supported; 2400*4882a593Smuzhiyun u16 fw_supported_vd_count; 2401*4882a593Smuzhiyun u16 fw_supported_pd_count; 2402*4882a593Smuzhiyun 2403*4882a593Smuzhiyun u16 drv_supported_vd_count; 2404*4882a593Smuzhiyun u16 drv_supported_pd_count; 2405*4882a593Smuzhiyun 2406*4882a593Smuzhiyun atomic_t adprecovery; 2407*4882a593Smuzhiyun unsigned long last_time; 2408*4882a593Smuzhiyun u32 mfiStatus; 2409*4882a593Smuzhiyun u32 last_seq_num; 2410*4882a593Smuzhiyun 2411*4882a593Smuzhiyun struct list_head internal_reset_pending_q; 2412*4882a593Smuzhiyun 2413*4882a593Smuzhiyun /* Ptr to hba specific information */ 2414*4882a593Smuzhiyun void *ctrl_context; 2415*4882a593Smuzhiyun unsigned int msix_vectors; 2416*4882a593Smuzhiyun struct megasas_irq_context irq_context[MEGASAS_MAX_MSIX_QUEUES]; 2417*4882a593Smuzhiyun u64 map_id; 2418*4882a593Smuzhiyun u64 pd_seq_map_id; 2419*4882a593Smuzhiyun struct megasas_cmd *map_update_cmd; 2420*4882a593Smuzhiyun struct megasas_cmd *jbod_seq_cmd; 2421*4882a593Smuzhiyun unsigned long bar; 2422*4882a593Smuzhiyun long reset_flags; 2423*4882a593Smuzhiyun struct mutex reset_mutex; 2424*4882a593Smuzhiyun struct timer_list sriov_heartbeat_timer; 2425*4882a593Smuzhiyun char skip_heartbeat_timer_del; 2426*4882a593Smuzhiyun u8 requestorId; 2427*4882a593Smuzhiyun char PlasmaFW111; 2428*4882a593Smuzhiyun char clusterId[MEGASAS_CLUSTER_ID_SIZE]; 2429*4882a593Smuzhiyun u8 peerIsPresent; 2430*4882a593Smuzhiyun u8 passive; 2431*4882a593Smuzhiyun u16 throttlequeuedepth; 2432*4882a593Smuzhiyun u8 mask_interrupts; 2433*4882a593Smuzhiyun u16 max_chain_frame_sz; 2434*4882a593Smuzhiyun u8 is_imr; 2435*4882a593Smuzhiyun u8 is_rdpq; 2436*4882a593Smuzhiyun bool dev_handle; 2437*4882a593Smuzhiyun bool fw_sync_cache_support; 2438*4882a593Smuzhiyun u32 mfi_frame_size; 2439*4882a593Smuzhiyun bool msix_combined; 2440*4882a593Smuzhiyun u16 max_raid_mapsize; 2441*4882a593Smuzhiyun /* preffered count to send as LDIO irrspective of FP capable.*/ 2442*4882a593Smuzhiyun u8 r1_ldio_hint_default; 2443*4882a593Smuzhiyun u32 nvme_page_size; 2444*4882a593Smuzhiyun u8 adapter_type; 2445*4882a593Smuzhiyun bool consistent_mask_64bit; 2446*4882a593Smuzhiyun bool support_nvme_passthru; 2447*4882a593Smuzhiyun bool enable_sdev_max_qd; 2448*4882a593Smuzhiyun u8 task_abort_tmo; 2449*4882a593Smuzhiyun u8 max_reset_tmo; 2450*4882a593Smuzhiyun u8 snapdump_wait_time; 2451*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS 2452*4882a593Smuzhiyun struct dentry *debugfs_root; 2453*4882a593Smuzhiyun struct dentry *raidmap_dump; 2454*4882a593Smuzhiyun #endif 2455*4882a593Smuzhiyun u8 enable_fw_dev_list; 2456*4882a593Smuzhiyun bool atomic_desc_support; 2457*4882a593Smuzhiyun bool support_seqnum_jbod_fp; 2458*4882a593Smuzhiyun bool support_pci_lane_margining; 2459*4882a593Smuzhiyun u8 low_latency_index_start; 2460*4882a593Smuzhiyun int perf_mode; 2461*4882a593Smuzhiyun }; 2462*4882a593Smuzhiyun 2463*4882a593Smuzhiyun struct MR_LD_VF_MAP { 2464*4882a593Smuzhiyun u32 size; 2465*4882a593Smuzhiyun union MR_LD_REF ref; 2466*4882a593Smuzhiyun u8 ldVfCount; 2467*4882a593Smuzhiyun u8 reserved[6]; 2468*4882a593Smuzhiyun u8 policy[1]; 2469*4882a593Smuzhiyun }; 2470*4882a593Smuzhiyun 2471*4882a593Smuzhiyun struct MR_LD_VF_AFFILIATION { 2472*4882a593Smuzhiyun u32 size; 2473*4882a593Smuzhiyun u8 ldCount; 2474*4882a593Smuzhiyun u8 vfCount; 2475*4882a593Smuzhiyun u8 thisVf; 2476*4882a593Smuzhiyun u8 reserved[9]; 2477*4882a593Smuzhiyun struct MR_LD_VF_MAP map[1]; 2478*4882a593Smuzhiyun }; 2479*4882a593Smuzhiyun 2480*4882a593Smuzhiyun /* Plasma 1.11 FW backward compatibility structures */ 2481*4882a593Smuzhiyun #define IOV_111_OFFSET 0x7CE 2482*4882a593Smuzhiyun #define MAX_VIRTUAL_FUNCTIONS 8 2483*4882a593Smuzhiyun #define MR_LD_ACCESS_HIDDEN 15 2484*4882a593Smuzhiyun 2485*4882a593Smuzhiyun struct IOV_111 { 2486*4882a593Smuzhiyun u8 maxVFsSupported; 2487*4882a593Smuzhiyun u8 numVFsEnabled; 2488*4882a593Smuzhiyun u8 requestorId; 2489*4882a593Smuzhiyun u8 reserved[5]; 2490*4882a593Smuzhiyun }; 2491*4882a593Smuzhiyun 2492*4882a593Smuzhiyun struct MR_LD_VF_MAP_111 { 2493*4882a593Smuzhiyun u8 targetId; 2494*4882a593Smuzhiyun u8 reserved[3]; 2495*4882a593Smuzhiyun u8 policy[MAX_VIRTUAL_FUNCTIONS]; 2496*4882a593Smuzhiyun }; 2497*4882a593Smuzhiyun 2498*4882a593Smuzhiyun struct MR_LD_VF_AFFILIATION_111 { 2499*4882a593Smuzhiyun u8 vdCount; 2500*4882a593Smuzhiyun u8 vfCount; 2501*4882a593Smuzhiyun u8 thisVf; 2502*4882a593Smuzhiyun u8 reserved[5]; 2503*4882a593Smuzhiyun struct MR_LD_VF_MAP_111 map[MAX_LOGICAL_DRIVES]; 2504*4882a593Smuzhiyun }; 2505*4882a593Smuzhiyun 2506*4882a593Smuzhiyun struct MR_CTRL_HB_HOST_MEM { 2507*4882a593Smuzhiyun struct { 2508*4882a593Smuzhiyun u32 fwCounter; /* Firmware heart beat counter */ 2509*4882a593Smuzhiyun struct { 2510*4882a593Smuzhiyun u32 debugmode:1; /* 1=Firmware is in debug mode. 2511*4882a593Smuzhiyun Heart beat will not be updated. */ 2512*4882a593Smuzhiyun u32 reserved:31; 2513*4882a593Smuzhiyun } debug; 2514*4882a593Smuzhiyun u32 reserved_fw[6]; 2515*4882a593Smuzhiyun u32 driverCounter; /* Driver heart beat counter. 0x20 */ 2516*4882a593Smuzhiyun u32 reserved_driver[7]; 2517*4882a593Smuzhiyun } HB; 2518*4882a593Smuzhiyun u8 pad[0x400-0x40]; 2519*4882a593Smuzhiyun }; 2520*4882a593Smuzhiyun 2521*4882a593Smuzhiyun enum { 2522*4882a593Smuzhiyun MEGASAS_HBA_OPERATIONAL = 0, 2523*4882a593Smuzhiyun MEGASAS_ADPRESET_SM_INFAULT = 1, 2524*4882a593Smuzhiyun MEGASAS_ADPRESET_SM_FW_RESET_SUCCESS = 2, 2525*4882a593Smuzhiyun MEGASAS_ADPRESET_SM_OPERATIONAL = 3, 2526*4882a593Smuzhiyun MEGASAS_HW_CRITICAL_ERROR = 4, 2527*4882a593Smuzhiyun MEGASAS_ADPRESET_SM_POLLING = 5, 2528*4882a593Smuzhiyun MEGASAS_ADPRESET_INPROG_SIGN = 0xDEADDEAD, 2529*4882a593Smuzhiyun }; 2530*4882a593Smuzhiyun 2531*4882a593Smuzhiyun struct megasas_instance_template { 2532*4882a593Smuzhiyun void (*fire_cmd)(struct megasas_instance *, dma_addr_t, \ 2533*4882a593Smuzhiyun u32, struct megasas_register_set __iomem *); 2534*4882a593Smuzhiyun 2535*4882a593Smuzhiyun void (*enable_intr)(struct megasas_instance *); 2536*4882a593Smuzhiyun void (*disable_intr)(struct megasas_instance *); 2537*4882a593Smuzhiyun 2538*4882a593Smuzhiyun int (*clear_intr)(struct megasas_instance *); 2539*4882a593Smuzhiyun 2540*4882a593Smuzhiyun u32 (*read_fw_status_reg)(struct megasas_instance *); 2541*4882a593Smuzhiyun int (*adp_reset)(struct megasas_instance *, \ 2542*4882a593Smuzhiyun struct megasas_register_set __iomem *); 2543*4882a593Smuzhiyun int (*check_reset)(struct megasas_instance *, \ 2544*4882a593Smuzhiyun struct megasas_register_set __iomem *); 2545*4882a593Smuzhiyun irqreturn_t (*service_isr)(int irq, void *devp); 2546*4882a593Smuzhiyun void (*tasklet)(unsigned long); 2547*4882a593Smuzhiyun u32 (*init_adapter)(struct megasas_instance *); 2548*4882a593Smuzhiyun u32 (*build_and_issue_cmd) (struct megasas_instance *, 2549*4882a593Smuzhiyun struct scsi_cmnd *); 2550*4882a593Smuzhiyun void (*issue_dcmd)(struct megasas_instance *instance, 2551*4882a593Smuzhiyun struct megasas_cmd *cmd); 2552*4882a593Smuzhiyun }; 2553*4882a593Smuzhiyun 2554*4882a593Smuzhiyun #define MEGASAS_IS_LOGICAL(sdev) \ 2555*4882a593Smuzhiyun ((sdev->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1) 2556*4882a593Smuzhiyun 2557*4882a593Smuzhiyun #define MEGASAS_IS_LUN_VALID(sdev) \ 2558*4882a593Smuzhiyun (((sdev)->lun == 0) ? 1 : 0) 2559*4882a593Smuzhiyun 2560*4882a593Smuzhiyun #define MEGASAS_DEV_INDEX(scp) \ 2561*4882a593Smuzhiyun (((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 2562*4882a593Smuzhiyun scp->device->id) 2563*4882a593Smuzhiyun 2564*4882a593Smuzhiyun #define MEGASAS_PD_INDEX(scp) \ 2565*4882a593Smuzhiyun ((scp->device->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 2566*4882a593Smuzhiyun scp->device->id) 2567*4882a593Smuzhiyun 2568*4882a593Smuzhiyun struct megasas_cmd { 2569*4882a593Smuzhiyun 2570*4882a593Smuzhiyun union megasas_frame *frame; 2571*4882a593Smuzhiyun dma_addr_t frame_phys_addr; 2572*4882a593Smuzhiyun u8 *sense; 2573*4882a593Smuzhiyun dma_addr_t sense_phys_addr; 2574*4882a593Smuzhiyun 2575*4882a593Smuzhiyun u32 index; 2576*4882a593Smuzhiyun u8 sync_cmd; 2577*4882a593Smuzhiyun u8 cmd_status_drv; 2578*4882a593Smuzhiyun u8 abort_aen; 2579*4882a593Smuzhiyun u8 retry_for_fw_reset; 2580*4882a593Smuzhiyun 2581*4882a593Smuzhiyun 2582*4882a593Smuzhiyun struct list_head list; 2583*4882a593Smuzhiyun struct scsi_cmnd *scmd; 2584*4882a593Smuzhiyun u8 flags; 2585*4882a593Smuzhiyun 2586*4882a593Smuzhiyun struct megasas_instance *instance; 2587*4882a593Smuzhiyun union { 2588*4882a593Smuzhiyun struct { 2589*4882a593Smuzhiyun u16 smid; 2590*4882a593Smuzhiyun u16 resvd; 2591*4882a593Smuzhiyun } context; 2592*4882a593Smuzhiyun u32 frame_count; 2593*4882a593Smuzhiyun }; 2594*4882a593Smuzhiyun }; 2595*4882a593Smuzhiyun 2596*4882a593Smuzhiyun #define MAX_MGMT_ADAPTERS 1024 2597*4882a593Smuzhiyun #define MAX_IOCTL_SGE 16 2598*4882a593Smuzhiyun 2599*4882a593Smuzhiyun struct megasas_iocpacket { 2600*4882a593Smuzhiyun 2601*4882a593Smuzhiyun u16 host_no; 2602*4882a593Smuzhiyun u16 __pad1; 2603*4882a593Smuzhiyun u32 sgl_off; 2604*4882a593Smuzhiyun u32 sge_count; 2605*4882a593Smuzhiyun u32 sense_off; 2606*4882a593Smuzhiyun u32 sense_len; 2607*4882a593Smuzhiyun union { 2608*4882a593Smuzhiyun u8 raw[128]; 2609*4882a593Smuzhiyun struct megasas_header hdr; 2610*4882a593Smuzhiyun } frame; 2611*4882a593Smuzhiyun 2612*4882a593Smuzhiyun struct iovec sgl[MAX_IOCTL_SGE]; 2613*4882a593Smuzhiyun 2614*4882a593Smuzhiyun } __attribute__ ((packed)); 2615*4882a593Smuzhiyun 2616*4882a593Smuzhiyun struct megasas_aen { 2617*4882a593Smuzhiyun u16 host_no; 2618*4882a593Smuzhiyun u16 __pad1; 2619*4882a593Smuzhiyun u32 seq_num; 2620*4882a593Smuzhiyun u32 class_locale_word; 2621*4882a593Smuzhiyun } __attribute__ ((packed)); 2622*4882a593Smuzhiyun 2623*4882a593Smuzhiyun #ifdef CONFIG_COMPAT 2624*4882a593Smuzhiyun struct compat_megasas_iocpacket { 2625*4882a593Smuzhiyun u16 host_no; 2626*4882a593Smuzhiyun u16 __pad1; 2627*4882a593Smuzhiyun u32 sgl_off; 2628*4882a593Smuzhiyun u32 sge_count; 2629*4882a593Smuzhiyun u32 sense_off; 2630*4882a593Smuzhiyun u32 sense_len; 2631*4882a593Smuzhiyun union { 2632*4882a593Smuzhiyun u8 raw[128]; 2633*4882a593Smuzhiyun struct megasas_header hdr; 2634*4882a593Smuzhiyun } frame; 2635*4882a593Smuzhiyun struct compat_iovec sgl[MAX_IOCTL_SGE]; 2636*4882a593Smuzhiyun } __attribute__ ((packed)); 2637*4882a593Smuzhiyun 2638*4882a593Smuzhiyun #define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket) 2639*4882a593Smuzhiyun #endif 2640*4882a593Smuzhiyun 2641*4882a593Smuzhiyun #define MEGASAS_IOC_FIRMWARE _IOWR('M', 1, struct megasas_iocpacket) 2642*4882a593Smuzhiyun #define MEGASAS_IOC_GET_AEN _IOW('M', 3, struct megasas_aen) 2643*4882a593Smuzhiyun 2644*4882a593Smuzhiyun struct megasas_mgmt_info { 2645*4882a593Smuzhiyun 2646*4882a593Smuzhiyun u16 count; 2647*4882a593Smuzhiyun struct megasas_instance *instance[MAX_MGMT_ADAPTERS]; 2648*4882a593Smuzhiyun int max_index; 2649*4882a593Smuzhiyun }; 2650*4882a593Smuzhiyun 2651*4882a593Smuzhiyun enum MEGASAS_OCR_CAUSE { 2652*4882a593Smuzhiyun FW_FAULT_OCR = 0, 2653*4882a593Smuzhiyun SCSIIO_TIMEOUT_OCR = 1, 2654*4882a593Smuzhiyun MFI_IO_TIMEOUT_OCR = 2, 2655*4882a593Smuzhiyun }; 2656*4882a593Smuzhiyun 2657*4882a593Smuzhiyun enum DCMD_RETURN_STATUS { 2658*4882a593Smuzhiyun DCMD_SUCCESS = 0x00, 2659*4882a593Smuzhiyun DCMD_TIMEOUT = 0x01, 2660*4882a593Smuzhiyun DCMD_FAILED = 0x02, 2661*4882a593Smuzhiyun DCMD_BUSY = 0x03, 2662*4882a593Smuzhiyun DCMD_INIT = 0xff, 2663*4882a593Smuzhiyun }; 2664*4882a593Smuzhiyun 2665*4882a593Smuzhiyun u8 2666*4882a593Smuzhiyun MR_BuildRaidContext(struct megasas_instance *instance, 2667*4882a593Smuzhiyun struct IO_REQUEST_INFO *io_info, 2668*4882a593Smuzhiyun struct RAID_CONTEXT *pRAID_Context, 2669*4882a593Smuzhiyun struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN); 2670*4882a593Smuzhiyun u16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map); 2671*4882a593Smuzhiyun struct MR_LD_RAID *MR_LdRaidGet(u32 ld, struct MR_DRV_RAID_MAP_ALL *map); 2672*4882a593Smuzhiyun u16 MR_ArPdGet(u32 ar, u32 arm, struct MR_DRV_RAID_MAP_ALL *map); 2673*4882a593Smuzhiyun u16 MR_LdSpanArrayGet(u32 ld, u32 span, struct MR_DRV_RAID_MAP_ALL *map); 2674*4882a593Smuzhiyun __le16 MR_PdDevHandleGet(u32 pd, struct MR_DRV_RAID_MAP_ALL *map); 2675*4882a593Smuzhiyun u16 MR_GetLDTgtId(u32 ld, struct MR_DRV_RAID_MAP_ALL *map); 2676*4882a593Smuzhiyun 2677*4882a593Smuzhiyun __le16 get_updated_dev_handle(struct megasas_instance *instance, 2678*4882a593Smuzhiyun struct LD_LOAD_BALANCE_INFO *lbInfo, 2679*4882a593Smuzhiyun struct IO_REQUEST_INFO *in_info, 2680*4882a593Smuzhiyun struct MR_DRV_RAID_MAP_ALL *drv_map); 2681*4882a593Smuzhiyun void mr_update_load_balance_params(struct MR_DRV_RAID_MAP_ALL *map, 2682*4882a593Smuzhiyun struct LD_LOAD_BALANCE_INFO *lbInfo); 2683*4882a593Smuzhiyun int megasas_get_ctrl_info(struct megasas_instance *instance); 2684*4882a593Smuzhiyun /* PD sequence */ 2685*4882a593Smuzhiyun int 2686*4882a593Smuzhiyun megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend); 2687*4882a593Smuzhiyun void megasas_set_dynamic_target_properties(struct scsi_device *sdev, 2688*4882a593Smuzhiyun bool is_target_prop); 2689*4882a593Smuzhiyun int megasas_get_target_prop(struct megasas_instance *instance, 2690*4882a593Smuzhiyun struct scsi_device *sdev); 2691*4882a593Smuzhiyun void megasas_get_snapdump_properties(struct megasas_instance *instance); 2692*4882a593Smuzhiyun 2693*4882a593Smuzhiyun int megasas_set_crash_dump_params(struct megasas_instance *instance, 2694*4882a593Smuzhiyun u8 crash_buf_state); 2695*4882a593Smuzhiyun void megasas_free_host_crash_buffer(struct megasas_instance *instance); 2696*4882a593Smuzhiyun 2697*4882a593Smuzhiyun void megasas_return_cmd_fusion(struct megasas_instance *instance, 2698*4882a593Smuzhiyun struct megasas_cmd_fusion *cmd); 2699*4882a593Smuzhiyun int megasas_issue_blocked_cmd(struct megasas_instance *instance, 2700*4882a593Smuzhiyun struct megasas_cmd *cmd, int timeout); 2701*4882a593Smuzhiyun void __megasas_return_cmd(struct megasas_instance *instance, 2702*4882a593Smuzhiyun struct megasas_cmd *cmd); 2703*4882a593Smuzhiyun 2704*4882a593Smuzhiyun void megasas_return_mfi_mpt_pthr(struct megasas_instance *instance, 2705*4882a593Smuzhiyun struct megasas_cmd *cmd_mfi, struct megasas_cmd_fusion *cmd_fusion); 2706*4882a593Smuzhiyun int megasas_cmd_type(struct scsi_cmnd *cmd); 2707*4882a593Smuzhiyun void megasas_setup_jbod_map(struct megasas_instance *instance); 2708*4882a593Smuzhiyun 2709*4882a593Smuzhiyun void megasas_update_sdev_properties(struct scsi_device *sdev); 2710*4882a593Smuzhiyun int megasas_reset_fusion(struct Scsi_Host *shost, int reason); 2711*4882a593Smuzhiyun int megasas_task_abort_fusion(struct scsi_cmnd *scmd); 2712*4882a593Smuzhiyun int megasas_reset_target_fusion(struct scsi_cmnd *scmd); 2713*4882a593Smuzhiyun u32 mega_mod64(u64 dividend, u32 divisor); 2714*4882a593Smuzhiyun int megasas_alloc_fusion_context(struct megasas_instance *instance); 2715*4882a593Smuzhiyun void megasas_free_fusion_context(struct megasas_instance *instance); 2716*4882a593Smuzhiyun int megasas_fusion_start_watchdog(struct megasas_instance *instance); 2717*4882a593Smuzhiyun void megasas_fusion_stop_watchdog(struct megasas_instance *instance); 2718*4882a593Smuzhiyun 2719*4882a593Smuzhiyun void megasas_set_dma_settings(struct megasas_instance *instance, 2720*4882a593Smuzhiyun struct megasas_dcmd_frame *dcmd, 2721*4882a593Smuzhiyun dma_addr_t dma_addr, u32 dma_len); 2722*4882a593Smuzhiyun int megasas_adp_reset_wait_for_ready(struct megasas_instance *instance, 2723*4882a593Smuzhiyun bool do_adp_reset, 2724*4882a593Smuzhiyun int ocr_context); 2725*4882a593Smuzhiyun int megasas_irqpoll(struct irq_poll *irqpoll, int budget); 2726*4882a593Smuzhiyun void megasas_dump_fusion_io(struct scsi_cmnd *scmd); 2727*4882a593Smuzhiyun u32 megasas_readl(struct megasas_instance *instance, 2728*4882a593Smuzhiyun const volatile void __iomem *addr); 2729*4882a593Smuzhiyun struct megasas_cmd *megasas_get_cmd(struct megasas_instance *instance); 2730*4882a593Smuzhiyun void megasas_return_cmd(struct megasas_instance *instance, 2731*4882a593Smuzhiyun struct megasas_cmd *cmd); 2732*4882a593Smuzhiyun int megasas_issue_polled(struct megasas_instance *instance, 2733*4882a593Smuzhiyun struct megasas_cmd *cmd); 2734*4882a593Smuzhiyun void megaraid_sas_kill_hba(struct megasas_instance *instance); 2735*4882a593Smuzhiyun void megasas_check_and_restore_queue_depth(struct megasas_instance *instance); 2736*4882a593Smuzhiyun void megasas_start_timer(struct megasas_instance *instance); 2737*4882a593Smuzhiyun int megasas_sriov_start_heartbeat(struct megasas_instance *instance, 2738*4882a593Smuzhiyun int initial); 2739*4882a593Smuzhiyun int megasas_alloc_cmds(struct megasas_instance *instance); 2740*4882a593Smuzhiyun void megasas_free_cmds(struct megasas_instance *instance); 2741*4882a593Smuzhiyun 2742*4882a593Smuzhiyun void megasas_init_debugfs(void); 2743*4882a593Smuzhiyun void megasas_exit_debugfs(void); 2744*4882a593Smuzhiyun void megasas_setup_debugfs(struct megasas_instance *instance); 2745*4882a593Smuzhiyun void megasas_destroy_debugfs(struct megasas_instance *instance); 2746*4882a593Smuzhiyun 2747*4882a593Smuzhiyun #endif /*LSI_MEGARAID_SAS_H */ 2748