189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * pmcraid.h -- PMC Sierra MaxRAID controller driver header file 389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 4729c845666be7092a52bf6fcdcf223fe4d9287a4Anil Ravindranath * Written By: Anil Ravindranath<anil_ravindranath@pmc-sierra.com> 5729c845666be7092a52bf6fcdcf223fe4d9287a4Anil Ravindranath * PMC-Sierra Inc 6729c845666be7092a52bf6fcdcf223fe4d9287a4Anil Ravindranath * 789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Copyright (C) 2008, 2009 PMC Sierra Inc. 889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * This program is free software; you can redistribute it and/or modify 1089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * it under the terms of the GNU General Public License as published by 1189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * the Free Software Foundation; either version 2 of the License, or 1289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * (at your option) any later version. 1389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 1489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * This program is distributed in the hope that it will be useful, 1589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * but WITHOUT ANY WARRANTY; without even the implied warranty of 1689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * GNU General Public License for more details. 1889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 1989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * You should have received a copy of the GNU General Public License 2089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * along with this program; if not, write to the Free Software 2189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 2289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 2389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 2489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#ifndef _PMCRAID_H 2589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define _PMCRAID_H 2689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 2789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <linux/types.h> 2889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <linux/completion.h> 2989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <linux/list.h> 3089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <scsi/scsi.h> 3189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <scsi/scsi_cmnd.h> 3289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <linux/cdev.h> 3389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <net/netlink.h> 3489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <net/genetlink.h> 3589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#include <linux/connector.h> 3689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 3789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Driver name : string representing the driver name 3889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Device file : /dev file to be used for management interfaces 3989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Driver version: version string in major_version.minor_version.patch format 4089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Driver date : date information in "Mon dd yyyy" format 4189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 42c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_DRIVER_NAME "PMC MaxRAID" 4389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_DEVFILE "pmcsas" 445da61410054d125e63aeab9cc7a11874a69465c0Anil Ravindranath#define PMCRAID_DRIVER_VERSION "1.0.3" 45c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 46c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_FW_VERSION_1 0x002 4789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 4889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Maximum number of adapters supported by current version of the driver */ 4989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_ADAPTERS 1024 5089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 5189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Bit definitions as per firmware, bit position [0][1][2].....[31] */ 5289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMC_BIT8(n) (1 << (7-n)) 5389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMC_BIT16(n) (1 << (15-n)) 5489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMC_BIT32(n) (1 << (31-n)) 5589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 5689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* PMC PCI vendor ID and device ID values */ 5789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PCI_VENDOR_ID_PMC 0x11F8 5889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PCI_DEVICE_ID_PMC_MAXRAID 0x5220 5989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 6089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 6189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * MAX_CMD : maximum commands that can be outstanding with IOA 6289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * MAX_IO_CMD : command blocks available for IO commands 6389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * MAX_HCAM_CMD : command blocks avaibale for HCAMS 6489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * MAX_INTERNAL_CMD : command blocks avaible for internal commands like reset 6589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 6689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_CMD 1024 6789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_IO_CMD 1020 6889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_HCAM_CMD 2 6989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_INTERNAL_CMD 2 7089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 7189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* MAX_IOADLS : max number of scatter-gather lists supported by IOA 7289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * IOADLS_INTERNAL : number of ioadls included as part of IOARCB. 7389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * IOADLS_EXTERNAL : number of ioadls allocated external to IOARCB 7489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 7589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOADLS_INTERNAL 27 7689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOADLS_EXTERNAL 37 7789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_IOADLS PMCRAID_IOADLS_INTERNAL 7889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 7989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* HRRQ_ENTRY_SIZE : size of hrrq buffer 8089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * IOARCB_ALIGNMENT : alignment required for IOARCB 8189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * IOADL_ALIGNMENT : alignment requirement for IOADLs 8289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * MSIX_VECTORS : number of MSIX vectors supported 8389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 8489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HRRQ_ENTRY_SIZE sizeof(__le32) 8589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOARCB_ALIGNMENT 32 8689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOADL_ALIGNMENT 16 8789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASA_ALIGNMENT 4 88c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_NUM_MSIX_VECTORS 16 8989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 9089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* various other limits */ 91c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_VENDOR_ID_LEN 8 92c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_PRODUCT_ID_LEN 16 93c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_SERIAL_NUM_LEN 8 94c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_LUN_LEN 8 95c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_MAX_CDB_LEN 16 96c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_DEVICE_ID_LEN 8 97c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_SENSE_DATA_LEN 256 98c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_ADD_CMD_PARAM_LEN 48 9989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 10089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_BUS_TO_SCAN 1 10189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_NUM_TARGETS_PER_BUS 256 10289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_NUM_LUNS_PER_TARGET 8 10389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 10489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* IOA bus/target/lun number of IOA resources */ 10589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOA_BUS_ID 0xfe 10689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOA_TARGET_ID 0xff 10789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOA_LUN_ID 0xff 10889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_VSET_BUS_ID 0x1 10989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_VSET_LUN_ID 0x0 11089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_PHYS_BUS_ID 0x0 11189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_VIRTUAL_ENCL_BUS_ID 0x8 112729c845666be7092a52bf6fcdcf223fe4d9287a4Anil Ravindranath#define PMCRAID_MAX_VSET_TARGETS 0x7F 11389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_VSET_LUNS_PER_TARGET 8 11489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 11589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOA_MAX_SECTORS 32767 11689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_VSET_MAX_SECTORS 512 11789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_MAX_CMD_PER_LUN 254 11889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 119c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath/* Number of configuration table entries (resources), includes 1 FP, 120c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath * 1 Enclosure device 121c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath */ 122c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_MAX_RESOURCES 256 12389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 12489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Adapter Commands used by driver */ 12589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_QUERY_RESOURCE_STATE 0xC2 12689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_RESET_DEVICE 0xC3 12789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* options to select reset target */ 12889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define ENABLE_RESET_MODIFIER 0x80 12989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RESET_DEVICE_LUN 0x40 13089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RESET_DEVICE_TARGET 0x20 13189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RESET_DEVICE_BUS 0x10 13289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 13389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IDENTIFY_HRRQ 0xC4 13489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_QUERY_IOA_CONFIG 0xC5 13589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_QUERY_CMD_STATUS 0xCB 13689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_ABORT_CMD 0xC7 13789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 13889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* CANCEL ALL command, provides option for setting SYNC_COMPLETE 13989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * on the target resources for which commands got cancelled 14089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 14189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_CANCEL_ALL_REQUESTS 0xCE 14289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SYNC_COMPLETE_AFTER_CANCEL PMC_BIT8(0) 14389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 14489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* HCAM command and types of HCAM supported by IOA */ 14589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_HOST_CONTROLLED_ASYNC 0xCF 14689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_HCAM_CODE_CONFIG_CHANGE 0x01 14789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_HCAM_CODE_LOG_DATA 0x02 14889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 14989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* IOA shutdown command and various shutdown types */ 15089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOA_SHUTDOWN 0xF7 15189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SHUTDOWN_NORMAL 0x00 15289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SHUTDOWN_PREPARE_FOR_NORMAL 0x40 15389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SHUTDOWN_NONE 0x100 15489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SHUTDOWN_ABBREV 0x80 15589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 15689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* SET SUPPORTED DEVICES command and the option to select all the 15789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * devices to be supported 15889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 15989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SET_SUPPORTED_DEVICES 0xFB 16089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define ALL_DEVICES_SUPPORTED PMC_BIT8(0) 16189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 16289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* This option is used with SCSI WRITE_BUFFER command */ 16389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_WR_BUF_DOWNLOAD_AND_SAVE 0x05 16489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 16589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* IOASC Codes used by driver */ 16689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_SENSE_MASK 0xFFFFFF00 16789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_SENSE_KEY(ioasc) ((ioasc) >> 24) 16889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_SENSE_CODE(ioasc) (((ioasc) & 0x00ff0000) >> 16) 16989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_SENSE_QUAL(ioasc) (((ioasc) & 0x0000ff00) >> 8) 17089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_SENSE_STATUS(ioasc) ((ioasc) & 0x000000ff) 17189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 17289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_GOOD_COMPLETION 0x00000000 173c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_IOASC_GC_IOARCB_NOTFOUND 0x005A0000 17489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_NR_INIT_CMD_REQUIRED 0x02040200 17589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_NR_IOA_RESET_REQUIRED 0x02048000 17689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_NR_SYNC_REQUIRED 0x023F0000 17789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_ME_READ_ERROR_NO_REALLOC 0x03110C00 17889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_HW_CANNOT_COMMUNICATE 0x04050000 17989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_HW_DEVICE_TIMEOUT 0x04080100 18089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_HW_DEVICE_BUS_STATUS_ERROR 0x04448500 18189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_HW_IOA_RESET_REQUIRED 0x04448600 18289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_IR_INVALID_RESOURCE_HANDLE 0x05250000 18389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOASC_AC_TERMINATED_BY_HOST 0x0B5A0000 184c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_IOASC_UA_BUS_WAS_RESET 0x06290000 185592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath#define PMCRAID_IOASC_TIME_STAMP_OUT_OF_SYNC 0x06908B00 186c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_IOASC_UA_BUS_WAS_RESET_BY_OTHER 0x06298000 18789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 18889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Driver defined IOASCs */ 189c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_IOASC_IOA_WAS_RESET 0x10000001 190c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_IOASC_PCI_ACCESS_ERROR 0x10000002 19189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 19289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Various timeout values (in milliseconds) used. If any of these are chip 19389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * specific, move them to pmcraid_chip_details structure. 19489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 19589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_PCI_DEASSERT_TIMEOUT 2000 19689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_BIST_TIMEOUT 2000 19789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_AENWAIT_TIMEOUT 5000 19889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_TRANSOP_TIMEOUT 60000 19989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 20089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_RESET_TIMEOUT (2 * HZ) 20189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_CHECK_FOR_RESET_TIMEOUT ((HZ / 10)) 20289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_VSET_IO_TIMEOUT (60 * HZ) 20389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_INTERNAL_TIMEOUT (60 * HZ) 20489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SHUTDOWN_TIMEOUT (150 * HZ) 20589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_RESET_BUS_TIMEOUT (60 * HZ) 20689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_RESET_HOST_TIMEOUT (150 * HZ) 20789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_REQUEST_SENSE_TIMEOUT (30 * HZ) 20889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_SET_SUP_DEV_TIMEOUT (2 * 60 * HZ) 20989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 21089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* structure to represent a scatter-gather element (IOADL descriptor) */ 21189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioadl_desc { 21289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le64 address; 21389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 data_len; 21489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 reserved[3]; 21589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 flags; 21689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(PMCRAID_IOADL_ALIGNMENT))); 21789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 21889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_ioadl_desc.flags values */ 21989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOADL_FLAGS_CHAINED PMC_BIT8(0) 22089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOADL_FLAGS_LAST_DESC PMC_BIT8(1) 22189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOADL_FLAGS_READ_LAST PMC_BIT8(1) 22289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOADL_FLAGS_WRITE_LAST PMC_BIT8(1) 22389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 22489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 22589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* additional IOARCB data which can be CDB or additional request parameters 22689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * or list of IOADLs. Firmware supports max of 512 bytes for IOARCB, hence then 22789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * number of IOADLs are limted to 27. In case they are more than 27, they will 22889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * be used in chained form 22989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 23089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioarcb_add_data { 23189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath union { 23289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioadl_desc ioadl[PMCRAID_IOADLS_INTERNAL]; 23389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 add_cmd_params[PMCRAID_ADD_CMD_PARAM_LEN]; 23489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath } u; 23589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 23689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 23789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 23889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * IOA Request Control Block 23989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 24089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioarcb { 24189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le64 ioarcb_bus_addr; 24289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 resource_handle; 24389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 response_handle; 24489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le64 ioadl_bus_addr; 24589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 ioadl_length; 24689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 data_transfer_length; 24789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le64 ioasa_bus_addr; 24889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 ioasa_len; 24989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 cmd_timeout; 25089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 add_cmd_param_offset; 25189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 add_cmd_param_length; 25289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 reserved1[2]; 25389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 reserved2; 25489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 request_type; 25589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 request_flags0; 25689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 request_flags1; 25789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 hrrq_id; 25889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 cdb[PMCRAID_MAX_CDB_LEN]; 25989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioarcb_add_data add_data; 26089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(PMCRAID_IOARCB_ALIGNMENT))); 26189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 26289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* well known resource handle values */ 26389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOA_RES_HANDLE 0xffffffff 26489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_INVALID_RES_HANDLE 0 26589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 26689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_ioarcb.request_type values */ 26789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define REQ_TYPE_SCSI 0x00 26889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define REQ_TYPE_IOACMD 0x01 26989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define REQ_TYPE_HCAM 0x02 27089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 27189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_ioarcb.flags0 values */ 27289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define TRANSFER_DIR_WRITE PMC_BIT8(0) 27389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INHIBIT_UL_CHECK PMC_BIT8(2) 27489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SYNC_OVERRIDE PMC_BIT8(3) 27589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SYNC_COMPLETE PMC_BIT8(4) 27689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define NO_LINK_DESCS PMC_BIT8(5) 27789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 27889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_ioarcb.flags1 values */ 27989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DELAY_AFTER_RESET PMC_BIT8(0) 28089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define TASK_TAG_SIMPLE 0x10 28189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define TASK_TAG_ORDERED 0x20 28289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define TASK_TAG_QUEUE_HEAD 0x30 28389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 28489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* toggle bit offset in response handle */ 28589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HRRQ_TOGGLE_BIT 0x01 28689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HRRQ_RESPONSE_BIT 0x02 28789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 28889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* IOA Status Area */ 28989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioasa_vset { 29089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 failing_lba_hi; 29189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 failing_lba_lo; 29289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 reserved; 29389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 29489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 29589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioasa { 29689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 ioasc; 29789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 returned_status_length; 29889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 available_status_length; 29989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 residual_data_length; 30089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 ilid; 30189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 fd_ioasc; 30289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 fd_res_address; 30389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 fd_res_handle; 30489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 reserved; 30589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 30689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* resource specific sense information */ 30789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath union { 30889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioasa_vset vset; 30989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath } u; 31089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 31189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* IOA autosense data */ 31289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 auto_sense_length; 31389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 error_data_length; 31489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 sense_data[PMCRAID_SENSE_DATA_LEN]; 31589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 31689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 31789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_DRIVER_ILID 0xffffffff 31889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 31989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Config Table Entry per Resource */ 32089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_config_table_entry { 32189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 resource_type; 32289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 bus_protocol; 32389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 array_id; 32489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 common_flags0; 32589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 common_flags1; 32689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 unique_flags0; 32789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 unique_flags1; /*also used as vset target_id */ 32889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 resource_handle; 32989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 resource_address; 33089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 device_id[PMCRAID_DEVICE_ID_LEN]; 33189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 lun[PMCRAID_LUN_LEN]; 33289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 33389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 3345da61410054d125e63aeab9cc7a11874a69465c0Anil Ravindranath/* extended configuration table sizes are also of 32 bytes in size */ 335c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranathstruct pmcraid_config_table_entry_ext { 336c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry cfgte; 337c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath}; 338c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 33989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* resource types (config_table_entry.resource_type values) */ 34089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_TYPE_AF_DASD 0x00 34189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_TYPE_GSCSI 0x01 34289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_TYPE_VSET 0x02 34389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_TYPE_IOA_FP 0xFF 34489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 34589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_IS_IOA(res) ((res).resource_type == RES_TYPE_IOA_FP) 34689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_IS_GSCSI(res) ((res).resource_type == RES_TYPE_GSCSI) 34789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_IS_VSET(res) ((res).resource_type == RES_TYPE_VSET) 34889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_IS_AFDASD(res) ((res).resource_type == RES_TYPE_AF_DASD) 34989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 35089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* bus_protocol values used by driver */ 35189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_TYPE_VENCLOSURE 0x8 35289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 35389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* config_table_entry.common_flags0 */ 35489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define MULTIPATH_RESOURCE PMC_BIT32(0) 35589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 35689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* unique_flags1 */ 35789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IMPORT_MODE_MANUAL PMC_BIT8(0) 35889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 35989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* well known resource handle values */ 36089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_HANDLE_IOA 0xFFFFFFFF 36189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_HANDLE_NONE 0x00000000 36289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 36389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* well known resource address values */ 36489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_ADDRESS_IOAFP 0xFEFFFFFF 36589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_ADDRESS_INVALID 0xFFFFFFFF 36689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 36789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* BUS/TARGET/LUN values from resource_addrr */ 36889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_BUS(res_addr) (le32_to_cpu(res_addr) & 0xFF) 36989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_TARGET(res_addr) ((le32_to_cpu(res_addr) >> 16) & 0xFF) 37089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_LUN(res_addr) 0x0 37189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 37289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* configuration table structure */ 37389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_config_table { 37489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le16 num_entries; 37589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 table_format; 37689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 reserved1; 37789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 flags; 37889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 reserved2[11]; 379c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath union { 380c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry 381c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath entries[PMCRAID_MAX_RESOURCES]; 382c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry_ext 383c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath entries_ext[PMCRAID_MAX_RESOURCES]; 384c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath }; 38589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 38689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 38789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* config_table.flags value */ 38889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define MICROCODE_UPDATE_REQUIRED PMC_BIT32(0) 38989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 39089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 39189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * HCAM format 39289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 393c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_HOSTRCB_LDNSIZE 4056 39489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 39589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Error log notification format */ 39689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_hostrcb_error { 39789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 fd_ioasc; 39889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 fd_ra; 39989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 fd_rh; 40089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 prc; 40189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath union { 40289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 data[PMCRAID_HOSTRCB_LDNSIZE]; 40389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath } u; 40489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__ ((packed, aligned(4))); 40589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 40689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_hcam_hdr { 40789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 op_code; 40889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 notification_type; 40989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 notification_lost; 41089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 flags; 41189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 overlay_id; 41289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __u8 reserved1[3]; 41389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 ilid; 41489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 timestamp1; 41589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 timestamp2; 41689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __le32 data_len; 41789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 41889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 41989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_AEN_GROUP 0x3 42089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 42189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_hcam_ccn { 42289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_hcam_hdr header; 42389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_config_table_entry cfg_entry; 424c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry cfg_entry_old; 425c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath} __attribute__((packed, aligned(4))); 426c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 427c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_CCN_EXT_SIZE 3944 428c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranathstruct pmcraid_hcam_ccn_ext { 429c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_hcam_hdr header; 430c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry_ext cfg_entry; 431c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry_ext cfg_entry_old; 432c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 reserved[PMCRAID_CCN_EXT_SIZE]; 43389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 43489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 43589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_hcam_ldn { 43689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_hcam_hdr header; 43789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_hostrcb_error error_log; 43889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__((packed, aligned(4))); 43989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 44089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_hcam.op_code values */ 44189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_TYPE_CCN 0xE1 44289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_TYPE_LDN 0xE2 44389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 44489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_hcam.notification_type values */ 44589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define NOTIFICATION_TYPE_ENTRY_CHANGED 0x0 44689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define NOTIFICATION_TYPE_ENTRY_NEW 0x1 44789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define NOTIFICATION_TYPE_ENTRY_DELETED 0x2 448c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define NOTIFICATION_TYPE_STATE_CHANGE 0x3 449c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define NOTIFICATION_TYPE_ENTRY_STATECHANGED 0x4 45089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define NOTIFICATION_TYPE_ERROR_LOG 0x10 45189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define NOTIFICATION_TYPE_INFORMATION_LOG 0x11 45289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 45389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_NOTIFICATIONS_LOST PMC_BIT8(0) 45489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 45589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_hcam.flags values */ 45689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_INTERNAL_OP_ERROR PMC_BIT8(0) 45789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_ERROR_RESPONSE_SENT PMC_BIT8(1) 45889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 45989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_hcam.overlay_id values */ 46089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_08 0x08 46189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_09 0x09 46289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_11 0x11 46389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_12 0x12 46489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_13 0x13 46589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_14 0x14 46689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_16 0x16 46789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_17 0x17 46889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_20 0x20 46989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define HOSTRCB_OVERLAY_ID_FF 0xFF 47089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 47189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Implementation specific card details */ 47289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_chip_details { 47389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* hardware register offsets */ 47489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long ioastatus; 47589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long ioarrin; 47689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long mailbox; 47789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long global_intr_mask; 47889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long ioa_host_intr; 479c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath unsigned long ioa_host_msix_intr; 48089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long ioa_host_intr_clr; 48189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long ioa_host_mask; 48289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long ioa_host_mask_clr; 48389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long host_ioa_intr; 48489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long host_ioa_intr_clr; 48589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 48689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* timeout used during transitional to operational state */ 48789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long transop_timeout; 48889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 48989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 49089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* IOA to HOST doorbells (interrupts) */ 49189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_TRANSITION_TO_OPERATIONAL PMC_BIT32(0) 49289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_IOARCB_TRANSFER_FAILED PMC_BIT32(3) 49389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_IOA_UNIT_CHECK PMC_BIT32(4) 49489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_NO_HRRQ_FOR_CMD_RESPONSE PMC_BIT32(5) 49589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_CRITICAL_OP_IN_PROGRESS PMC_BIT32(6) 49689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_IO_DEBUG_ACK PMC_BIT32(7) 49789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_IOARRIN_LOST PMC_BIT32(27) 49889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_SYSTEM_BUS_MMIO_ERROR PMC_BIT32(28) 49989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_IOA_PROCESSOR_ERROR PMC_BIT32(29) 50089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_HRRQ_VALID PMC_BIT32(30) 50189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define INTRS_OPERATIONAL_STATUS PMC_BIT32(0) 502c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define INTRS_ALLOW_MSIX_VECTOR0 PMC_BIT32(31) 50389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 50489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Host to IOA Doorbells */ 50589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DOORBELL_RUNTIME_RESET PMC_BIT32(1) 50689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DOORBELL_IOA_RESET_ALERT PMC_BIT32(7) 50789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DOORBELL_IOA_DEBUG_ALERT PMC_BIT32(9) 50889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DOORBELL_ENABLE_DESTRUCTIVE_DIAGS PMC_BIT32(8) 50989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DOORBELL_IOA_START_BIST PMC_BIT32(23) 510c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define DOORBELL_INTR_MODE_MSIX PMC_BIT32(25) 511c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define DOORBELL_INTR_MSIX_CLR PMC_BIT32(26) 51289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DOORBELL_RESET_IOA PMC_BIT32(31) 51389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 51489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Global interrupt mask register value */ 515c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define GLOBAL_INTERRUPT_MASK 0x5ULL 51689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 51789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_ERROR_INTERRUPTS (INTRS_IOARCB_TRANSFER_FAILED | \ 51889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath INTRS_IOA_UNIT_CHECK | \ 51989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath INTRS_NO_HRRQ_FOR_CMD_RESPONSE | \ 52089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath INTRS_IOARRIN_LOST | \ 52189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath INTRS_SYSTEM_BUS_MMIO_ERROR | \ 52289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath INTRS_IOA_PROCESSOR_ERROR) 52389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 52489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_PCI_INTERRUPTS (PMCRAID_ERROR_INTERRUPTS | \ 52589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath INTRS_HRRQ_VALID | \ 526c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath INTRS_TRANSITION_TO_OPERATIONAL |\ 527c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath INTRS_ALLOW_MSIX_VECTOR0) 52889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 52989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* control_block, associated with each of the commands contains IOARCB, IOADLs 53089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * memory for IOASA. Additional 3 * 16 bytes are allocated in order to support 53189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * additional request parameters (of max size 48) any command. 53289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 53389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_control_block { 53489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioarcb ioarcb; 53589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioadl_desc ioadl[PMCRAID_IOADLS_EXTERNAL + 3]; 53689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioasa ioasa; 53789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__ ((packed, aligned(PMCRAID_IOARCB_ALIGNMENT))); 53889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 53989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_sglist - Scatter-gather list allocated for passthrough ioctls 54089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 54189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_sglist { 54289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 order; 54389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 num_sg; 54489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 num_dma_sg; 54589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 buffer_len; 54689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct scatterlist scatterlist[1]; 54789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 54889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 549c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath/* page D0 inquiry data of focal point resource */ 550c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranathstruct pmcraid_inquiry_data { 551c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 ph_dev_type; 552c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 page_code; 553c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 reserved1; 554c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 add_page_len; 555c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 length; 556c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 reserved2; 557c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __le16 fw_version; 558c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath __u8 reserved3[16]; 559c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath}; 560c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 561592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath#define PMCRAID_TIMESTAMP_LEN 12 562592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath#define PMCRAID_REQ_TM_STR_LEN 6 563592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath#define PMCRAID_SCSI_SET_TIMESTAMP 0xA4 564592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath#define PMCRAID_SCSI_SERVICE_ACTION 0x0F 565592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath 566592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranathstruct pmcraid_timestamp_data { 567592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath __u8 reserved1[4]; 568592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath __u8 timestamp[PMCRAID_REQ_TM_STR_LEN]; /* current time value */ 569592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath __u8 reserved2[2]; 570592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath}; 571592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath 57289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* pmcraid_cmd - LLD representation of SCSI command */ 57389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_cmd { 57489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 57589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Ptr and bus address of DMA.able control block for this command */ 57689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_control_block *ioa_cb; 57789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath dma_addr_t ioa_cb_bus_addr; 57889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath dma_addr_t dma_handle; 57989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 58089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* pointer to mid layer structure of SCSI commands */ 58189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct scsi_cmnd *scsi_cmd; 58289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 58389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct list_head free_list; 58489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct completion wait_for_completion; 58589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct timer_list timer; /* needed for internal commands */ 58689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 timeout; /* current timeout value */ 58789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 index; /* index into the command list */ 58889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 completion_req; /* for handling internal commands */ 58989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 release; /* for handling completions */ 59089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 59189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void (*cmd_done) (struct pmcraid_cmd *); 59289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_instance *drv_inst; 59389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 59489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_sglist *sglist; /* used for passthrough IOCTLs */ 59589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 596c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* scratch used */ 59789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath union { 598c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* during reset sequence */ 59989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath unsigned long time_left; 60089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_resource_entry *res; 601c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath int hrrq_index; 602c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 603c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* used during IO command error handling. Sense buffer 604c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath * for REQUEST SENSE command if firmware is not sending 605c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath * auto sense data 606c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath */ 607c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct { 608c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u8 *sense_buffer; 609c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath dma_addr_t sense_buffer_dma; 610c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath }; 611c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath }; 61289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 61389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 61489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 61589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Interrupt registers of IOA 61689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 61789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_interrupts { 61889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *ioa_host_interrupt_reg; 619c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath void __iomem *ioa_host_msix_interrupt_reg; 62089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *ioa_host_interrupt_clr_reg; 62189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *ioa_host_interrupt_mask_reg; 62289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *ioa_host_interrupt_mask_clr_reg; 62389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *global_interrupt_mask_reg; 62489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *host_ioa_interrupt_reg; 62589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *host_ioa_interrupt_clr_reg; 62689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 62789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 62889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* ISR parameters LLD allocates (one for each MSI-X if enabled) vectors */ 62989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_isr_param { 63089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_instance *drv_inst; 631c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u16 vector; /* allocated msi-x vector */ 632c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u8 hrrq_id; /* hrrq entry index */ 63389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 63489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 635c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 63689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* AEN message header sent as part of event data to applications */ 63789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_aen_msg { 63889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 hostno; 63989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 length; 64089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 reserved[8]; 64189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 data[0]; 64289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 64389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 644c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath/* Controller state event message type */ 645c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranathstruct pmcraid_state_msg { 646c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_aen_msg msg; 647c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u32 ioa_state; 648c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath}; 649c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 650c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMC_DEVICE_EVENT_RESET_START 0x11000000 651c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMC_DEVICE_EVENT_RESET_SUCCESS 0x11000001 652c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMC_DEVICE_EVENT_RESET_FAILED 0x11000002 653c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMC_DEVICE_EVENT_SHUTDOWN_START 0x11000003 654c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMC_DEVICE_EVENT_SHUTDOWN_SUCCESS 0x11000004 655c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMC_DEVICE_EVENT_SHUTDOWN_FAILED 0x11000005 656c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 65789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_hostrcb { 65889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_instance *drv_inst; 65989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_aen_msg *msg; 66089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_hcam_hdr *hcam; /* pointer to hcam buffer */ 66189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_cmd *cmd; /* pointer to command block used */ 66289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath dma_addr_t baddr; /* system address of hcam buffer */ 66389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath atomic_t ignore; /* process HCAM response ? */ 66489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 66589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 66689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_AEN_HDR_SIZE sizeof(struct pmcraid_aen_msg) 66789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 66889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 66989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 67089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 67189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Per adapter structure maintained by LLD 67289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 67389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_instance { 67489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Array of allowed-to-be-exposed resources, initialized from 67589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * Configutation Table, later updated with CCNs 67689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 67789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_resource_entry *res_entries; 67889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 67989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct list_head free_res_q; /* res_entries lists for easy lookup */ 68089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct list_head used_res_q; /* List of to be exposed resources */ 68189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath spinlock_t resource_lock; /* spinlock to protect resource list */ 68289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 68389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *mapped_dma_addr; 68489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *ioa_status; /* Iomapped IOA status register */ 68589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *mailbox; /* Iomapped mailbox register */ 68689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath void __iomem *ioarrin; /* IOmapped IOARR IN register */ 68789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 68889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_interrupts int_regs; 68989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_chip_details *chip_cfg; 69089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 69189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* HostRCBs needed for HCAM */ 69289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_hostrcb ldn; 69389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_hostrcb ccn; 694c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_state_msg scn; /* controller state change msg */ 69589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 69689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 69789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Bus address of start of HRRQ */ 69889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath dma_addr_t hrrq_start_bus_addr[PMCRAID_NUM_MSIX_VECTORS]; 69989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 70089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Pointer to 1st entry of HRRQ */ 70189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __be32 *hrrq_start[PMCRAID_NUM_MSIX_VECTORS]; 70289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 70389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Pointer to last entry of HRRQ */ 70489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __be32 *hrrq_end[PMCRAID_NUM_MSIX_VECTORS]; 70589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 70689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Pointer to current pointer of hrrq */ 70789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __be32 *hrrq_curr[PMCRAID_NUM_MSIX_VECTORS]; 70889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 70989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Lock for HRRQ access */ 71089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath spinlock_t hrrq_lock[PMCRAID_NUM_MSIX_VECTORS]; 71189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 712c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_inquiry_data *inq_data; 713c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath dma_addr_t inq_data_baddr; 714c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 715592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath struct pmcraid_timestamp_data *timestamp_data; 716592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath dma_addr_t timestamp_data_baddr; 717592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath 718c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* size of configuration table entry, varies based on the firmware */ 719c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u32 config_table_entry_size; 720c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 72189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Expected toggle bit at host */ 72289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 host_toggle_bit[PMCRAID_NUM_MSIX_VECTORS]; 72389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 72489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 72589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Wait Q for threads to wait for Reset IOA completion */ 72689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath wait_queue_head_t reset_wait_q; 72789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_cmd *reset_cmd; 72889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 72989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* structures for supporting SIGIO based AEN. */ 73089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct fasync_struct *aen_queue; 73189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct mutex aen_queue_lock; /* lock for aen subscribers list */ 73289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct cdev cdev; 73389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 73489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct Scsi_Host *host; /* mid layer interface structure handle */ 73589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pci_dev *pdev; /* PCI device structure handle */ 73689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 737c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* No of Reset IOA retries . IOA marked dead if threshold exceeds */ 738c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u8 ioa_reset_attempts; 739c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath#define PMCRAID_RESET_ATTEMPTS 3 740c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 74189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 current_log_level; /* default level for logging IOASC errors */ 74289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 74389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 num_hrrq; /* Number of interrupt vectors allocated */ 744c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath u8 interrupt_mode; /* current interrupt mode legacy or msix */ 74589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath dev_t dev; /* Major-Minor numbers for Char device */ 74689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 74789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* Used as ISR handler argument */ 74889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_isr_param hrrq_vector[PMCRAID_NUM_MSIX_VECTORS]; 74989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 750c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* Message id as filled in last fired IOARCB, used to identify HRRQ */ 751c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath atomic_t last_message_id; 752c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 75389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* configuration table */ 75489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_config_table *cfg_table; 75589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath dma_addr_t cfg_table_bus_addr; 75689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 75789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* structures related to command blocks */ 75889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct kmem_cache *cmd_cachep; /* cache for cmd blocks */ 75989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pci_pool *control_pool; /* pool for control blocks */ 76089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath char cmd_pool_name[64]; /* name of cmd cache */ 76189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath char ctl_pool_name[64]; /* name of control cache */ 76289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 76389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_cmd *cmd_list[PMCRAID_MAX_CMD]; 76489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 76589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct list_head free_cmd_pool; 76689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct list_head pending_cmd_pool; 767c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath spinlock_t free_pool_lock; /* free pool lock */ 768c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath spinlock_t pending_pool_lock; /* pending pool lock */ 769c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 770c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* Tasklet to handle deferred processing */ 771c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct tasklet_struct isr_tasklet[PMCRAID_NUM_MSIX_VECTORS]; 772c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath 773c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath /* Work-queue (Shared) for deferred reset processing */ 774c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct work_struct worker_q; 77589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 77689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* No of IO commands pending with FW */ 77789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath atomic_t outstanding_cmds; 77889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 77989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* should add/delete resources to mid-layer now ?*/ 78089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath atomic_t expose_resources; 78189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 78289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 78389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 78489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioa_state:4; /* For IOA Reset sequence FSM */ 78589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_OPERATIONAL 0x0 78689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_UNKNOWN 0x1 78789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_DEAD 0x2 78889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_IN_SOFT_RESET 0x3 78989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_IN_HARD_RESET 0x4 79089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_IN_RESET_ALERT 0x5 79189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_IN_BRINGDOWN 0x6 79289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOA_STATE_IN_BRINGUP 0x7 79389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 79489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioa_reset_in_progress:1; /* true if IOA reset is in progress */ 79589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioa_hard_reset:1; /* TRUE if Hard Reset is needed */ 79689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioa_unit_check:1; /* Indicates Unit Check condition */ 79789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioa_bringdown:1; /* whether IOA needs to be brought down */ 79889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 force_ioa_reset:1; /* force adapter reset ? */ 79989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 reinit_cfg_table:1; /* reinit config table due to lost CCN */ 80089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioa_shutdown_type:2;/* shutdown type used during reset */ 80189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SHUTDOWN_NONE 0x0 80289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SHUTDOWN_NORMAL 0x1 80389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SHUTDOWN_ABBREV 0x2 804592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath u32 timestamp_error:1; /* indicate set timestamp for out of sync */ 80589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 80689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 80789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 80889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* LLD maintained resource entry structure */ 80989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_resource_entry { 81089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct list_head queue; /* link to "to be exposed" resources */ 811c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath union { 812c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry cfg_entry; 813c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath struct pmcraid_config_table_entry_ext cfg_entry_ext; 814c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath }; 81589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct scsi_device *scsi_dev; /* Link scsi_device structure */ 81689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath atomic_t read_failures; /* count of failed READ commands */ 81789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath atomic_t write_failures; /* count of failed WRITE commands */ 81889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 81989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* To indicate add/delete/modify during CCN */ 82089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 change_detected; 82189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_CHANGE_ADD 0x1 /* add this to mid-layer */ 82289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define RES_CHANGE_DEL 0x2 /* remove this from mid-layer */ 82389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 82489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 reset_progress; /* Device is resetting */ 82589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 82689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* 82789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * When IOA asks for sync (i.e. IOASC = Not Ready, Sync Required), this 82889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * flag will be set, mid layer will be asked to retry. In the next 82989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * attempt, this flag will be checked in queuecommand() to set 83089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * SYNC_COMPLETE flag in IOARCB (flag_0). 83189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 83289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 sync_reqd; 83389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 83489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath /* target indicates the mapped target_id assigned to this resource if 83589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * this is VSET resource. For non-VSET resources this will be un-used 83689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * or zero 83789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 83889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 target; 83989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 84089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 84189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Data structures used in IOASC error code logging */ 84289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioasc_error { 84389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 ioasc_code; /* IOASC code */ 84489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 log_level; /* default log level assignment. */ 84589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath char *error_string; 84689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 84789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 84889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Initial log_level assignments for various IOASCs */ 84989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOASC_LOG_LEVEL_NONE 0x0 /* no logging */ 85089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOASC_LOG_LEVEL_MUST 0x1 /* must log: all high-severity errors */ 85189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IOASC_LOG_LEVEL_HARD 0x2 /* optional – low severity errors */ 85289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 85389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Error information maintained by LLD. LLD initializes the pmcraid_error_table 85489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * statically. 85589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 85689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstatic struct pmcraid_ioasc_error pmcraid_ioasc_error_table[] = { 857c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x01180600, IOASC_LOG_LEVEL_HARD, 85889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Recovered Error, soft media error, sector reassignment suggested"}, 859c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x015D0000, IOASC_LOG_LEVEL_HARD, 860de49025466b0179c1be7b3e827d2f7b032033090Masanari Iida "Recovered Error, failure prediction threshold exceeded"}, 861c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x015D9200, IOASC_LOG_LEVEL_HARD, 862de49025466b0179c1be7b3e827d2f7b032033090Masanari Iida "Recovered Error, soft Cache Card Battery error threshold"}, 863c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x015D9200, IOASC_LOG_LEVEL_HARD, 864de49025466b0179c1be7b3e827d2f7b032033090Masanari Iida "Recovered Error, soft Cache Card Battery error threshold"}, 865c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x02048000, IOASC_LOG_LEVEL_HARD, 86689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Not Ready, IOA Reset Required"}, 867c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x02408500, IOASC_LOG_LEVEL_HARD, 86889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Not Ready, IOA microcode download required"}, 869c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x03110B00, IOASC_LOG_LEVEL_HARD, 87089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Medium Error, data unreadable, reassignment suggested"}, 87189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x03110C00, IOASC_LOG_LEVEL_MUST, 87289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Medium Error, data unreadable do not reassign"}, 873c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x03310000, IOASC_LOG_LEVEL_HARD, 87489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Medium Error, media corrupted"}, 875c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04050000, IOASC_LOG_LEVEL_HARD, 87689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, IOA can't communicate with device"}, 87789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x04080000, IOASC_LOG_LEVEL_MUST, 87889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, device bus error"}, 879c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04088000, IOASC_LOG_LEVEL_MUST, 88089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, device bus is not functioning"}, 881c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04118000, IOASC_LOG_LEVEL_HARD, 88289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, IOA reserved area data check"}, 883c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04118100, IOASC_LOG_LEVEL_HARD, 88489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, IOA reserved area invalid data pattern"}, 885c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04118200, IOASC_LOG_LEVEL_HARD, 88689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, IOA reserved area LRC error"}, 887c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04320000, IOASC_LOG_LEVEL_HARD, 88889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, reassignment space exhausted"}, 889c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04330000, IOASC_LOG_LEVEL_HARD, 89089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, data transfer underlength error"}, 891c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04330000, IOASC_LOG_LEVEL_HARD, 89289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, data transfer overlength error"}, 89389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x04418000, IOASC_LOG_LEVEL_MUST, 89489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, PCI bus error"}, 895c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04440000, IOASC_LOG_LEVEL_HARD, 89689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, device error"}, 897c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04448200, IOASC_LOG_LEVEL_MUST, 898c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath "Hardware Error, IOA error"}, 899c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04448300, IOASC_LOG_LEVEL_HARD, 90089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, undefined device response"}, 901c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04448400, IOASC_LOG_LEVEL_HARD, 90289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, IOA microcode error"}, 903c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04448600, IOASC_LOG_LEVEL_HARD, 90489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, IOA reset required"}, 905c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04449200, IOASC_LOG_LEVEL_HARD, 90689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, hard Cache Fearuee Card Battery error"}, 907c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x0444A000, IOASC_LOG_LEVEL_HARD, 90889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, failed device altered"}, 909c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x0444A200, IOASC_LOG_LEVEL_HARD, 91089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, data check after reassignment"}, 911c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x0444A300, IOASC_LOG_LEVEL_HARD, 91289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, LRC error after reassignment"}, 913c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x044A0000, IOASC_LOG_LEVEL_HARD, 91489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, device bus error (msg/cmd phase)"}, 915c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04670400, IOASC_LOG_LEVEL_HARD, 91689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, new device can't be used"}, 917c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04678000, IOASC_LOG_LEVEL_HARD, 91889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, invalid multiadapter configuration"}, 919c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04678100, IOASC_LOG_LEVEL_HARD, 92089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, incorrect connection between enclosures"}, 921c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04678200, IOASC_LOG_LEVEL_HARD, 92289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, connections exceed IOA design limits"}, 923c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04678300, IOASC_LOG_LEVEL_HARD, 92489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, incorrect multipath connection"}, 925c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x04679000, IOASC_LOG_LEVEL_HARD, 92689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Hardware Error, command to LUN failed"}, 92789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x064C8000, IOASC_LOG_LEVEL_HARD, 92889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, cache exists for missing/failed device"}, 92989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x06670100, IOASC_LOG_LEVEL_HARD, 93089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, incompatible exposed mode device"}, 93189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x06670600, IOASC_LOG_LEVEL_HARD, 93289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, attachment of logical unit failed"}, 933c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x06678000, IOASC_LOG_LEVEL_HARD, 93489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, cables exceed connective design limit"}, 935c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x06678300, IOASC_LOG_LEVEL_HARD, 93689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, incomplete multipath connection between" \ 93789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "IOA and enclosure"}, 938c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x06678400, IOASC_LOG_LEVEL_HARD, 93989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, incomplete multipath connection between" \ 94089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "device and enclosure"}, 941c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x06678500, IOASC_LOG_LEVEL_HARD, 94289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, incomplete multipath connection between" \ 94389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "IOA and remote IOA"}, 94489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x06678600, IOASC_LOG_LEVEL_HARD, 94589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, missing remote IOA"}, 94689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x06679100, IOASC_LOG_LEVEL_HARD, 94789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, enclosure doesn't support required multipath" \ 94889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "function"}, 94989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x06698200, IOASC_LOG_LEVEL_HARD, 95089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, corrupt array parity detected on device"}, 951c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x066B0200, IOASC_LOG_LEVEL_HARD, 95289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, array exposed"}, 95389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x066B8200, IOASC_LOG_LEVEL_HARD, 95489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, exposed array is still protected"}, 955c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x066B9200, IOASC_LOG_LEVEL_HARD, 95689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Unit Attention, Multipath redundancy level got worse"}, 95789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x07270000, IOASC_LOG_LEVEL_HARD, 95889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, device is read/write protected by IOA"}, 95989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x07278000, IOASC_LOG_LEVEL_HARD, 96089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, IOA doesn't support device attribute"}, 96189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x07278100, IOASC_LOG_LEVEL_HARD, 96289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, NVRAM mirroring prohibited"}, 963c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278400, IOASC_LOG_LEVEL_HARD, 96489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, array is short 2 or more devices"}, 965c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278600, IOASC_LOG_LEVEL_HARD, 96689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, exposed array is short a required device"}, 967c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278700, IOASC_LOG_LEVEL_HARD, 96889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, array members not at required addresses"}, 969c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278800, IOASC_LOG_LEVEL_HARD, 97089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, exposed mode device resource address conflict"}, 971c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278900, IOASC_LOG_LEVEL_HARD, 97289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, incorrect resource address of exposed mode device"}, 973c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278A00, IOASC_LOG_LEVEL_HARD, 97489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, Array is missing a device and parity is out of sync"}, 975c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07278B00, IOASC_LOG_LEVEL_HARD, 97689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, maximum number of arrays already exist"}, 97789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x07278C00, IOASC_LOG_LEVEL_HARD, 97889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, cannot locate cache data for device"}, 97989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x07278D00, IOASC_LOG_LEVEL_HARD, 98089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, cache data exits for a changed device"}, 981c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07279100, IOASC_LOG_LEVEL_HARD, 98289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, detection of a device requiring format"}, 983c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07279200, IOASC_LOG_LEVEL_HARD, 98489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, IOA exceeds maximum number of devices"}, 985c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07279600, IOASC_LOG_LEVEL_HARD, 98689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, missing array, volume set is not functional"}, 987c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07279700, IOASC_LOG_LEVEL_HARD, 98889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, single device for a volume set"}, 989c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07279800, IOASC_LOG_LEVEL_HARD, 99089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, missing multiple devices for a volume set"}, 99189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath {0x07279900, IOASC_LOG_LEVEL_HARD, 99289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, maximum number of volument sets already exists"}, 993c20c426732a5a5d21e99b36286f79c2024115341Anil Ravindranath {0x07279A00, IOASC_LOG_LEVEL_HARD, 99489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath "Data Protect, other volume set problem"}, 99589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 99689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 99789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* macros to help in debugging */ 99889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define pmcraid_err(...) \ 99989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath printk(KERN_ERR "MaxRAID: "__VA_ARGS__) 100089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 100189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define pmcraid_info(...) \ 100289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath if (pmcraid_debug_log) \ 100389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath printk(KERN_INFO "MaxRAID: "__VA_ARGS__) 100489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 100589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* check if given command is a SCSI READ or SCSI WRITE command */ 100689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SCSI_READ_CMD 0x1 /* any of SCSI READ commands */ 100789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SCSI_WRITE_CMD 0x2 /* any of SCSI WRITE commands */ 100889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define SCSI_CMD_TYPE(opcode) \ 100989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath({ u8 op = opcode; u8 __type = 0;\ 101089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath if (op == READ_6 || op == READ_10 || op == READ_12 || op == READ_16)\ 101189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __type = SCSI_READ_CMD;\ 101289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath else if (op == WRITE_6 || op == WRITE_10 || op == WRITE_12 || \ 101389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath op == WRITE_16)\ 101489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __type = SCSI_WRITE_CMD;\ 101589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath __type;\ 101689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}) 101789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 101889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define IS_SCSI_READ_WRITE(opcode) \ 101989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath({ u8 __type = SCSI_CMD_TYPE(opcode); \ 102089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath (__type == SCSI_READ_CMD || __type == SCSI_WRITE_CMD) ? 1 : 0;\ 102189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}) 102289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 102389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 102489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 102525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * pmcraid_ioctl_header - definition of header structure that precedes all the 10263ad2f3fbb961429d2aa627465ae4829758bc7e07Daniel Mack * buffers given as ioctl arguments. 102789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 102889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .signature : always ASCII string, "PMCRAID" 102989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .reserved : not used 103089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .buffer_length : length of the buffer following the header 103189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 103289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_ioctl_header { 103389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 signature[8]; 103489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 reserved; 103589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u32 buffer_length; 103689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath}; 103789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 103889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOCTL_SIGNATURE "PMCRAID" 103989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 104089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 104189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * pmcraid_passthrough_ioctl_buffer - structure given as argument to 104289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * passthrough(or firmware handled) IOCTL commands. Note that ioarcb requires 104389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 32-byte alignment so, it is necessary to pack this structure to avoid any 104489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * holes between ioctl_header and passthrough buffer 104589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * 104689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .ioactl_header : ioctl header 104789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .ioarcb : filled-up ioarcb buffer, driver always reads this buffer 104889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .ioasa : buffer for ioasa, driver fills this with IOASA from firmware 104989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * .request_buffer: The I/O buffer (flat), driver reads/writes to this based on 105089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * the transfer directions passed in ioarcb.flags0. Contents 105189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * of this buffer are valid only when ioarcb.data_transfer_len 105289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * is not zero. 105389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 105489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranathstruct pmcraid_passthrough_ioctl_buffer { 105589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioctl_header ioctl_header; 105689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioarcb ioarcb; 105789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath struct pmcraid_ioasa ioasa; 105889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath u8 request_buffer[1]; 105989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath} __attribute__ ((packed)); 106089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 106189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 106289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * keys to differentiate between driver handled IOCTLs and passthrough 106389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * IOCTLs passed to IOA. driver determines the ioctl type using macro 106489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * _IOC_TYPE 106589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 106689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_DRIVER_IOCTL 'D' 106789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_PASSTHROUGH_IOCTL 'F' 106889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 106989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define DRV_IOCTL(n, size) \ 1070592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath _IOC(_IOC_READ|_IOC_WRITE, PMCRAID_DRIVER_IOCTL, (n), (size)) 107189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 107289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define FMW_IOCTL(n, size) \ 1073592488a32b87daf27b92d2c1c5cdc440d1a1beaeAnil Ravindranath _IOC(_IOC_READ|_IOC_WRITE, PMCRAID_PASSTHROUGH_IOCTL, (n), (size)) 107489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 107589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* 107689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * _ARGSIZE: macro that gives size of the argument type passed to an IOCTL cmd. 107789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * This is to facilitate applications avoiding un-necessary memory allocations. 107889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath * For example, most of driver handled ioctls do not require ioarcb, ioasa. 107989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath */ 108089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define _ARGSIZE(arg) (sizeof(struct pmcraid_ioctl_header) + sizeof(arg)) 108189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 108289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* Driver handled IOCTL command definitions */ 108389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 108489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOCTL_RESET_ADAPTER \ 108589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath DRV_IOCTL(5, sizeof(struct pmcraid_ioctl_header)) 108689a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 108789a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath/* passthrough/firmware handled commands */ 108889a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOCTL_PASSTHROUGH_COMMAND \ 108989a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath FMW_IOCTL(1, sizeof(struct pmcraid_passthrough_ioctl_buffer)) 109089a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 109189a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#define PMCRAID_IOCTL_DOWNLOAD_MICROCODE \ 109289a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath FMW_IOCTL(2, sizeof(struct pmcraid_passthrough_ioctl_buffer)) 109389a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 109489a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath 109589a3681041507773dfee1b88c1c90c8a811a79d3Anil Ravindranath#endif /* _PMCRAID_H */ 1096