/* SPDX-License-Identifier: GPL-2.0 */
/*
* Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
*
* This driver supports the newer, SCSI-based firmware interface only.
*
* Copyright 2018 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
*
* Based on the original DAC960 driver, which has
* Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
* Portions Copyright 2002 by Mylex (An IBM Business Unit)
*/
#ifndef _MYRS_H
#define _MYRS_H
#define MYRS_MAILBOX_TIMEOUT 1000000
#define MYRS_DCMD_TAG 1
#define MYRS_MCMD_TAG 2
#define MYRS_LINE_BUFFER_SIZE 128
#define MYRS_PRIMARY_MONITOR_INTERVAL (10 * HZ)
#define MYRS_SECONDARY_MONITOR_INTERVAL (60 * HZ)
/* Maximum number of Scatter/Gather Segments supported */
#define MYRS_SG_LIMIT 128
/*
* Number of Command and Status Mailboxes used by the
* DAC960 V2 Firmware Memory Mailbox Interface.
*/
#define MYRS_MAX_CMD_MBOX 512
#define MYRS_MAX_STAT_MBOX 512
#define MYRS_DCDB_SIZE 16
#define MYRS_SENSE_SIZE 14
/*
* DAC960 V2 Firmware Command Opcodes.
*/
enum myrs_cmd_opcode {
MYRS_CMD_OP_MEMCOPY = 0x01,
MYRS_CMD_OP_SCSI_10_PASSTHRU = 0x02,
MYRS_CMD_OP_SCSI_255_PASSTHRU = 0x03,
MYRS_CMD_OP_SCSI_10 = 0x04,
MYRS_CMD_OP_SCSI_256 = 0x05,
MYRS_CMD_OP_IOCTL = 0x20,
} __packed;
/*
* DAC960 V2 Firmware IOCTL Opcodes.
*/
enum myrs_ioctl_opcode {
MYRS_IOCTL_GET_CTLR_INFO = 0x01,
MYRS_IOCTL_GET_LDEV_INFO_VALID = 0x03,
MYRS_IOCTL_GET_PDEV_INFO_VALID = 0x05,
MYRS_IOCTL_GET_HEALTH_STATUS = 0x11,
MYRS_IOCTL_GET_EVENT = 0x15,
MYRS_IOCTL_START_DISCOVERY = 0x81,
MYRS_IOCTL_SET_DEVICE_STATE = 0x82,
MYRS_IOCTL_INIT_PDEV_START = 0x84,
MYRS_IOCTL_INIT_PDEV_STOP = 0x85,
MYRS_IOCTL_INIT_LDEV_START = 0x86,
MYRS_IOCTL_INIT_LDEV_STOP = 0x87,
MYRS_IOCTL_RBLD_DEVICE_START = 0x88,
MYRS_IOCTL_RBLD_DEVICE_STOP = 0x89,
MYRS_IOCTL_MAKE_CONSISTENT_START = 0x8A,
MYRS_IOCTL_MAKE_CONSISTENT_STOP = 0x8B,
MYRS_IOCTL_CC_START = 0x8C,
MYRS_IOCTL_CC_STOP = 0x8D,
MYRS_IOCTL_SET_MEM_MBOX = 0x8E,
MYRS_IOCTL_RESET_DEVICE = 0x90,
MYRS_IOCTL_FLUSH_DEVICE_DATA = 0x91,
MYRS_IOCTL_PAUSE_DEVICE = 0x92,
MYRS_IOCTL_UNPAUS_EDEVICE = 0x93,
MYRS_IOCTL_LOCATE_DEVICE = 0x94,
MYRS_IOCTL_CREATE_CONFIGURATION = 0xC0,
MYRS_IOCTL_DELETE_LDEV = 0xC1,
MYRS_IOCTL_REPLACE_INTERNALDEVICE = 0xC2,
MYRS_IOCTL_RENAME_LDEV = 0xC3,
MYRS_IOCTL_ADD_CONFIGURATION = 0xC4,
MYRS_IOCTL_XLATE_PDEV_TO_LDEV = 0xC5,
MYRS_IOCTL_CLEAR_CONFIGURATION = 0xCA,
} __packed;
/*
* DAC960 V2 Firmware Command Status Codes.
*/
#define MYRS_STATUS_SUCCESS 0x00
#define MYRS_STATUS_FAILED 0x02
#define MYRS_STATUS_DEVICE_BUSY 0x08
#define MYRS_STATUS_DEVICE_NON_RESPONSIVE 0x0E
#define MYRS_STATUS_DEVICE_NON_RESPONSIVE2 0x0F
#define MYRS_STATUS_RESERVATION_CONFLICT 0x18
/*
* DAC960 V2 Firmware Memory Type structure.
*/
struct myrs_mem_type {
enum {
MYRS_MEMTYPE_RESERVED = 0x00,
MYRS_MEMTYPE_DRAM = 0x01,
MYRS_MEMTYPE_EDRAM = 0x02,
MYRS_MEMTYPE_EDO = 0x03,
MYRS_MEMTYPE_SDRAM = 0x04,
MYRS_MEMTYPE_LAST = 0x1F,
} __packed mem_type:5; /* Byte 0 Bits 0-4 */
unsigned rsvd:1; /* Byte 0 Bit 5 */
unsigned mem_parity:1; /* Byte 0 Bit 6 */
unsigned mem_ecc:1; /* Byte 0 Bit 7 */
};
/*
* DAC960 V2 Firmware Processor Type structure.
*/
enum myrs_cpu_type {
MYRS_CPUTYPE_i960CA = 0x01,
MYRS_CPUTYPE_i960RD = 0x02,
MYRS_CPUTYPE_i960RN = 0x03,
MYRS_CPUTYPE_i960RP = 0x04,
MYRS_CPUTYPE_NorthBay = 0x05,
MYRS_CPUTYPE_StrongArm = 0x06,
MYRS_CPUTYPE_i960RM = 0x07,
} __packed;
/*
* DAC960 V2 Firmware Get Controller Info reply structure.
*/
struct myrs_ctlr_info {
unsigned char rsvd1; /* Byte 0 */
enum {
MYRS_SCSI_BUS = 0x00,
MYRS_Fibre_BUS = 0x01,
MYRS_PCI_BUS = 0x03
} __packed bus; /* Byte 1 */
enum {
MYRS_CTLR_DAC960E = 0x01,
MYRS_CTLR_DAC960M = 0x08,
MYRS_CTLR_DAC960PD = 0x10,
MYRS_CTLR_DAC960PL = 0x11,
MYRS_CTLR_DAC960PU = 0x12,
MYRS_CTLR_DAC960PE = 0x13,
MYRS_CTLR_DAC960PG = 0x14,
MYRS_CTLR_DAC960PJ = 0x15,
MYRS_CTLR_DAC960PTL0 = 0x16,
MYRS_CTLR_DAC960PR = 0x17,
MYRS_CTLR_DAC960PRL = 0x18,
MYRS_CTLR_DAC960PT = 0x19,
MYRS_CTLR_DAC1164P = 0x1A,
MYRS_CTLR_DAC960PTL1 = 0x1B,
MYRS_CTLR_EXR2000P = 0x1C,
MYRS_CTLR_EXR3000P = 0x1D,
MYRS_CTLR_ACCELERAID352 = 0x1E,
MYRS_CTLR_ACCELERAID170 = 0x1F,
MYRS_CTLR_ACCELERAID160 = 0x20,
MYRS_CTLR_DAC960S = 0x60,
MYRS_CTLR_DAC960SU = 0x61,
MYRS_CTLR_DAC960SX = 0x62,
MYRS_CTLR_DAC960SF = 0x63,
MYRS_CTLR_DAC960SS = 0x64,
MYRS_CTLR_DAC960FL = 0x65,
MYRS_CTLR_DAC960LL = 0x66,
MYRS_CTLR_DAC960FF = 0x67,
MYRS_CTLR_DAC960HP = 0x68,
MYRS_CTLR_RAIDBRICK = 0x69,
MYRS_CTLR_METEOR_FL = 0x6A,
MYRS_CTLR_METEOR_FF = 0x6B
} __packed ctlr_type; /* Byte 2 */
unsigned char rsvd2; /* Byte 3 */
unsigned short bus_speed_mhz; /* Bytes 4-5 */
unsigned char bus_width; /* Byte 6 */
unsigned char flash_code; /* Byte 7 */
unsigned char ports_present; /* Byte 8 */
unsigned char rsvd3[7]; /* Bytes 9-15 */
unsigned char bus_name[16]; /* Bytes 16-31 */
unsigned char ctlr_name[16]; /* Bytes 32-47 */
unsigned char rsvd4[16]; /* Bytes 48-63 */
/* Firmware Release Information */
unsigned char fw_major_version; /* Byte 64 */
unsigned char fw_minor_version; /* Byte 65 */
unsigned char fw_turn_number; /* Byte 66 */
unsigned char fw_build_number; /* Byte 67 */
unsigned