11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 289a36810SAnil Ravindranath /* 389a36810SAnil Ravindranath * pmcraid.h -- PMC Sierra MaxRAID controller driver header file 489a36810SAnil Ravindranath * 5729c8456SAnil Ravindranath * Written By: Anil Ravindranath<anil_ravindranath@pmc-sierra.com> 6729c8456SAnil Ravindranath * PMC-Sierra Inc 7729c8456SAnil Ravindranath * 889a36810SAnil Ravindranath * Copyright (C) 2008, 2009 PMC Sierra Inc. 989a36810SAnil Ravindranath */ 1089a36810SAnil Ravindranath 1189a36810SAnil Ravindranath #ifndef _PMCRAID_H 1289a36810SAnil Ravindranath #define _PMCRAID_H 1389a36810SAnil Ravindranath 1489a36810SAnil Ravindranath #include <linux/types.h> 1589a36810SAnil Ravindranath #include <linux/completion.h> 1689a36810SAnil Ravindranath #include <linux/list.h> 1789a36810SAnil Ravindranath #include <scsi/scsi.h> 1889a36810SAnil Ravindranath #include <scsi/scsi_cmnd.h> 1989a36810SAnil Ravindranath #include <linux/cdev.h> 2089a36810SAnil Ravindranath #include <net/netlink.h> 2189a36810SAnil Ravindranath #include <net/genetlink.h> 2289a36810SAnil Ravindranath #include <linux/connector.h> 2389a36810SAnil Ravindranath /* 2489a36810SAnil Ravindranath * Driver name : string representing the driver name 2589a36810SAnil Ravindranath * Device file : /dev file to be used for management interfaces 2689a36810SAnil Ravindranath * Driver version: version string in major_version.minor_version.patch format 2789a36810SAnil Ravindranath * Driver date : date information in "Mon dd yyyy" format 2889a36810SAnil Ravindranath */ 2989a36810SAnil Ravindranath #define PMCRAID_DRIVER_NAME "PMC MaxRAID" 3089a36810SAnil Ravindranath #define PMCRAID_DEVFILE "pmcsas" 315da61410SAnil Ravindranath #define PMCRAID_DRIVER_VERSION "1.0.3" 3289a36810SAnil Ravindranath 33c20c4267SAnil Ravindranath #define PMCRAID_FW_VERSION_1 0x002 34c20c4267SAnil Ravindranath 3589a36810SAnil Ravindranath /* Maximum number of adapters supported by current version of the driver */ 3689a36810SAnil Ravindranath #define PMCRAID_MAX_ADAPTERS 1024 3789a36810SAnil Ravindranath 3889a36810SAnil Ravindranath /* Bit definitions as per firmware, bit position [0][1][2].....[31] */ 3989a36810SAnil Ravindranath #define PMC_BIT8(n) (1 << (7-n)) 4089a36810SAnil Ravindranath #define PMC_BIT16(n) (1 << (15-n)) 4189a36810SAnil Ravindranath #define PMC_BIT32(n) (1 << (31-n)) 4289a36810SAnil Ravindranath 4389a36810SAnil Ravindranath /* PMC PCI vendor ID and device ID values */ 4489a36810SAnil Ravindranath #define PCI_VENDOR_ID_PMC 0x11F8 4589a36810SAnil Ravindranath #define PCI_DEVICE_ID_PMC_MAXRAID 0x5220 4689a36810SAnil Ravindranath 4789a36810SAnil Ravindranath /* 4889a36810SAnil Ravindranath * MAX_CMD : maximum commands that can be outstanding with IOA 4989a36810SAnil Ravindranath * MAX_IO_CMD : command blocks available for IO commands 50*2d535031Szuoqilin * MAX_HCAM_CMD : command blocks available for HCAMS 51*2d535031Szuoqilin * MAX_INTERNAL_CMD : command blocks available for internal commands like reset 5289a36810SAnil Ravindranath */ 5389a36810SAnil Ravindranath #define PMCRAID_MAX_CMD 1024 5489a36810SAnil Ravindranath #define PMCRAID_MAX_IO_CMD 1020 5589a36810SAnil Ravindranath #define PMCRAID_MAX_HCAM_CMD 2 5689a36810SAnil Ravindranath #define PMCRAID_MAX_INTERNAL_CMD 2 5789a36810SAnil Ravindranath 5889a36810SAnil Ravindranath /* MAX_IOADLS : max number of scatter-gather lists supported by IOA 5989a36810SAnil Ravindranath * IOADLS_INTERNAL : number of ioadls included as part of IOARCB. 6089a36810SAnil Ravindranath * IOADLS_EXTERNAL : number of ioadls allocated external to IOARCB 6189a36810SAnil Ravindranath */ 6289a36810SAnil Ravindranath #define PMCRAID_IOADLS_INTERNAL 27 6389a36810SAnil Ravindranath #define PMCRAID_IOADLS_EXTERNAL 37 6489a36810SAnil Ravindranath #define PMCRAID_MAX_IOADLS PMCRAID_IOADLS_INTERNAL 6589a36810SAnil Ravindranath 6689a36810SAnil Ravindranath /* HRRQ_ENTRY_SIZE : size of hrrq buffer 6789a36810SAnil Ravindranath * IOARCB_ALIGNMENT : alignment required for IOARCB 6889a36810SAnil Ravindranath * IOADL_ALIGNMENT : alignment requirement for IOADLs 6989a36810SAnil Ravindranath * MSIX_VECTORS : number of MSIX vectors supported 7089a36810SAnil Ravindranath */ 7189a36810SAnil Ravindranath #define HRRQ_ENTRY_SIZE sizeof(__le32) 7289a36810SAnil Ravindranath #define PMCRAID_IOARCB_ALIGNMENT 32 7389a36810SAnil Ravindranath #define PMCRAID_IOADL_ALIGNMENT 16 7489a36810SAnil Ravindranath #define PMCRAID_IOASA_ALIGNMENT 4 75c20c4267SAnil Ravindranath #define PMCRAID_NUM_MSIX_VECTORS 16 7689a36810SAnil Ravindranath 7789a36810SAnil Ravindranath /* various other limits */ 7889a36810SAnil Ravindranath #define PMCRAID_VENDOR_ID_LEN 8 7989a36810SAnil Ravindranath #define PMCRAID_PRODUCT_ID_LEN 16 8089a36810SAnil Ravindranath #define PMCRAID_SERIAL_NUM_LEN 8 8189a36810SAnil Ravindranath #define PMCRAID_LUN_LEN 8 8289a36810SAnil Ravindranath #define PMCRAID_MAX_CDB_LEN 16 8389a36810SAnil Ravindranath #define PMCRAID_DEVICE_ID_LEN 8 8489a36810SAnil Ravindranath #define PMCRAID_SENSE_DATA_LEN 256 8589a36810SAnil Ravindranath #define PMCRAID_ADD_CMD_PARAM_LEN 48 8689a36810SAnil Ravindranath 8789a36810SAnil Ravindranath #define PMCRAID_MAX_BUS_TO_SCAN 1 8889a36810SAnil Ravindranath #define PMCRAID_MAX_NUM_TARGETS_PER_BUS 256 8989a36810SAnil Ravindranath #define PMCRAID_MAX_NUM_LUNS_PER_TARGET 8 9089a36810SAnil Ravindranath 9189a36810SAnil Ravindranath /* IOA bus/target/lun number of IOA resources */ 9289a36810SAnil Ravindranath #define PMCRAID_IOA_BUS_ID 0xfe 9389a36810SAnil Ravindranath #define PMCRAID_IOA_TARGET_ID 0xff 9489a36810SAnil Ravindranath #define PMCRAID_IOA_LUN_ID 0xff 9589a36810SAnil Ravindranath #define PMCRAID_VSET_BUS_ID 0x1 9689a36810SAnil Ravindranath #define PMCRAID_VSET_LUN_ID 0x0 9789a36810SAnil Ravindranath #define PMCRAID_PHYS_BUS_ID 0x0 9889a36810SAnil Ravindranath #define PMCRAID_VIRTUAL_ENCL_BUS_ID 0x8 99729c8456SAnil Ravindranath #define PMCRAID_MAX_VSET_TARGETS 0x7F 10089a36810SAnil Ravindranath #define PMCRAID_MAX_VSET_LUNS_PER_TARGET 8 10189a36810SAnil Ravindranath 10289a36810SAnil Ravindranath #define PMCRAID_IOA_MAX_SECTORS 32767 10389a36810SAnil Ravindranath #define PMCRAID_VSET_MAX_SECTORS 512 10489a36810SAnil Ravindranath #define PMCRAID_MAX_CMD_PER_LUN 254 10589a36810SAnil Ravindranath 106c20c4267SAnil Ravindranath /* Number of configuration table entries (resources), includes 1 FP, 107c20c4267SAnil Ravindranath * 1 Enclosure device 108c20c4267SAnil Ravindranath */ 109c20c4267SAnil Ravindranath #define PMCRAID_MAX_RESOURCES 256 11089a36810SAnil Ravindranath 11189a36810SAnil Ravindranath /* Adapter Commands used by driver */ 11289a36810SAnil Ravindranath #define PMCRAID_QUERY_RESOURCE_STATE 0xC2 11389a36810SAnil Ravindranath #define PMCRAID_RESET_DEVICE 0xC3 11489a36810SAnil Ravindranath /* options to select reset target */ 11589a36810SAnil Ravindranath #define ENABLE_RESET_MODIFIER 0x80 11689a36810SAnil Ravindranath #define RESET_DEVICE_LUN 0x40 11789a36810SAnil Ravindranath #define RESET_DEVICE_TARGET 0x20 11889a36810SAnil Ravindranath #define RESET_DEVICE_BUS 0x10 11989a36810SAnil Ravindranath 12089a36810SAnil Ravindranath #define PMCRAID_IDENTIFY_HRRQ 0xC4 12189a36810SAnil Ravindranath #define PMCRAID_QUERY_IOA_CONFIG 0xC5 12289a36810SAnil Ravindranath #define PMCRAID_QUERY_CMD_STATUS 0xCB 12389a36810SAnil Ravindranath #define PMCRAID_ABORT_CMD 0xC7 12489a36810SAnil Ravindranath 12589a36810SAnil Ravindranath /* CANCEL ALL command, provides option for setting SYNC_COMPLETE 12689a36810SAnil Ravindranath * on the target resources for which commands got cancelled 12789a36810SAnil Ravindranath */ 12889a36810SAnil Ravindranath #define PMCRAID_CANCEL_ALL_REQUESTS 0xCE 12989a36810SAnil Ravindranath #define PMCRAID_SYNC_COMPLETE_AFTER_CANCEL PMC_BIT8(0) 13089a36810SAnil Ravindranath 13189a36810SAnil Ravindranath /* HCAM command and types of HCAM supported by IOA */ 13289a36810SAnil Ravindranath #define PMCRAID_HOST_CONTROLLED_ASYNC 0xCF 13389a36810SAnil Ravindranath #define PMCRAID_HCAM_CODE_CONFIG_CHANGE 0x01 13489a36810SAnil Ravindranath #define PMCRAID_HCAM_CODE_LOG_DATA 0x02 13589a36810SAnil Ravindranath 13689a36810SAnil Ravindranath /* IOA shutdown command and various shutdown types */ 13789a36810SAnil Ravindranath #define PMCRAID_IOA_SHUTDOWN 0xF7 13889a36810SAnil Ravindranath #define PMCRAID_SHUTDOWN_NORMAL 0x00 13989a36810SAnil Ravindranath #define PMCRAID_SHUTDOWN_PREPARE_FOR_NORMAL 0x40 14089a36810SAnil Ravindranath #define PMCRAID_SHUTDOWN_NONE 0x100 14189a36810SAnil Ravindranath #define PMCRAID_SHUTDOWN_ABBREV 0x80 14289a36810SAnil Ravindranath 14389a36810SAnil Ravindranath /* SET SUPPORTED DEVICES command and the option to select all the 14489a36810SAnil Ravindranath * devices to be supported 14589a36810SAnil Ravindranath */ 14689a36810SAnil Ravindranath #define PMCRAID_SET_SUPPORTED_DEVICES 0xFB 14789a36810SAnil Ravindranath #define ALL_DEVICES_SUPPORTED PMC_BIT8(0) 14889a36810SAnil Ravindranath 14989a36810SAnil Ravindranath /* This option is used with SCSI WRITE_BUFFER command */ 15089a36810SAnil Ravindranath #define PMCRAID_WR_BUF_DOWNLOAD_AND_SAVE 0x05 15189a36810SAnil Ravindranath 15289a36810SAnil Ravindranath /* IOASC Codes used by driver */ 15389a36810SAnil Ravindranath #define PMCRAID_IOASC_SENSE_MASK 0xFFFFFF00 15489a36810SAnil Ravindranath #define PMCRAID_IOASC_SENSE_KEY(ioasc) ((ioasc) >> 24) 15589a36810SAnil Ravindranath #define PMCRAID_IOASC_SENSE_CODE(ioasc) (((ioasc) & 0x00ff0000) >> 16) 15689a36810SAnil Ravindranath #define PMCRAID_IOASC_SENSE_QUAL(ioasc) (((ioasc) & 0x0000ff00) >> 8) 15789a36810SAnil Ravindranath #define PMCRAID_IOASC_SENSE_STATUS(ioasc) ((ioasc) & 0x000000ff) 15889a36810SAnil Ravindranath 15989a36810SAnil Ravindranath #define PMCRAID_IOASC_GOOD_COMPLETION 0x00000000 160c20c4267SAnil Ravindranath #define PMCRAID_IOASC_GC_IOARCB_NOTFOUND 0x005A0000 16189a36810SAnil Ravindranath #define PMCRAID_IOASC_NR_INIT_CMD_REQUIRED 0x02040200 16289a36810SAnil Ravindranath #define PMCRAID_IOASC_NR_IOA_RESET_REQUIRED 0x02048000 16389a36810SAnil Ravindranath #define PMCRAID_IOASC_NR_SYNC_REQUIRED 0x023F0000 16489a36810SAnil Ravindranath #define PMCRAID_IOASC_ME_READ_ERROR_NO_REALLOC 0x03110C00 16589a36810SAnil Ravindranath #define PMCRAID_IOASC_HW_CANNOT_COMMUNICATE 0x04050000 16689a36810SAnil Ravindranath #define PMCRAID_IOASC_HW_DEVICE_TIMEOUT 0x04080100 16789a36810SAnil Ravindranath #define PMCRAID_IOASC_HW_DEVICE_BUS_STATUS_ERROR 0x04448500 16889a36810SAnil Ravindranath #define PMCRAID_IOASC_HW_IOA_RESET_REQUIRED 0x04448600 16989a36810SAnil Ravindranath #define PMCRAID_IOASC_IR_INVALID_RESOURCE_HANDLE 0x05250000 17089a36810SAnil Ravindranath #define PMCRAID_IOASC_AC_TERMINATED_BY_HOST 0x0B5A0000 17189a36810SAnil Ravindranath #define PMCRAID_IOASC_UA_BUS_WAS_RESET 0x06290000 172592488a3SAnil Ravindranath #define PMCRAID_IOASC_TIME_STAMP_OUT_OF_SYNC 0x06908B00 17389a36810SAnil Ravindranath #define PMCRAID_IOASC_UA_BUS_WAS_RESET_BY_OTHER 0x06298000 17489a36810SAnil Ravindranath 17589a36810SAnil Ravindranath /* Driver defined IOASCs */ 17689a36810SAnil Ravindranath #define PMCRAID_IOASC_IOA_WAS_RESET 0x10000001 17789a36810SAnil Ravindranath #define PMCRAID_IOASC_PCI_ACCESS_ERROR 0x10000002 17889a36810SAnil Ravindranath 17989a36810SAnil Ravindranath /* Various timeout values (in milliseconds) used. If any of these are chip 18089a36810SAnil Ravindranath * specific, move them to pmcraid_chip_details structure. 18189a36810SAnil Ravindranath */ 18289a36810SAnil Ravindranath #define PMCRAID_PCI_DEASSERT_TIMEOUT 2000 18389a36810SAnil Ravindranath #define PMCRAID_BIST_TIMEOUT 2000 18489a36810SAnil Ravindranath #define PMCRAID_AENWAIT_TIMEOUT 5000 18589a36810SAnil Ravindranath #define PMCRAID_TRANSOP_TIMEOUT 60000 18689a36810SAnil Ravindranath 18789a36810SAnil Ravindranath #define PMCRAID_RESET_TIMEOUT (2 * HZ) 18889a36810SAnil Ravindranath #define PMCRAID_CHECK_FOR_RESET_TIMEOUT ((HZ / 10)) 18989a36810SAnil Ravindranath #define PMCRAID_VSET_IO_TIMEOUT (60 * HZ) 19089a36810SAnil Ravindranath #define PMCRAID_INTERNAL_TIMEOUT (60 * HZ) 19189a36810SAnil Ravindranath #define PMCRAID_SHUTDOWN_TIMEOUT (150 * HZ) 19289a36810SAnil Ravindranath #define PMCRAID_RESET_BUS_TIMEOUT (60 * HZ) 19389a36810SAnil Ravindranath #define PMCRAID_RESET_HOST_TIMEOUT (150 * HZ) 19489a36810SAnil Ravindranath #define PMCRAID_REQUEST_SENSE_TIMEOUT (30 * HZ) 19589a36810SAnil Ravindranath #define PMCRAID_SET_SUP_DEV_TIMEOUT (2 * 60 * HZ) 19689a36810SAnil Ravindranath 19789a36810SAnil Ravindranath /* structure to represent a scatter-gather element (IOADL descriptor) */ 19889a36810SAnil Ravindranath struct pmcraid_ioadl_desc { 19989a36810SAnil Ravindranath __le64 address; 20089a36810SAnil Ravindranath __le32 data_len; 20189a36810SAnil Ravindranath __u8 reserved[3]; 20289a36810SAnil Ravindranath __u8 flags; 20389a36810SAnil Ravindranath } __attribute__((packed, aligned(PMCRAID_IOADL_ALIGNMENT))); 20489a36810SAnil Ravindranath 20589a36810SAnil Ravindranath /* pmcraid_ioadl_desc.flags values */ 20689a36810SAnil Ravindranath #define IOADL_FLAGS_CHAINED PMC_BIT8(0) 20789a36810SAnil Ravindranath #define IOADL_FLAGS_LAST_DESC PMC_BIT8(1) 20889a36810SAnil Ravindranath #define IOADL_FLAGS_READ_LAST PMC_BIT8(1) 20989a36810SAnil Ravindranath #define IOADL_FLAGS_WRITE_LAST PMC_BIT8(1) 21089a36810SAnil Ravindranath 21189a36810SAnil Ravindranath 21289a36810SAnil Ravindranath /* additional IOARCB data which can be CDB or additional request parameters 21389a36810SAnil Ravindranath * or list of IOADLs. Firmware supports max of 512 bytes for IOARCB, hence then 21489a36810SAnil Ravindranath * number of IOADLs are limted to 27. In case they are more than 27, they will 21589a36810SAnil Ravindranath * be used in chained form 21689a36810SAnil Ravindranath */ 21789a36810SAnil Ravindranath struct pmcraid_ioarcb_add_data { 21889a36810SAnil Ravindranath union { 21989a36810SAnil Ravindranath struct pmcraid_ioadl_desc ioadl[PMCRAID_IOADLS_INTERNAL]; 22089a36810SAnil Ravindranath __u8 add_cmd_params[PMCRAID_ADD_CMD_PARAM_LEN]; 22189a36810SAnil Ravindranath } u; 22289a36810SAnil Ravindranath }; 22389a36810SAnil Ravindranath 22489a36810SAnil Ravindranath /* 22589a36810SAnil Ravindranath * IOA Request Control Block 22689a36810SAnil Ravindranath */ 22789a36810SAnil Ravindranath struct pmcraid_ioarcb { 22889a36810SAnil Ravindranath __le64 ioarcb_bus_addr; 22989a36810SAnil Ravindranath __le32 resource_handle; 23089a36810SAnil Ravindranath __le32 response_handle; 23189a36810SAnil Ravindranath __le64 ioadl_bus_addr; 23289a36810SAnil Ravindranath __le32 ioadl_length; 23389a36810SAnil Ravindranath __le32 data_transfer_length; 23489a36810SAnil Ravindranath __le64 ioasa_bus_addr; 23589a36810SAnil Ravindranath __le16 ioasa_len; 23689a36810SAnil Ravindranath __le16 cmd_timeout; 23789a36810SAnil Ravindranath __le16 add_cmd_param_offset; 23889a36810SAnil Ravindranath __le16 add_cmd_param_length; 23989a36810SAnil Ravindranath __le32 reserved1[2]; 24089a36810SAnil Ravindranath __le32 reserved2; 24189a36810SAnil Ravindranath __u8 request_type; 24289a36810SAnil Ravindranath __u8 request_flags0; 24389a36810SAnil Ravindranath __u8 request_flags1; 24489a36810SAnil Ravindranath __u8 hrrq_id; 24589a36810SAnil Ravindranath __u8 cdb[PMCRAID_MAX_CDB_LEN]; 24689a36810SAnil Ravindranath struct pmcraid_ioarcb_add_data add_data; 247e92b0b5eSArnd Bergmann }; 24889a36810SAnil Ravindranath 24989a36810SAnil Ravindranath /* well known resource handle values */ 25089a36810SAnil Ravindranath #define PMCRAID_IOA_RES_HANDLE 0xffffffff 25189a36810SAnil Ravindranath #define PMCRAID_INVALID_RES_HANDLE 0 25289a36810SAnil Ravindranath 25389a36810SAnil Ravindranath /* pmcraid_ioarcb.request_type values */ 25489a36810SAnil Ravindranath #define REQ_TYPE_SCSI 0x00 25589a36810SAnil Ravindranath #define REQ_TYPE_IOACMD 0x01 25689a36810SAnil Ravindranath #define REQ_TYPE_HCAM 0x02 25789a36810SAnil Ravindranath 25889a36810SAnil Ravindranath /* pmcraid_ioarcb.flags0 values */ 25989a36810SAnil Ravindranath #define TRANSFER_DIR_WRITE PMC_BIT8(0) 26089a36810SAnil Ravindranath #define INHIBIT_UL_CHECK PMC_BIT8(2) 26189a36810SAnil Ravindranath #define SYNC_OVERRIDE PMC_BIT8(3) 26289a36810SAnil Ravindranath #define SYNC_COMPLETE PMC_BIT8(4) 26389a36810SAnil Ravindranath #define NO_LINK_DESCS PMC_BIT8(5) 26489a36810SAnil Ravindranath 26589a36810SAnil Ravindranath /* pmcraid_ioarcb.flags1 values */ 26689a36810SAnil Ravindranath #define DELAY_AFTER_RESET PMC_BIT8(0) 26789a36810SAnil Ravindranath #define TASK_TAG_SIMPLE 0x10 26889a36810SAnil Ravindranath #define TASK_TAG_ORDERED 0x20 26989a36810SAnil Ravindranath #define TASK_TAG_QUEUE_HEAD 0x30 27089a36810SAnil Ravindranath 27189a36810SAnil Ravindranath /* toggle bit offset in response handle */ 27289a36810SAnil Ravindranath #define HRRQ_TOGGLE_BIT 0x01 27389a36810SAnil Ravindranath #define HRRQ_RESPONSE_BIT 0x02 27489a36810SAnil Ravindranath 27589a36810SAnil Ravindranath /* IOA Status Area */ 27689a36810SAnil Ravindranath struct pmcraid_ioasa_vset { 27789a36810SAnil Ravindranath __le32 failing_lba_hi; 27889a36810SAnil Ravindranath __le32 failing_lba_lo; 27989a36810SAnil Ravindranath __le32 reserved; 28089a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 28189a36810SAnil Ravindranath 28289a36810SAnil Ravindranath struct pmcraid_ioasa { 28389a36810SAnil Ravindranath __le32 ioasc; 28489a36810SAnil Ravindranath __le16 returned_status_length; 28589a36810SAnil Ravindranath __le16 available_status_length; 28689a36810SAnil Ravindranath __le32 residual_data_length; 28789a36810SAnil Ravindranath __le32 ilid; 28889a36810SAnil Ravindranath __le32 fd_ioasc; 28989a36810SAnil Ravindranath __le32 fd_res_address; 29089a36810SAnil Ravindranath __le32 fd_res_handle; 29189a36810SAnil Ravindranath __le32 reserved; 29289a36810SAnil Ravindranath 29389a36810SAnil Ravindranath /* resource specific sense information */ 29489a36810SAnil Ravindranath union { 29589a36810SAnil Ravindranath struct pmcraid_ioasa_vset vset; 29689a36810SAnil Ravindranath } u; 29789a36810SAnil Ravindranath 29889a36810SAnil Ravindranath /* IOA autosense data */ 29989a36810SAnil Ravindranath __le16 auto_sense_length; 30089a36810SAnil Ravindranath __le16 error_data_length; 30189a36810SAnil Ravindranath __u8 sense_data[PMCRAID_SENSE_DATA_LEN]; 30289a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 30389a36810SAnil Ravindranath 30489a36810SAnil Ravindranath #define PMCRAID_DRIVER_ILID 0xffffffff 30589a36810SAnil Ravindranath 30689a36810SAnil Ravindranath /* Config Table Entry per Resource */ 30789a36810SAnil Ravindranath struct pmcraid_config_table_entry { 30889a36810SAnil Ravindranath __u8 resource_type; 30989a36810SAnil Ravindranath __u8 bus_protocol; 31089a36810SAnil Ravindranath __le16 array_id; 31189a36810SAnil Ravindranath __u8 common_flags0; 31289a36810SAnil Ravindranath __u8 common_flags1; 31389a36810SAnil Ravindranath __u8 unique_flags0; 31489a36810SAnil Ravindranath __u8 unique_flags1; /*also used as vset target_id */ 31589a36810SAnil Ravindranath __le32 resource_handle; 31689a36810SAnil Ravindranath __le32 resource_address; 31789a36810SAnil Ravindranath __u8 device_id[PMCRAID_DEVICE_ID_LEN]; 31889a36810SAnil Ravindranath __u8 lun[PMCRAID_LUN_LEN]; 31989a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 32089a36810SAnil Ravindranath 3215da61410SAnil Ravindranath /* extended configuration table sizes are also of 32 bytes in size */ 322c20c4267SAnil Ravindranath struct pmcraid_config_table_entry_ext { 323c20c4267SAnil Ravindranath struct pmcraid_config_table_entry cfgte; 324c20c4267SAnil Ravindranath }; 325c20c4267SAnil Ravindranath 32689a36810SAnil Ravindranath /* resource types (config_table_entry.resource_type values) */ 32789a36810SAnil Ravindranath #define RES_TYPE_AF_DASD 0x00 32889a36810SAnil Ravindranath #define RES_TYPE_GSCSI 0x01 32989a36810SAnil Ravindranath #define RES_TYPE_VSET 0x02 33089a36810SAnil Ravindranath #define RES_TYPE_IOA_FP 0xFF 33189a36810SAnil Ravindranath 33289a36810SAnil Ravindranath #define RES_IS_IOA(res) ((res).resource_type == RES_TYPE_IOA_FP) 33389a36810SAnil Ravindranath #define RES_IS_GSCSI(res) ((res).resource_type == RES_TYPE_GSCSI) 33489a36810SAnil Ravindranath #define RES_IS_VSET(res) ((res).resource_type == RES_TYPE_VSET) 33589a36810SAnil Ravindranath #define RES_IS_AFDASD(res) ((res).resource_type == RES_TYPE_AF_DASD) 33689a36810SAnil Ravindranath 33789a36810SAnil Ravindranath /* bus_protocol values used by driver */ 33889a36810SAnil Ravindranath #define RES_TYPE_VENCLOSURE 0x8 33989a36810SAnil Ravindranath 34089a36810SAnil Ravindranath /* config_table_entry.common_flags0 */ 34189a36810SAnil Ravindranath #define MULTIPATH_RESOURCE PMC_BIT32(0) 34289a36810SAnil Ravindranath 34389a36810SAnil Ravindranath /* unique_flags1 */ 34489a36810SAnil Ravindranath #define IMPORT_MODE_MANUAL PMC_BIT8(0) 34589a36810SAnil Ravindranath 34689a36810SAnil Ravindranath /* well known resource handle values */ 34789a36810SAnil Ravindranath #define RES_HANDLE_IOA 0xFFFFFFFF 34889a36810SAnil Ravindranath #define RES_HANDLE_NONE 0x00000000 34989a36810SAnil Ravindranath 35089a36810SAnil Ravindranath /* well known resource address values */ 35189a36810SAnil Ravindranath #define RES_ADDRESS_IOAFP 0xFEFFFFFF 35289a36810SAnil Ravindranath #define RES_ADDRESS_INVALID 0xFFFFFFFF 35389a36810SAnil Ravindranath 35489a36810SAnil Ravindranath /* BUS/TARGET/LUN values from resource_addrr */ 35589a36810SAnil Ravindranath #define RES_BUS(res_addr) (le32_to_cpu(res_addr) & 0xFF) 35689a36810SAnil Ravindranath #define RES_TARGET(res_addr) ((le32_to_cpu(res_addr) >> 16) & 0xFF) 35789a36810SAnil Ravindranath #define RES_LUN(res_addr) 0x0 35889a36810SAnil Ravindranath 35989a36810SAnil Ravindranath /* configuration table structure */ 36089a36810SAnil Ravindranath struct pmcraid_config_table { 36189a36810SAnil Ravindranath __le16 num_entries; 36289a36810SAnil Ravindranath __u8 table_format; 36389a36810SAnil Ravindranath __u8 reserved1; 36489a36810SAnil Ravindranath __u8 flags; 36589a36810SAnil Ravindranath __u8 reserved2[11]; 366c20c4267SAnil Ravindranath union { 367c20c4267SAnil Ravindranath struct pmcraid_config_table_entry 368c20c4267SAnil Ravindranath entries[PMCRAID_MAX_RESOURCES]; 369c20c4267SAnil Ravindranath struct pmcraid_config_table_entry_ext 370c20c4267SAnil Ravindranath entries_ext[PMCRAID_MAX_RESOURCES]; 371c20c4267SAnil Ravindranath }; 37289a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 37389a36810SAnil Ravindranath 37489a36810SAnil Ravindranath /* config_table.flags value */ 37589a36810SAnil Ravindranath #define MICROCODE_UPDATE_REQUIRED PMC_BIT32(0) 37689a36810SAnil Ravindranath 37789a36810SAnil Ravindranath /* 37889a36810SAnil Ravindranath * HCAM format 37989a36810SAnil Ravindranath */ 38089a36810SAnil Ravindranath #define PMCRAID_HOSTRCB_LDNSIZE 4056 38189a36810SAnil Ravindranath 38289a36810SAnil Ravindranath /* Error log notification format */ 38389a36810SAnil Ravindranath struct pmcraid_hostrcb_error { 38489a36810SAnil Ravindranath __le32 fd_ioasc; 38589a36810SAnil Ravindranath __le32 fd_ra; 38689a36810SAnil Ravindranath __le32 fd_rh; 38789a36810SAnil Ravindranath __le32 prc; 38889a36810SAnil Ravindranath union { 38989a36810SAnil Ravindranath __u8 data[PMCRAID_HOSTRCB_LDNSIZE]; 39089a36810SAnil Ravindranath } u; 39189a36810SAnil Ravindranath } __attribute__ ((packed, aligned(4))); 39289a36810SAnil Ravindranath 39389a36810SAnil Ravindranath struct pmcraid_hcam_hdr { 39489a36810SAnil Ravindranath __u8 op_code; 39589a36810SAnil Ravindranath __u8 notification_type; 39689a36810SAnil Ravindranath __u8 notification_lost; 39789a36810SAnil Ravindranath __u8 flags; 39889a36810SAnil Ravindranath __u8 overlay_id; 39989a36810SAnil Ravindranath __u8 reserved1[3]; 40089a36810SAnil Ravindranath __le32 ilid; 40189a36810SAnil Ravindranath __le32 timestamp1; 40289a36810SAnil Ravindranath __le32 timestamp2; 40389a36810SAnil Ravindranath __le32 data_len; 40489a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 40589a36810SAnil Ravindranath 40689a36810SAnil Ravindranath #define PMCRAID_AEN_GROUP 0x3 40789a36810SAnil Ravindranath 40889a36810SAnil Ravindranath struct pmcraid_hcam_ccn { 40989a36810SAnil Ravindranath struct pmcraid_hcam_hdr header; 41089a36810SAnil Ravindranath struct pmcraid_config_table_entry cfg_entry; 411c20c4267SAnil Ravindranath struct pmcraid_config_table_entry cfg_entry_old; 412c20c4267SAnil Ravindranath } __attribute__((packed, aligned(4))); 413c20c4267SAnil Ravindranath 414c20c4267SAnil Ravindranath #define PMCRAID_CCN_EXT_SIZE 3944 415c20c4267SAnil Ravindranath struct pmcraid_hcam_ccn_ext { 416c20c4267SAnil Ravindranath struct pmcraid_hcam_hdr header; 417c20c4267SAnil Ravindranath struct pmcraid_config_table_entry_ext cfg_entry; 418c20c4267SAnil Ravindranath struct pmcraid_config_table_entry_ext cfg_entry_old; 419c20c4267SAnil Ravindranath __u8 reserved[PMCRAID_CCN_EXT_SIZE]; 42089a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 42189a36810SAnil Ravindranath 42289a36810SAnil Ravindranath struct pmcraid_hcam_ldn { 42389a36810SAnil Ravindranath struct pmcraid_hcam_hdr header; 42489a36810SAnil Ravindranath struct pmcraid_hostrcb_error error_log; 42589a36810SAnil Ravindranath } __attribute__((packed, aligned(4))); 42689a36810SAnil Ravindranath 42789a36810SAnil Ravindranath /* pmcraid_hcam.op_code values */ 42889a36810SAnil Ravindranath #define HOSTRCB_TYPE_CCN 0xE1 42989a36810SAnil Ravindranath #define HOSTRCB_TYPE_LDN 0xE2 43089a36810SAnil Ravindranath 43189a36810SAnil Ravindranath /* pmcraid_hcam.notification_type values */ 43289a36810SAnil Ravindranath #define NOTIFICATION_TYPE_ENTRY_CHANGED 0x0 43389a36810SAnil Ravindranath #define NOTIFICATION_TYPE_ENTRY_NEW 0x1 43489a36810SAnil Ravindranath #define NOTIFICATION_TYPE_ENTRY_DELETED 0x2 435c20c4267SAnil Ravindranath #define NOTIFICATION_TYPE_STATE_CHANGE 0x3 436c20c4267SAnil Ravindranath #define NOTIFICATION_TYPE_ENTRY_STATECHANGED 0x4 43789a36810SAnil Ravindranath #define NOTIFICATION_TYPE_ERROR_LOG 0x10 43889a36810SAnil Ravindranath #define NOTIFICATION_TYPE_INFORMATION_LOG 0x11 43989a36810SAnil Ravindranath 44089a36810SAnil Ravindranath #define HOSTRCB_NOTIFICATIONS_LOST PMC_BIT8(0) 44189a36810SAnil Ravindranath 44289a36810SAnil Ravindranath /* pmcraid_hcam.flags values */ 44389a36810SAnil Ravindranath #define HOSTRCB_INTERNAL_OP_ERROR PMC_BIT8(0) 44489a36810SAnil Ravindranath #define HOSTRCB_ERROR_RESPONSE_SENT PMC_BIT8(1) 44589a36810SAnil Ravindranath 44689a36810SAnil Ravindranath /* pmcraid_hcam.overlay_id values */ 44789a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_08 0x08 44889a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_09 0x09 44989a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_11 0x11 45089a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_12 0x12 45189a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_13 0x13 45289a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_14 0x14 45389a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_16 0x16 45489a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_17 0x17 45589a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_20 0x20 45689a36810SAnil Ravindranath #define HOSTRCB_OVERLAY_ID_FF 0xFF 45789a36810SAnil Ravindranath 45889a36810SAnil Ravindranath /* Implementation specific card details */ 45989a36810SAnil Ravindranath struct pmcraid_chip_details { 46089a36810SAnil Ravindranath /* hardware register offsets */ 46189a36810SAnil Ravindranath unsigned long ioastatus; 46289a36810SAnil Ravindranath unsigned long ioarrin; 46389a36810SAnil Ravindranath unsigned long mailbox; 46489a36810SAnil Ravindranath unsigned long global_intr_mask; 46589a36810SAnil Ravindranath unsigned long ioa_host_intr; 466c20c4267SAnil Ravindranath unsigned long ioa_host_msix_intr; 46789a36810SAnil Ravindranath unsigned long ioa_host_intr_clr; 46889a36810SAnil Ravindranath unsigned long ioa_host_mask; 46989a36810SAnil Ravindranath unsigned long ioa_host_mask_clr; 47089a36810SAnil Ravindranath unsigned long host_ioa_intr; 47189a36810SAnil Ravindranath unsigned long host_ioa_intr_clr; 47289a36810SAnil Ravindranath 47389a36810SAnil Ravindranath /* timeout used during transitional to operational state */ 47489a36810SAnil Ravindranath unsigned long transop_timeout; 47589a36810SAnil Ravindranath }; 47689a36810SAnil Ravindranath 47789a36810SAnil Ravindranath /* IOA to HOST doorbells (interrupts) */ 47889a36810SAnil Ravindranath #define INTRS_TRANSITION_TO_OPERATIONAL PMC_BIT32(0) 47989a36810SAnil Ravindranath #define INTRS_IOARCB_TRANSFER_FAILED PMC_BIT32(3) 48089a36810SAnil Ravindranath #define INTRS_IOA_UNIT_CHECK PMC_BIT32(4) 48189a36810SAnil Ravindranath #define INTRS_NO_HRRQ_FOR_CMD_RESPONSE PMC_BIT32(5) 48289a36810SAnil Ravindranath #define INTRS_CRITICAL_OP_IN_PROGRESS PMC_BIT32(6) 48389a36810SAnil Ravindranath #define INTRS_IO_DEBUG_ACK PMC_BIT32(7) 48489a36810SAnil Ravindranath #define INTRS_IOARRIN_LOST PMC_BIT32(27) 48589a36810SAnil Ravindranath #define INTRS_SYSTEM_BUS_MMIO_ERROR PMC_BIT32(28) 48689a36810SAnil Ravindranath #define INTRS_IOA_PROCESSOR_ERROR PMC_BIT32(29) 48789a36810SAnil Ravindranath #define INTRS_HRRQ_VALID PMC_BIT32(30) 48889a36810SAnil Ravindranath #define INTRS_OPERATIONAL_STATUS PMC_BIT32(0) 489c20c4267SAnil Ravindranath #define INTRS_ALLOW_MSIX_VECTOR0 PMC_BIT32(31) 49089a36810SAnil Ravindranath 49189a36810SAnil Ravindranath /* Host to IOA Doorbells */ 49289a36810SAnil Ravindranath #define DOORBELL_RUNTIME_RESET PMC_BIT32(1) 49389a36810SAnil Ravindranath #define DOORBELL_IOA_RESET_ALERT PMC_BIT32(7) 49489a36810SAnil Ravindranath #define DOORBELL_IOA_DEBUG_ALERT PMC_BIT32(9) 49589a36810SAnil Ravindranath #define DOORBELL_ENABLE_DESTRUCTIVE_DIAGS PMC_BIT32(8) 49689a36810SAnil Ravindranath #define DOORBELL_IOA_START_BIST PMC_BIT32(23) 497c20c4267SAnil Ravindranath #define DOORBELL_INTR_MODE_MSIX PMC_BIT32(25) 498c20c4267SAnil Ravindranath #define DOORBELL_INTR_MSIX_CLR PMC_BIT32(26) 49989a36810SAnil Ravindranath #define DOORBELL_RESET_IOA PMC_BIT32(31) 50089a36810SAnil Ravindranath 50189a36810SAnil Ravindranath /* Global interrupt mask register value */ 502c20c4267SAnil Ravindranath #define GLOBAL_INTERRUPT_MASK 0x5ULL 50389a36810SAnil Ravindranath 50489a36810SAnil Ravindranath #define PMCRAID_ERROR_INTERRUPTS (INTRS_IOARCB_TRANSFER_FAILED | \ 50589a36810SAnil Ravindranath INTRS_IOA_UNIT_CHECK | \ 50689a36810SAnil Ravindranath INTRS_NO_HRRQ_FOR_CMD_RESPONSE | \ 50789a36810SAnil Ravindranath INTRS_IOARRIN_LOST | \ 50889a36810SAnil Ravindranath INTRS_SYSTEM_BUS_MMIO_ERROR | \ 50989a36810SAnil Ravindranath INTRS_IOA_PROCESSOR_ERROR) 51089a36810SAnil Ravindranath 51189a36810SAnil Ravindranath #define PMCRAID_PCI_INTERRUPTS (PMCRAID_ERROR_INTERRUPTS | \ 51289a36810SAnil Ravindranath INTRS_HRRQ_VALID | \ 513c20c4267SAnil Ravindranath INTRS_TRANSITION_TO_OPERATIONAL |\ 514c20c4267SAnil Ravindranath INTRS_ALLOW_MSIX_VECTOR0) 51589a36810SAnil Ravindranath 51689a36810SAnil Ravindranath /* control_block, associated with each of the commands contains IOARCB, IOADLs 51789a36810SAnil Ravindranath * memory for IOASA. Additional 3 * 16 bytes are allocated in order to support 51889a36810SAnil Ravindranath * additional request parameters (of max size 48) any command. 51989a36810SAnil Ravindranath */ 52089a36810SAnil Ravindranath struct pmcraid_control_block { 52189a36810SAnil Ravindranath struct pmcraid_ioarcb ioarcb; 52289a36810SAnil Ravindranath struct pmcraid_ioadl_desc ioadl[PMCRAID_IOADLS_EXTERNAL + 3]; 52389a36810SAnil Ravindranath struct pmcraid_ioasa ioasa; 52489a36810SAnil Ravindranath } __attribute__ ((packed, aligned(PMCRAID_IOARCB_ALIGNMENT))); 52589a36810SAnil Ravindranath 52689a36810SAnil Ravindranath /* pmcraid_sglist - Scatter-gather list allocated for passthrough ioctls 52789a36810SAnil Ravindranath */ 52889a36810SAnil Ravindranath struct pmcraid_sglist { 52989a36810SAnil Ravindranath u32 order; 53089a36810SAnil Ravindranath u32 num_sg; 53189a36810SAnil Ravindranath u32 num_dma_sg; 532ed4414ceSBart Van Assche struct scatterlist *scatterlist; 53389a36810SAnil Ravindranath }; 53489a36810SAnil Ravindranath 535c20c4267SAnil Ravindranath /* page D0 inquiry data of focal point resource */ 536c20c4267SAnil Ravindranath struct pmcraid_inquiry_data { 537c20c4267SAnil Ravindranath __u8 ph_dev_type; 538c20c4267SAnil Ravindranath __u8 page_code; 539c20c4267SAnil Ravindranath __u8 reserved1; 540c20c4267SAnil Ravindranath __u8 add_page_len; 541c20c4267SAnil Ravindranath __u8 length; 542c20c4267SAnil Ravindranath __u8 reserved2; 54345c80be6SArnd Bergmann __be16 fw_version; 544c20c4267SAnil Ravindranath __u8 reserved3[16]; 545c20c4267SAnil Ravindranath }; 546c20c4267SAnil Ravindranath 547592488a3SAnil Ravindranath #define PMCRAID_TIMESTAMP_LEN 12 548592488a3SAnil Ravindranath #define PMCRAID_REQ_TM_STR_LEN 6 549592488a3SAnil Ravindranath #define PMCRAID_SCSI_SET_TIMESTAMP 0xA4 550592488a3SAnil Ravindranath #define PMCRAID_SCSI_SERVICE_ACTION 0x0F 551592488a3SAnil Ravindranath 552592488a3SAnil Ravindranath struct pmcraid_timestamp_data { 553592488a3SAnil Ravindranath __u8 reserved1[4]; 554592488a3SAnil Ravindranath __u8 timestamp[PMCRAID_REQ_TM_STR_LEN]; /* current time value */ 555592488a3SAnil Ravindranath __u8 reserved2[2]; 556592488a3SAnil Ravindranath }; 557592488a3SAnil Ravindranath 55889a36810SAnil Ravindranath /* pmcraid_cmd - LLD representation of SCSI command */ 55989a36810SAnil Ravindranath struct pmcraid_cmd { 56089a36810SAnil Ravindranath 56189a36810SAnil Ravindranath /* Ptr and bus address of DMA.able control block for this command */ 56289a36810SAnil Ravindranath struct pmcraid_control_block *ioa_cb; 56389a36810SAnil Ravindranath dma_addr_t ioa_cb_bus_addr; 56489a36810SAnil Ravindranath dma_addr_t dma_handle; 56589a36810SAnil Ravindranath 56689a36810SAnil Ravindranath /* pointer to mid layer structure of SCSI commands */ 56789a36810SAnil Ravindranath struct scsi_cmnd *scsi_cmd; 56889a36810SAnil Ravindranath 56989a36810SAnil Ravindranath struct list_head free_list; 57089a36810SAnil Ravindranath struct completion wait_for_completion; 57189a36810SAnil Ravindranath struct timer_list timer; /* needed for internal commands */ 57289a36810SAnil Ravindranath u32 timeout; /* current timeout value */ 57389a36810SAnil Ravindranath u32 index; /* index into the command list */ 57489a36810SAnil Ravindranath u8 completion_req; /* for handling internal commands */ 57589a36810SAnil Ravindranath u8 release; /* for handling completions */ 57689a36810SAnil Ravindranath 57789a36810SAnil Ravindranath void (*cmd_done) (struct pmcraid_cmd *); 57889a36810SAnil Ravindranath struct pmcraid_instance *drv_inst; 57989a36810SAnil Ravindranath 58089a36810SAnil Ravindranath struct pmcraid_sglist *sglist; /* used for passthrough IOCTLs */ 58189a36810SAnil Ravindranath 582c20c4267SAnil Ravindranath /* scratch used */ 58389a36810SAnil Ravindranath union { 584c20c4267SAnil Ravindranath /* during reset sequence */ 58589a36810SAnil Ravindranath unsigned long time_left; 58689a36810SAnil Ravindranath struct pmcraid_resource_entry *res; 587c20c4267SAnil Ravindranath int hrrq_index; 588c20c4267SAnil Ravindranath 589c20c4267SAnil Ravindranath /* used during IO command error handling. Sense buffer 590c20c4267SAnil Ravindranath * for REQUEST SENSE command if firmware is not sending 591c20c4267SAnil Ravindranath * auto sense data 592c20c4267SAnil Ravindranath */ 593c20c4267SAnil Ravindranath struct { 594c20c4267SAnil Ravindranath u8 *sense_buffer; 595c20c4267SAnil Ravindranath dma_addr_t sense_buffer_dma; 596c20c4267SAnil Ravindranath }; 597c20c4267SAnil Ravindranath }; 59889a36810SAnil Ravindranath }; 59989a36810SAnil Ravindranath 60089a36810SAnil Ravindranath /* 60189a36810SAnil Ravindranath * Interrupt registers of IOA 60289a36810SAnil Ravindranath */ 60389a36810SAnil Ravindranath struct pmcraid_interrupts { 60489a36810SAnil Ravindranath void __iomem *ioa_host_interrupt_reg; 605c20c4267SAnil Ravindranath void __iomem *ioa_host_msix_interrupt_reg; 60689a36810SAnil Ravindranath void __iomem *ioa_host_interrupt_clr_reg; 60789a36810SAnil Ravindranath void __iomem *ioa_host_interrupt_mask_reg; 60889a36810SAnil Ravindranath void __iomem *ioa_host_interrupt_mask_clr_reg; 60989a36810SAnil Ravindranath void __iomem *global_interrupt_mask_reg; 61089a36810SAnil Ravindranath void __iomem *host_ioa_interrupt_reg; 61189a36810SAnil Ravindranath void __iomem *host_ioa_interrupt_clr_reg; 61289a36810SAnil Ravindranath }; 61389a36810SAnil Ravindranath 61489a36810SAnil Ravindranath /* ISR parameters LLD allocates (one for each MSI-X if enabled) vectors */ 61589a36810SAnil Ravindranath struct pmcraid_isr_param { 61689a36810SAnil Ravindranath struct pmcraid_instance *drv_inst; 617c20c4267SAnil Ravindranath u8 hrrq_id; /* hrrq entry index */ 61889a36810SAnil Ravindranath }; 61989a36810SAnil Ravindranath 620c20c4267SAnil Ravindranath 62189a36810SAnil Ravindranath /* AEN message header sent as part of event data to applications */ 62289a36810SAnil Ravindranath struct pmcraid_aen_msg { 62389a36810SAnil Ravindranath u32 hostno; 62489a36810SAnil Ravindranath u32 length; 62589a36810SAnil Ravindranath u8 reserved[8]; 6265febf6d6SGustavo A. R. Silva u8 data[]; 62789a36810SAnil Ravindranath }; 62889a36810SAnil Ravindranath 629c20c4267SAnil Ravindranath /* Controller state event message type */ 630c20c4267SAnil Ravindranath struct pmcraid_state_msg { 631c20c4267SAnil Ravindranath struct pmcraid_aen_msg msg; 632c20c4267SAnil Ravindranath u32 ioa_state; 633c20c4267SAnil Ravindranath }; 634c20c4267SAnil Ravindranath 635c20c4267SAnil Ravindranath #define PMC_DEVICE_EVENT_RESET_START 0x11000000 636c20c4267SAnil Ravindranath #define PMC_DEVICE_EVENT_RESET_SUCCESS 0x11000001 637c20c4267SAnil Ravindranath #define PMC_DEVICE_EVENT_RESET_FAILED 0x11000002 638c20c4267SAnil Ravindranath #define PMC_DEVICE_EVENT_SHUTDOWN_START 0x11000003 639c20c4267SAnil Ravindranath #define PMC_DEVICE_EVENT_SHUTDOWN_SUCCESS 0x11000004 640c20c4267SAnil Ravindranath #define PMC_DEVICE_EVENT_SHUTDOWN_FAILED 0x11000005 641c20c4267SAnil Ravindranath 64289a36810SAnil Ravindranath struct pmcraid_hostrcb { 64389a36810SAnil Ravindranath struct pmcraid_instance *drv_inst; 64489a36810SAnil Ravindranath struct pmcraid_aen_msg *msg; 64589a36810SAnil Ravindranath struct pmcraid_hcam_hdr *hcam; /* pointer to hcam buffer */ 64689a36810SAnil Ravindranath struct pmcraid_cmd *cmd; /* pointer to command block used */ 64789a36810SAnil Ravindranath dma_addr_t baddr; /* system address of hcam buffer */ 64889a36810SAnil Ravindranath atomic_t ignore; /* process HCAM response ? */ 64989a36810SAnil Ravindranath }; 65089a36810SAnil Ravindranath 65189a36810SAnil Ravindranath #define PMCRAID_AEN_HDR_SIZE sizeof(struct pmcraid_aen_msg) 65289a36810SAnil Ravindranath 65389a36810SAnil Ravindranath 65489a36810SAnil Ravindranath 65589a36810SAnil Ravindranath /* 65689a36810SAnil Ravindranath * Per adapter structure maintained by LLD 65789a36810SAnil Ravindranath */ 65889a36810SAnil Ravindranath struct pmcraid_instance { 65989a36810SAnil Ravindranath /* Array of allowed-to-be-exposed resources, initialized from 66089a36810SAnil Ravindranath * Configutation Table, later updated with CCNs 66189a36810SAnil Ravindranath */ 66289a36810SAnil Ravindranath struct pmcraid_resource_entry *res_entries; 66389a36810SAnil Ravindranath 66489a36810SAnil Ravindranath struct list_head free_res_q; /* res_entries lists for easy lookup */ 66589a36810SAnil Ravindranath struct list_head used_res_q; /* List of to be exposed resources */ 66689a36810SAnil Ravindranath spinlock_t resource_lock; /* spinlock to protect resource list */ 66789a36810SAnil Ravindranath 66889a36810SAnil Ravindranath void __iomem *mapped_dma_addr; 66989a36810SAnil Ravindranath void __iomem *ioa_status; /* Iomapped IOA status register */ 67089a36810SAnil Ravindranath void __iomem *mailbox; /* Iomapped mailbox register */ 67189a36810SAnil Ravindranath void __iomem *ioarrin; /* IOmapped IOARR IN register */ 67289a36810SAnil Ravindranath 67389a36810SAnil Ravindranath struct pmcraid_interrupts int_regs; 67489a36810SAnil Ravindranath struct pmcraid_chip_details *chip_cfg; 67589a36810SAnil Ravindranath 67689a36810SAnil Ravindranath /* HostRCBs needed for HCAM */ 67789a36810SAnil Ravindranath struct pmcraid_hostrcb ldn; 67889a36810SAnil Ravindranath struct pmcraid_hostrcb ccn; 679c20c4267SAnil Ravindranath struct pmcraid_state_msg scn; /* controller state change msg */ 68089a36810SAnil Ravindranath 68189a36810SAnil Ravindranath 68289a36810SAnil Ravindranath /* Bus address of start of HRRQ */ 68389a36810SAnil Ravindranath dma_addr_t hrrq_start_bus_addr[PMCRAID_NUM_MSIX_VECTORS]; 68489a36810SAnil Ravindranath 68589a36810SAnil Ravindranath /* Pointer to 1st entry of HRRQ */ 68645c80be6SArnd Bergmann __le32 *hrrq_start[PMCRAID_NUM_MSIX_VECTORS]; 68789a36810SAnil Ravindranath 68889a36810SAnil Ravindranath /* Pointer to last entry of HRRQ */ 68945c80be6SArnd Bergmann __le32 *hrrq_end[PMCRAID_NUM_MSIX_VECTORS]; 69089a36810SAnil Ravindranath 69189a36810SAnil Ravindranath /* Pointer to current pointer of hrrq */ 69245c80be6SArnd Bergmann __le32 *hrrq_curr[PMCRAID_NUM_MSIX_VECTORS]; 69389a36810SAnil Ravindranath 69489a36810SAnil Ravindranath /* Lock for HRRQ access */ 69589a36810SAnil Ravindranath spinlock_t hrrq_lock[PMCRAID_NUM_MSIX_VECTORS]; 69689a36810SAnil Ravindranath 697c20c4267SAnil Ravindranath struct pmcraid_inquiry_data *inq_data; 698c20c4267SAnil Ravindranath dma_addr_t inq_data_baddr; 699c20c4267SAnil Ravindranath 700592488a3SAnil Ravindranath struct pmcraid_timestamp_data *timestamp_data; 701592488a3SAnil Ravindranath dma_addr_t timestamp_data_baddr; 702592488a3SAnil Ravindranath 703c20c4267SAnil Ravindranath /* size of configuration table entry, varies based on the firmware */ 704c20c4267SAnil Ravindranath u32 config_table_entry_size; 705c20c4267SAnil Ravindranath 70689a36810SAnil Ravindranath /* Expected toggle bit at host */ 70789a36810SAnil Ravindranath u8 host_toggle_bit[PMCRAID_NUM_MSIX_VECTORS]; 70889a36810SAnil Ravindranath 70989a36810SAnil Ravindranath 71089a36810SAnil Ravindranath /* Wait Q for threads to wait for Reset IOA completion */ 71189a36810SAnil Ravindranath wait_queue_head_t reset_wait_q; 71289a36810SAnil Ravindranath struct pmcraid_cmd *reset_cmd; 71389a36810SAnil Ravindranath 71489a36810SAnil Ravindranath /* structures for supporting SIGIO based AEN. */ 71589a36810SAnil Ravindranath struct fasync_struct *aen_queue; 71689a36810SAnil Ravindranath struct mutex aen_queue_lock; /* lock for aen subscribers list */ 71789a36810SAnil Ravindranath struct cdev cdev; 71889a36810SAnil Ravindranath 71989a36810SAnil Ravindranath struct Scsi_Host *host; /* mid layer interface structure handle */ 72089a36810SAnil Ravindranath struct pci_dev *pdev; /* PCI device structure handle */ 72189a36810SAnil Ravindranath 722c20c4267SAnil Ravindranath /* No of Reset IOA retries . IOA marked dead if threshold exceeds */ 723c20c4267SAnil Ravindranath u8 ioa_reset_attempts; 724c20c4267SAnil Ravindranath #define PMCRAID_RESET_ATTEMPTS 3 725c20c4267SAnil Ravindranath 72689a36810SAnil Ravindranath u8 current_log_level; /* default level for logging IOASC errors */ 72789a36810SAnil Ravindranath 72889a36810SAnil Ravindranath u8 num_hrrq; /* Number of interrupt vectors allocated */ 729c20c4267SAnil Ravindranath u8 interrupt_mode; /* current interrupt mode legacy or msix */ 73089a36810SAnil Ravindranath dev_t dev; /* Major-Minor numbers for Char device */ 73189a36810SAnil Ravindranath 73289a36810SAnil Ravindranath /* Used as ISR handler argument */ 73389a36810SAnil Ravindranath struct pmcraid_isr_param hrrq_vector[PMCRAID_NUM_MSIX_VECTORS]; 73489a36810SAnil Ravindranath 735c20c4267SAnil Ravindranath /* Message id as filled in last fired IOARCB, used to identify HRRQ */ 736c20c4267SAnil Ravindranath atomic_t last_message_id; 737c20c4267SAnil Ravindranath 73889a36810SAnil Ravindranath /* configuration table */ 73989a36810SAnil Ravindranath struct pmcraid_config_table *cfg_table; 74089a36810SAnil Ravindranath dma_addr_t cfg_table_bus_addr; 74189a36810SAnil Ravindranath 74289a36810SAnil Ravindranath /* structures related to command blocks */ 74389a36810SAnil Ravindranath struct kmem_cache *cmd_cachep; /* cache for cmd blocks */ 744a7ec87a9SRomain Perier struct dma_pool *control_pool; /* pool for control blocks */ 74589a36810SAnil Ravindranath char cmd_pool_name[64]; /* name of cmd cache */ 74689a36810SAnil Ravindranath char ctl_pool_name[64]; /* name of control cache */ 74789a36810SAnil Ravindranath 74889a36810SAnil Ravindranath struct pmcraid_cmd *cmd_list[PMCRAID_MAX_CMD]; 74989a36810SAnil Ravindranath 75089a36810SAnil Ravindranath struct list_head free_cmd_pool; 75189a36810SAnil Ravindranath struct list_head pending_cmd_pool; 75289a36810SAnil Ravindranath spinlock_t free_pool_lock; /* free pool lock */ 75389a36810SAnil Ravindranath spinlock_t pending_pool_lock; /* pending pool lock */ 75489a36810SAnil Ravindranath 755c20c4267SAnil Ravindranath /* Tasklet to handle deferred processing */ 756c20c4267SAnil Ravindranath struct tasklet_struct isr_tasklet[PMCRAID_NUM_MSIX_VECTORS]; 757c20c4267SAnil Ravindranath 758c20c4267SAnil Ravindranath /* Work-queue (Shared) for deferred reset processing */ 759c20c4267SAnil Ravindranath struct work_struct worker_q; 760c20c4267SAnil Ravindranath 76189a36810SAnil Ravindranath /* No of IO commands pending with FW */ 76289a36810SAnil Ravindranath atomic_t outstanding_cmds; 76389a36810SAnil Ravindranath 76489a36810SAnil Ravindranath /* should add/delete resources to mid-layer now ?*/ 76589a36810SAnil Ravindranath atomic_t expose_resources; 76689a36810SAnil Ravindranath 76789a36810SAnil Ravindranath 76889a36810SAnil Ravindranath 76989a36810SAnil Ravindranath u32 ioa_state:4; /* For IOA Reset sequence FSM */ 77089a36810SAnil Ravindranath #define IOA_STATE_OPERATIONAL 0x0 77189a36810SAnil Ravindranath #define IOA_STATE_UNKNOWN 0x1 77289a36810SAnil Ravindranath #define IOA_STATE_DEAD 0x2 77389a36810SAnil Ravindranath #define IOA_STATE_IN_SOFT_RESET 0x3 77489a36810SAnil Ravindranath #define IOA_STATE_IN_HARD_RESET 0x4 77589a36810SAnil Ravindranath #define IOA_STATE_IN_RESET_ALERT 0x5 77689a36810SAnil Ravindranath #define IOA_STATE_IN_BRINGDOWN 0x6 77789a36810SAnil Ravindranath #define IOA_STATE_IN_BRINGUP 0x7 77889a36810SAnil Ravindranath 77989a36810SAnil Ravindranath u32 ioa_reset_in_progress:1; /* true if IOA reset is in progress */ 78089a36810SAnil Ravindranath u32 ioa_hard_reset:1; /* TRUE if Hard Reset is needed */ 78189a36810SAnil Ravindranath u32 ioa_unit_check:1; /* Indicates Unit Check condition */ 78289a36810SAnil Ravindranath u32 ioa_bringdown:1; /* whether IOA needs to be brought down */ 78389a36810SAnil Ravindranath u32 force_ioa_reset:1; /* force adapter reset ? */ 78489a36810SAnil Ravindranath u32 reinit_cfg_table:1; /* reinit config table due to lost CCN */ 78589a36810SAnil Ravindranath u32 ioa_shutdown_type:2;/* shutdown type used during reset */ 78689a36810SAnil Ravindranath #define SHUTDOWN_NONE 0x0 78789a36810SAnil Ravindranath #define SHUTDOWN_NORMAL 0x1 78889a36810SAnil Ravindranath #define SHUTDOWN_ABBREV 0x2 789592488a3SAnil Ravindranath u32 timestamp_error:1; /* indicate set timestamp for out of sync */ 79089a36810SAnil Ravindranath 79189a36810SAnil Ravindranath }; 79289a36810SAnil Ravindranath 79389a36810SAnil Ravindranath /* LLD maintained resource entry structure */ 79489a36810SAnil Ravindranath struct pmcraid_resource_entry { 79589a36810SAnil Ravindranath struct list_head queue; /* link to "to be exposed" resources */ 796c20c4267SAnil Ravindranath union { 79789a36810SAnil Ravindranath struct pmcraid_config_table_entry cfg_entry; 798c20c4267SAnil Ravindranath struct pmcraid_config_table_entry_ext cfg_entry_ext; 799c20c4267SAnil Ravindranath }; 80089a36810SAnil Ravindranath struct scsi_device *scsi_dev; /* Link scsi_device structure */ 80189a36810SAnil Ravindranath atomic_t read_failures; /* count of failed READ commands */ 80289a36810SAnil Ravindranath atomic_t write_failures; /* count of failed WRITE commands */ 80389a36810SAnil Ravindranath 80489a36810SAnil Ravindranath /* To indicate add/delete/modify during CCN */ 80589a36810SAnil Ravindranath u8 change_detected; 80689a36810SAnil Ravindranath #define RES_CHANGE_ADD 0x1 /* add this to mid-layer */ 80789a36810SAnil Ravindranath #define RES_CHANGE_DEL 0x2 /* remove this from mid-layer */ 80889a36810SAnil Ravindranath 80989a36810SAnil Ravindranath u8 reset_progress; /* Device is resetting */ 81089a36810SAnil Ravindranath 81189a36810SAnil Ravindranath /* 81289a36810SAnil Ravindranath * When IOA asks for sync (i.e. IOASC = Not Ready, Sync Required), this 81389a36810SAnil Ravindranath * flag will be set, mid layer will be asked to retry. In the next 81489a36810SAnil Ravindranath * attempt, this flag will be checked in queuecommand() to set 81589a36810SAnil Ravindranath * SYNC_COMPLETE flag in IOARCB (flag_0). 81689a36810SAnil Ravindranath */ 81789a36810SAnil Ravindranath u8 sync_reqd; 81889a36810SAnil Ravindranath 81989a36810SAnil Ravindranath /* target indicates the mapped target_id assigned to this resource if 82089a36810SAnil Ravindranath * this is VSET resource. For non-VSET resources this will be un-used 82189a36810SAnil Ravindranath * or zero 82289a36810SAnil Ravindranath */ 82389a36810SAnil Ravindranath u8 target; 82489a36810SAnil Ravindranath }; 82589a36810SAnil Ravindranath 82689a36810SAnil Ravindranath /* Data structures used in IOASC error code logging */ 82789a36810SAnil Ravindranath struct pmcraid_ioasc_error { 82889a36810SAnil Ravindranath u32 ioasc_code; /* IOASC code */ 82989a36810SAnil Ravindranath u8 log_level; /* default log level assignment. */ 83089a36810SAnil Ravindranath char *error_string; 83189a36810SAnil Ravindranath }; 83289a36810SAnil Ravindranath 83389a36810SAnil Ravindranath /* Initial log_level assignments for various IOASCs */ 83489a36810SAnil Ravindranath #define IOASC_LOG_LEVEL_NONE 0x0 /* no logging */ 83589a36810SAnil Ravindranath #define IOASC_LOG_LEVEL_MUST 0x1 /* must log: all high-severity errors */ 83689a36810SAnil Ravindranath #define IOASC_LOG_LEVEL_HARD 0x2 /* optional – low severity errors */ 83789a36810SAnil Ravindranath 83889a36810SAnil Ravindranath /* Error information maintained by LLD. LLD initializes the pmcraid_error_table 83989a36810SAnil Ravindranath * statically. 84089a36810SAnil Ravindranath */ 84189a36810SAnil Ravindranath static struct pmcraid_ioasc_error pmcraid_ioasc_error_table[] = { 842c20c4267SAnil Ravindranath {0x01180600, IOASC_LOG_LEVEL_HARD, 84389a36810SAnil Ravindranath "Recovered Error, soft media error, sector reassignment suggested"}, 844c20c4267SAnil Ravindranath {0x015D0000, IOASC_LOG_LEVEL_HARD, 845de490254SMasanari Iida "Recovered Error, failure prediction threshold exceeded"}, 846c20c4267SAnil Ravindranath {0x015D9200, IOASC_LOG_LEVEL_HARD, 847de490254SMasanari Iida "Recovered Error, soft Cache Card Battery error threshold"}, 848c20c4267SAnil Ravindranath {0x015D9200, IOASC_LOG_LEVEL_HARD, 849de490254SMasanari Iida "Recovered Error, soft Cache Card Battery error threshold"}, 850c20c4267SAnil Ravindranath {0x02048000, IOASC_LOG_LEVEL_HARD, 85189a36810SAnil Ravindranath "Not Ready, IOA Reset Required"}, 852c20c4267SAnil Ravindranath {0x02408500, IOASC_LOG_LEVEL_HARD, 85389a36810SAnil Ravindranath "Not Ready, IOA microcode download required"}, 854c20c4267SAnil Ravindranath {0x03110B00, IOASC_LOG_LEVEL_HARD, 85589a36810SAnil Ravindranath "Medium Error, data unreadable, reassignment suggested"}, 85689a36810SAnil Ravindranath {0x03110C00, IOASC_LOG_LEVEL_MUST, 85789a36810SAnil Ravindranath "Medium Error, data unreadable do not reassign"}, 858c20c4267SAnil Ravindranath {0x03310000, IOASC_LOG_LEVEL_HARD, 85989a36810SAnil Ravindranath "Medium Error, media corrupted"}, 860c20c4267SAnil Ravindranath {0x04050000, IOASC_LOG_LEVEL_HARD, 86189a36810SAnil Ravindranath "Hardware Error, IOA can't communicate with device"}, 86289a36810SAnil Ravindranath {0x04080000, IOASC_LOG_LEVEL_MUST, 86389a36810SAnil Ravindranath "Hardware Error, device bus error"}, 864c20c4267SAnil Ravindranath {0x04088000, IOASC_LOG_LEVEL_MUST, 86589a36810SAnil Ravindranath "Hardware Error, device bus is not functioning"}, 866c20c4267SAnil Ravindranath {0x04118000, IOASC_LOG_LEVEL_HARD, 86789a36810SAnil Ravindranath "Hardware Error, IOA reserved area data check"}, 868c20c4267SAnil Ravindranath {0x04118100, IOASC_LOG_LEVEL_HARD, 86989a36810SAnil Ravindranath "Hardware Error, IOA reserved area invalid data pattern"}, 870c20c4267SAnil Ravindranath {0x04118200, IOASC_LOG_LEVEL_HARD, 87189a36810SAnil Ravindranath "Hardware Error, IOA reserved area LRC error"}, 872c20c4267SAnil Ravindranath {0x04320000, IOASC_LOG_LEVEL_HARD, 87389a36810SAnil Ravindranath "Hardware Error, reassignment space exhausted"}, 874c20c4267SAnil Ravindranath {0x04330000, IOASC_LOG_LEVEL_HARD, 87589a36810SAnil Ravindranath "Hardware Error, data transfer underlength error"}, 876c20c4267SAnil Ravindranath {0x04330000, IOASC_LOG_LEVEL_HARD, 87789a36810SAnil Ravindranath "Hardware Error, data transfer overlength error"}, 87889a36810SAnil Ravindranath {0x04418000, IOASC_LOG_LEVEL_MUST, 87989a36810SAnil Ravindranath "Hardware Error, PCI bus error"}, 880c20c4267SAnil Ravindranath {0x04440000, IOASC_LOG_LEVEL_HARD, 88189a36810SAnil Ravindranath "Hardware Error, device error"}, 882c20c4267SAnil Ravindranath {0x04448200, IOASC_LOG_LEVEL_MUST, 883c20c4267SAnil Ravindranath "Hardware Error, IOA error"}, 884c20c4267SAnil Ravindranath {0x04448300, IOASC_LOG_LEVEL_HARD, 88589a36810SAnil Ravindranath "Hardware Error, undefined device response"}, 886c20c4267SAnil Ravindranath {0x04448400, IOASC_LOG_LEVEL_HARD, 88789a36810SAnil Ravindranath "Hardware Error, IOA microcode error"}, 888c20c4267SAnil Ravindranath {0x04448600, IOASC_LOG_LEVEL_HARD, 88989a36810SAnil Ravindranath "Hardware Error, IOA reset required"}, 890c20c4267SAnil Ravindranath {0x04449200, IOASC_LOG_LEVEL_HARD, 89189a36810SAnil Ravindranath "Hardware Error, hard Cache Fearuee Card Battery error"}, 892c20c4267SAnil Ravindranath {0x0444A000, IOASC_LOG_LEVEL_HARD, 89389a36810SAnil Ravindranath "Hardware Error, failed device altered"}, 894c20c4267SAnil Ravindranath {0x0444A200, IOASC_LOG_LEVEL_HARD, 89589a36810SAnil Ravindranath "Hardware Error, data check after reassignment"}, 896c20c4267SAnil Ravindranath {0x0444A300, IOASC_LOG_LEVEL_HARD, 89789a36810SAnil Ravindranath "Hardware Error, LRC error after reassignment"}, 898c20c4267SAnil Ravindranath {0x044A0000, IOASC_LOG_LEVEL_HARD, 89989a36810SAnil Ravindranath "Hardware Error, device bus error (msg/cmd phase)"}, 900c20c4267SAnil Ravindranath {0x04670400, IOASC_LOG_LEVEL_HARD, 90189a36810SAnil Ravindranath "Hardware Error, new device can't be used"}, 902c20c4267SAnil Ravindranath {0x04678000, IOASC_LOG_LEVEL_HARD, 90389a36810SAnil Ravindranath "Hardware Error, invalid multiadapter configuration"}, 904c20c4267SAnil Ravindranath {0x04678100, IOASC_LOG_LEVEL_HARD, 90589a36810SAnil Ravindranath "Hardware Error, incorrect connection between enclosures"}, 906c20c4267SAnil Ravindranath {0x04678200, IOASC_LOG_LEVEL_HARD, 90789a36810SAnil Ravindranath "Hardware Error, connections exceed IOA design limits"}, 908c20c4267SAnil Ravindranath {0x04678300, IOASC_LOG_LEVEL_HARD, 90989a36810SAnil Ravindranath "Hardware Error, incorrect multipath connection"}, 910c20c4267SAnil Ravindranath {0x04679000, IOASC_LOG_LEVEL_HARD, 91189a36810SAnil Ravindranath "Hardware Error, command to LUN failed"}, 91289a36810SAnil Ravindranath {0x064C8000, IOASC_LOG_LEVEL_HARD, 91389a36810SAnil Ravindranath "Unit Attention, cache exists for missing/failed device"}, 91489a36810SAnil Ravindranath {0x06670100, IOASC_LOG_LEVEL_HARD, 91589a36810SAnil Ravindranath "Unit Attention, incompatible exposed mode device"}, 91689a36810SAnil Ravindranath {0x06670600, IOASC_LOG_LEVEL_HARD, 91789a36810SAnil Ravindranath "Unit Attention, attachment of logical unit failed"}, 918c20c4267SAnil Ravindranath {0x06678000, IOASC_LOG_LEVEL_HARD, 91989a36810SAnil Ravindranath "Unit Attention, cables exceed connective design limit"}, 920c20c4267SAnil Ravindranath {0x06678300, IOASC_LOG_LEVEL_HARD, 92189a36810SAnil Ravindranath "Unit Attention, incomplete multipath connection between" \ 92289a36810SAnil Ravindranath "IOA and enclosure"}, 923c20c4267SAnil Ravindranath {0x06678400, IOASC_LOG_LEVEL_HARD, 92489a36810SAnil Ravindranath "Unit Attention, incomplete multipath connection between" \ 92589a36810SAnil Ravindranath "device and enclosure"}, 926c20c4267SAnil Ravindranath {0x06678500, IOASC_LOG_LEVEL_HARD, 92789a36810SAnil Ravindranath "Unit Attention, incomplete multipath connection between" \ 92889a36810SAnil Ravindranath "IOA and remote IOA"}, 92989a36810SAnil Ravindranath {0x06678600, IOASC_LOG_LEVEL_HARD, 93089a36810SAnil Ravindranath "Unit Attention, missing remote IOA"}, 93189a36810SAnil Ravindranath {0x06679100, IOASC_LOG_LEVEL_HARD, 93289a36810SAnil Ravindranath "Unit Attention, enclosure doesn't support required multipath" \ 93389a36810SAnil Ravindranath "function"}, 93489a36810SAnil Ravindranath {0x06698200, IOASC_LOG_LEVEL_HARD, 93589a36810SAnil Ravindranath "Unit Attention, corrupt array parity detected on device"}, 936c20c4267SAnil Ravindranath {0x066B0200, IOASC_LOG_LEVEL_HARD, 93789a36810SAnil Ravindranath "Unit Attention, array exposed"}, 93889a36810SAnil Ravindranath {0x066B8200, IOASC_LOG_LEVEL_HARD, 93989a36810SAnil Ravindranath "Unit Attention, exposed array is still protected"}, 940c20c4267SAnil Ravindranath {0x066B9200, IOASC_LOG_LEVEL_HARD, 94189a36810SAnil Ravindranath "Unit Attention, Multipath redundancy level got worse"}, 94289a36810SAnil Ravindranath {0x07270000, IOASC_LOG_LEVEL_HARD, 94389a36810SAnil Ravindranath "Data Protect, device is read/write protected by IOA"}, 94489a36810SAnil Ravindranath {0x07278000, IOASC_LOG_LEVEL_HARD, 94589a36810SAnil Ravindranath "Data Protect, IOA doesn't support device attribute"}, 94689a36810SAnil Ravindranath {0x07278100, IOASC_LOG_LEVEL_HARD, 94789a36810SAnil Ravindranath "Data Protect, NVRAM mirroring prohibited"}, 948c20c4267SAnil Ravindranath {0x07278400, IOASC_LOG_LEVEL_HARD, 94989a36810SAnil Ravindranath "Data Protect, array is short 2 or more devices"}, 950c20c4267SAnil Ravindranath {0x07278600, IOASC_LOG_LEVEL_HARD, 95189a36810SAnil Ravindranath "Data Protect, exposed array is short a required device"}, 952c20c4267SAnil Ravindranath {0x07278700, IOASC_LOG_LEVEL_HARD, 95389a36810SAnil Ravindranath "Data Protect, array members not at required addresses"}, 954c20c4267SAnil Ravindranath {0x07278800, IOASC_LOG_LEVEL_HARD, 95589a36810SAnil Ravindranath "Data Protect, exposed mode device resource address conflict"}, 956c20c4267SAnil Ravindranath {0x07278900, IOASC_LOG_LEVEL_HARD, 95789a36810SAnil Ravindranath "Data Protect, incorrect resource address of exposed mode device"}, 958c20c4267SAnil Ravindranath {0x07278A00, IOASC_LOG_LEVEL_HARD, 95989a36810SAnil Ravindranath "Data Protect, Array is missing a device and parity is out of sync"}, 960c20c4267SAnil Ravindranath {0x07278B00, IOASC_LOG_LEVEL_HARD, 96189a36810SAnil Ravindranath "Data Protect, maximum number of arrays already exist"}, 96289a36810SAnil Ravindranath {0x07278C00, IOASC_LOG_LEVEL_HARD, 96389a36810SAnil Ravindranath "Data Protect, cannot locate cache data for device"}, 96489a36810SAnil Ravindranath {0x07278D00, IOASC_LOG_LEVEL_HARD, 96589a36810SAnil Ravindranath "Data Protect, cache data exits for a changed device"}, 966c20c4267SAnil Ravindranath {0x07279100, IOASC_LOG_LEVEL_HARD, 96789a36810SAnil Ravindranath "Data Protect, detection of a device requiring format"}, 968c20c4267SAnil Ravindranath {0x07279200, IOASC_LOG_LEVEL_HARD, 96989a36810SAnil Ravindranath "Data Protect, IOA exceeds maximum number of devices"}, 970c20c4267SAnil Ravindranath {0x07279600, IOASC_LOG_LEVEL_HARD, 97189a36810SAnil Ravindranath "Data Protect, missing array, volume set is not functional"}, 972c20c4267SAnil Ravindranath {0x07279700, IOASC_LOG_LEVEL_HARD, 97389a36810SAnil Ravindranath "Data Protect, single device for a volume set"}, 974c20c4267SAnil Ravindranath {0x07279800, IOASC_LOG_LEVEL_HARD, 97589a36810SAnil Ravindranath "Data Protect, missing multiple devices for a volume set"}, 97689a36810SAnil Ravindranath {0x07279900, IOASC_LOG_LEVEL_HARD, 97789a36810SAnil Ravindranath "Data Protect, maximum number of volument sets already exists"}, 978c20c4267SAnil Ravindranath {0x07279A00, IOASC_LOG_LEVEL_HARD, 97989a36810SAnil Ravindranath "Data Protect, other volume set problem"}, 98089a36810SAnil Ravindranath }; 98189a36810SAnil Ravindranath 98289a36810SAnil Ravindranath /* macros to help in debugging */ 98389a36810SAnil Ravindranath #define pmcraid_err(...) \ 98489a36810SAnil Ravindranath printk(KERN_ERR "MaxRAID: "__VA_ARGS__) 98589a36810SAnil Ravindranath 98689a36810SAnil Ravindranath #define pmcraid_info(...) \ 98789a36810SAnil Ravindranath if (pmcraid_debug_log) \ 98889a36810SAnil Ravindranath printk(KERN_INFO "MaxRAID: "__VA_ARGS__) 98989a36810SAnil Ravindranath 99089a36810SAnil Ravindranath /* check if given command is a SCSI READ or SCSI WRITE command */ 99189a36810SAnil Ravindranath #define SCSI_READ_CMD 0x1 /* any of SCSI READ commands */ 99289a36810SAnil Ravindranath #define SCSI_WRITE_CMD 0x2 /* any of SCSI WRITE commands */ 99389a36810SAnil Ravindranath #define SCSI_CMD_TYPE(opcode) \ 99489a36810SAnil Ravindranath ({ u8 op = opcode; u8 __type = 0;\ 99589a36810SAnil Ravindranath if (op == READ_6 || op == READ_10 || op == READ_12 || op == READ_16)\ 99689a36810SAnil Ravindranath __type = SCSI_READ_CMD;\ 99789a36810SAnil Ravindranath else if (op == WRITE_6 || op == WRITE_10 || op == WRITE_12 || \ 99889a36810SAnil Ravindranath op == WRITE_16)\ 99989a36810SAnil Ravindranath __type = SCSI_WRITE_CMD;\ 100089a36810SAnil Ravindranath __type;\ 100189a36810SAnil Ravindranath }) 100289a36810SAnil Ravindranath 100389a36810SAnil Ravindranath #define IS_SCSI_READ_WRITE(opcode) \ 100489a36810SAnil Ravindranath ({ u8 __type = SCSI_CMD_TYPE(opcode); \ 100589a36810SAnil Ravindranath (__type == SCSI_READ_CMD || __type == SCSI_WRITE_CMD) ? 1 : 0;\ 100689a36810SAnil Ravindranath }) 100789a36810SAnil Ravindranath 100889a36810SAnil Ravindranath 100989a36810SAnil Ravindranath /* 101025985edcSLucas De Marchi * pmcraid_ioctl_header - definition of header structure that precedes all the 10113ad2f3fbSDaniel Mack * buffers given as ioctl arguments. 101289a36810SAnil Ravindranath * 101389a36810SAnil Ravindranath * .signature : always ASCII string, "PMCRAID" 101489a36810SAnil Ravindranath * .reserved : not used 101589a36810SAnil Ravindranath * .buffer_length : length of the buffer following the header 101689a36810SAnil Ravindranath */ 101789a36810SAnil Ravindranath struct pmcraid_ioctl_header { 101889a36810SAnil Ravindranath u8 signature[8]; 101989a36810SAnil Ravindranath u32 reserved; 102089a36810SAnil Ravindranath u32 buffer_length; 102189a36810SAnil Ravindranath }; 102289a36810SAnil Ravindranath 102389a36810SAnil Ravindranath #define PMCRAID_IOCTL_SIGNATURE "PMCRAID" 102489a36810SAnil Ravindranath 102589a36810SAnil Ravindranath /* 102689a36810SAnil Ravindranath * keys to differentiate between driver handled IOCTLs and passthrough 102789a36810SAnil Ravindranath * IOCTLs passed to IOA. driver determines the ioctl type using macro 102889a36810SAnil Ravindranath * _IOC_TYPE 102989a36810SAnil Ravindranath */ 103089a36810SAnil Ravindranath #define PMCRAID_DRIVER_IOCTL 'D' 103189a36810SAnil Ravindranath 103289a36810SAnil Ravindranath #define DRV_IOCTL(n, size) \ 103389a36810SAnil Ravindranath _IOC(_IOC_READ|_IOC_WRITE, PMCRAID_DRIVER_IOCTL, (n), (size)) 103489a36810SAnil Ravindranath 103589a36810SAnil Ravindranath /* 103689a36810SAnil Ravindranath * _ARGSIZE: macro that gives size of the argument type passed to an IOCTL cmd. 103789a36810SAnil Ravindranath * This is to facilitate applications avoiding un-necessary memory allocations. 103889a36810SAnil Ravindranath * For example, most of driver handled ioctls do not require ioarcb, ioasa. 103989a36810SAnil Ravindranath */ 104089a36810SAnil Ravindranath #define _ARGSIZE(arg) (sizeof(struct pmcraid_ioctl_header) + sizeof(arg)) 104189a36810SAnil Ravindranath 104289a36810SAnil Ravindranath /* Driver handled IOCTL command definitions */ 104389a36810SAnil Ravindranath 104489a36810SAnil Ravindranath #define PMCRAID_IOCTL_RESET_ADAPTER \ 104589a36810SAnil Ravindranath DRV_IOCTL(5, sizeof(struct pmcraid_ioctl_header)) 104689a36810SAnil Ravindranath 104789a36810SAnil Ravindranath #endif /* _PMCRAID_H */ 1048