Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261901AbVCGWx1 (ORCPT ); Mon, 7 Mar 2005 17:53:27 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261903AbVCGWwq (ORCPT ); Mon, 7 Mar 2005 17:52:46 -0500 Received: from mail0.lsil.com ([147.145.40.20]:39337 "EHLO mail0.lsil.com") by vger.kernel.org with ESMTP id S261770AbVCGV1o (ORCPT ); Mon, 7 Mar 2005 16:27:44 -0500 Message-ID: <0E3FA95632D6D047BA649F95DAB60E570230CC0F@exa-atlanta> From: "Bagalkote, Sreenivas" To: "'linux-kernel@vger.kernel.org'" , "'linux-kernel@vger.kernel.org'" Cc: "'James Bottomley'" , "'Matt_Domsch@Dell.com'" , Andrew Morton , "'Christoph Hellwig'" Subject: [ANNOUNCE][PATCH 2.6.11 3/3] megaraid_sas: Announcing new module for LSI Logic's SAS based MegaRAID controllers Date: Mon, 7 Mar 2005 16:17:57 -0500 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 27912 Lines: 1147 Patch 3 of 3: Signed-off-by: Sreenivas Bagalkote diff -Naur linux-2.6.11-orig/drivers/scsi/megaraid/megaraid_sas.h linux-2.6.11/drivers/scsi/megaraid/megaraid_sas.h --- linux-2.6.11-orig/drivers/scsi/megaraid/megaraid_sas.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.6.11/drivers/scsi/megaraid/megaraid_sas.h 2005-03-05 21:41:25.503377336 -0500 @@ -0,0 +1,1118 @@ +/* + * + * Linux MegaRAID driver for SAS based RAID controllers + * + * Copyright (c) 2003-2005 LSI Logic Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * FILE : megaraid_sas.h + */ + +#ifndef LSI_MEGARAID_SAS_H +#define LSI_MEGARAID_SAS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +/** + * MegaRAID SAS Driver meta data + */ +#define MEGASAS_VERSION "00.00.01.00" +#define MEGASAS_RELDATE "Mar 05, 2005" +#define MEGASAS_EXT_VERSION "" + +/** + * MegaRAID SAS supported controllers + */ +#define PCI_DEVICE_LSI_1064 0x0411 +#define PCI_SUBVENDOR_x0000 0x0000 +#define PCI_SUBVENDOR_x1000 0x1000 +#define PCI_SUBSYSTEM_x0000 0x0000 +#define PCI_SUBSYSTEM_x0001 0x0001 +#define PCI_SUBSYSTEM_x0002 0x0002 +#define PCI_SUBSYSTEM_x1001 0x1001 + +#define PCI_DEVICE_ID_PERC5 0x0015 +#define PCI_SUBSYSTEM_PERC5H 0x1F01 +#define PCI_SUBSYSTEM_PERC5L 0x1F02 +#define PCI_SUBSYSTEM_PERC5I 0x1F03 + +#define PCI_SUB_DEVICEID_FSC 0x1081 +#define PCI_SUB_VENDORID_FSC 0x1734 +/* + * ===================================== + * MegaRAID SAS MFI firmware definitions + * ===================================== + */ + +/** + * FW posts its state in upper 4 bits of outbound_msg_0 register + */ +#define MFI_STATE_MASK 0xF0000000 +#define MFI_STATE_UNDEFINED 0x00000000 +#define MFI_STATE_BB_INIT 0x10000000 +#define MFI_STATE_FW_INIT 0x40000000 +#define MFI_STATE_WAIT_HANDSHAKE 0x60000000 +#define MFI_STATE_DEVICE_SCAN 0x80000000 +#define MFI_STATE_READY 0xB0000000 +#define MFI_STATE_OPERATIONAL 0xC0000000 +#define MFI_STATE_FAULT 0xF0000000 + +#define MEGAMFI_FRAME_SIZE 64 + +/** + * During FW init, clear pending cmds & reset state using inbound_msg_0 + * + * ABORT : Abort all pending cmds + * READY : Move from OPERATIONAL to READY state; discard queue info + * MFIMODE : Discard (possible) low MFA posted in 64-bit mode (??) + * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver + */ +#define MFI_INIT_ABORT 0x00000000 +#define MFI_INIT_READY 0x00000002 +#define MFI_INIT_MFIMODE 0x00000004 +#define MFI_INIT_CLEAR_HANDSHAKE 0x00000008 +#define MFI_RESET_FLAGS MFI_INIT_READY|MFI_INIT_MFIMODE + +/** + * MFI frame flags + */ +#define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 +#define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE 0x0001 +#define MFI_FRAME_SGL32 0x0000 +#define MFI_FRAME_SGL64 0x0002 +#define MFI_FRAME_SENSE32 0x0000 +#define MFI_FRAME_SENSE64 0x0004 +#define MFI_FRAME_DIR_NONE 0x0000 +#define MFI_FRAME_DIR_WRITE 0x0008 +#define MFI_FRAME_DIR_READ 0x0010 +#define MFI_FRAME_DIR_BOTH 0x0018 + +/** + * Definition for cmd_status + */ +#define MFI_CMD_STATUS_POLL_MODE 0xFF + +/** + * MFI command opcodes + */ +#define MFI_CMD_INIT 0x00 +#define MFI_CMD_LD_READ 0x01 +#define MFI_CMD_LD_WRITE 0x02 +#define MFI_CMD_LD_SCSI_IO 0x03 +#define MFI_CMD_PD_SCSI_IO 0x04 +#define MFI_CMD_DCMD 0x05 +#define MFI_CMD_ABORT 0x06 +#define MFI_CMD_SMP 0x07 +#define MFI_CMD_STP 0x08 + +#define MR_DCMD_CTRL_GET_INFO 0x01010000 + +#define MR_DCMD_CTRL_CACHE_FLUSH 0x01101000 +#define MR_FLUSH_CTRL_CACHE 0x01 +#define MR_FLUSH_DISK_CACHE 0x02 + +#define MR_DCMD_CTRL_SHUTDOWN 0x01050000 +#define MR_ENABLE_DRIVE_SPINDOWN 0x01 + +#define MR_DCMD_CTRL_EVENT_GET_INFO 0x01040100 +#define MR_DCMD_CTRL_EVENT_GET 0x01040300 +#define MR_DCMD_CTRL_EVENT_WAIT 0x01040500 +#define MR_DCMD_LD_GET_PROPERTIES 0x03030000 + +/** + * MFI command completion codes + */ +enum MFI_STAT { + MFI_STAT_OK = 0x00, + MFI_STAT_INVALID_CMD = 0x01, + MFI_STAT_INVALID_DCMD = 0x02, + MFI_STAT_INVALID_PARAMETER = 0x03, + MFI_STAT_INVALID_SEQUENCE_NUMBER = 0x04, + MFI_STAT_ABORT_NOT_POSSIBLE = 0x05, + MFI_STAT_APP_HOST_CODE_NOT_FOUND = 0x06, + MFI_STAT_APP_IN_USE = 0x07, + MFI_STAT_APP_NOT_INITIALIZED = 0x08, + MFI_STAT_ARRAY_INDEX_INVALID = 0x09, + MFI_STAT_ARRAY_ROW_NOT_EMPTY = 0x0a, + MFI_STAT_CONFIG_RESOURCE_CONFLICT = 0x0b, + MFI_STAT_DEVICE_NOT_FOUND = 0x0c, + MFI_STAT_DRIVE_TOO_SMALL = 0x0d, + MFI_STAT_FLASH_ALLOC_FAIL = 0x0e, + MFI_STAT_FLASH_BUSY = 0x0f, + MFI_STAT_FLASH_ERROR = 0x10, + MFI_STAT_FLASH_IMAGE_BAD = 0x11, + MFI_STAT_FLASH_IMAGE_INCOMPLETE = 0x12, + MFI_STAT_FLASH_NOT_OPEN = 0x13, + MFI_STAT_FLASH_NOT_STARTED = 0x14, + MFI_STAT_FLUSH_FAILED = 0x15, + MFI_STAT_HOST_CODE_NOT_FOUNT = 0x16, + MFI_STAT_LD_CC_IN_PROGRESS = 0x17, + MFI_STAT_LD_INIT_IN_PROGRESS = 0x18, + MFI_STAT_LD_LBA_OUT_OF_RANGE = 0x19, + MFI_STAT_LD_MAX_CONFIGURED = 0x1a, + MFI_STAT_LD_NOT_OPTIMAL = 0x1b, + MFI_STAT_LD_RBLD_IN_PROGRESS = 0x1c, + MFI_STAT_LD_RECON_IN_PROGRESS = 0x1d, + MFI_STAT_LD_WRONG_RAID_LEVEL = 0x1e, + MFI_STAT_MAX_SPARES_EXCEEDED = 0x1f, + MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, + MFI_STAT_MFC_HW_ERROR = 0x21, + MFI_STAT_NO_HW_PRESENT = 0x22, + MFI_STAT_NOT_FOUND = 0x23, + MFI_STAT_NOT_IN_ENCL = 0x24, + MFI_STAT_PD_CLEAR_IN_PROGRESS = 0x25, + MFI_STAT_PD_TYPE_WRONG = 0x26, + MFI_STAT_PR_DISABLED = 0x27, + MFI_STAT_ROW_INDEX_INVALID = 0x28, + MFI_STAT_SAS_CONFIG_INVALID_ACTION = 0x29, + MFI_STAT_SAS_CONFIG_INVALID_DATA = 0x2a, + MFI_STAT_SAS_CONFIG_INVALID_PAGE = 0x2b, + MFI_STAT_SAS_CONFIG_INVALID_TYPE = 0x2c, + MFI_STAT_SCSI_DONE_WITH_ERROR = 0x2d, + MFI_STAT_SCSI_IO_FAILED = 0x2e, + MFI_STAT_SCSI_RESERVATION_CONFLICT = 0x2f, + MFI_STAT_SHUTDOWN_FAILED = 0x30, + MFI_STAT_TIME_NOT_SET = 0x31, + MFI_STAT_WRONG_STATE = 0x32, + MFI_STAT_INVALID_STATUS = 0xFF + +}; + +enum MR_EVT_CLASS { + + MR_EVT_CLASS_DEBUG = -2, + MR_EVT_CLASS_PROGRESS = -1, + MR_EVT_CLASS_INFO = 0, + MR_EVT_CLASS_WARNING = 1, + MR_EVT_CLASS_CRITICAL = 2, + MR_EVT_CLASS_FATAL = 3, + MR_EVT_CLASS_DEAD = 4, + +}; + +enum MR_EVT_LOCALE{ + + MR_EVT_LOCALE_LD = 0x0001, + MR_EVT_LOCALE_PD = 0x0002, + MR_EVT_LOCALE_ENCL = 0x0004, + MR_EVT_LOCALE_BBU = 0x0008, + MR_EVT_LOCALE_SAS = 0x0010, + MR_EVT_LOCALE_CTRL = 0x0020, + MR_EVT_LOCALE_CONFIG = 0x0040, + MR_EVT_LOCALE_CLUSTER = 0x0080, + MR_EVT_LOCALE_ALL = 0xffff, + +}; + +enum MR_EVT_ARGS { + + MR_EVT_ARGS_NONE, + MR_EVT_ARGS_CDB_SENSE, + MR_EVT_ARGS_LD, + MR_EVT_ARGS_LD_COUNT, + MR_EVT_ARGS_LD_LBA, + MR_EVT_ARGS_LD_OWNER, + MR_EVT_ARGS_LD_LBA_PD_LBA, + MR_EVT_ARGS_LD_PROG, + MR_EVT_ARGS_LD_STATE, + MR_EVT_ARGS_LD_STRIP, + MR_EVT_ARGS_PD, + MR_EVT_ARGS_PD_ERR, + MR_EVT_ARGS_PD_LBA, + MR_EVT_ARGS_PD_LBA_LD, + MR_EVT_ARGS_PD_PROG, + MR_EVT_ARGS_PD_STATE, + MR_EVT_ARGS_PCI, + MR_EVT_ARGS_RATE, + MR_EVT_ARGS_STR, + MR_EVT_ARGS_TIME, + MR_EVT_ARGS_ECC, + +}; + +/* + * SAS controller properties + */ +struct megasas_ctrl_prop { + + uint16_t seq_num; + uint16_t pred_fail_poll_interval; + uint16_t intr_throttle_count; + uint16_t intr_throttle_timeouts; + + uint8_t rebuild_rate; + uint8_t patrol_read_rate; + uint8_t bgi_rate; + uint8_t cc_rate; + uint8_t recon_rate; + + uint8_t cache_flush_interval; + + uint8_t spinup_drv_count; + uint8_t spinup_delay; + + uint8_t cluster_enable; + uint8_t coercion_mode; + uint8_t disk_write_cache_disable; + uint8_t alarm_enable; + + uint8_t reserved[44]; + +} __attribute__ ((packed)); + +/* + * SAS controller information + */ +struct megasas_ctrl_info { + + /* + * PCI device information + */ + struct { + + uint16_t vendor_id; + uint16_t device_id; + uint16_t sub_vendor_id; + uint16_t sub_device_id; + uint8_t reserved[24]; + + } __attribute__ ((packed)) pci; + + /* + * Host interface information + */ + struct { + + uint8_t PCIX : 1; + uint8_t PCIE : 1; + uint8_t iSCSI : 1; + uint8_t SAS_3G : 1; + uint8_t reserved_0 : 4; + uint8_t reserved_1[6]; + uint8_t port_count; + uint64_t port_addr[8]; + + } __attribute__ ((packed)) host_interface; + + /* + * Device (backend) interface information + */ + struct { + + uint8_t SPI : 1; + uint8_t SAS_3G : 1; + uint8_t SATA_1_5G : 1; + uint8_t SATA_3G : 1; + uint8_t reserved_0 : 4; + uint8_t reserved_1[6]; + uint8_t port_count; + uint64_t port_addr[8]; + + } __attribute__ ((packed)) device_interface; + + /* + * List of components residing in flash. All str are null terminated + */ + uint32_t image_check_word; + uint32_t image_component_count; + + struct { + + char name[8]; + char version[32]; + char build_date[16]; + char built_time[16]; + + } __attribute__ ((packed)) image_component[8]; + + /* + * List of flash components that have been flashed on the card, but + * are not in use, pending reset of the adapter. This list will be + * empty if a flash operation has not occurred. All stings are null + * terminated + */ + uint32_t pending_image_component_count; + + struct { + + char name[8]; + char version[32]; + char build_date[16]; + char build_time[16]; + + } __attribute__ ((packed)) pending_image_component[8]; + + uint8_t max_arms; + uint8_t max_spans; + uint8_t max_arrays; + uint8_t max_lds; + + char product_name[80]; + char serial_no[32]; + + /* + * Other physical/controller/operation information. Indicates the + * presence of the hardware + */ + struct { + + uint32_t bbu : 1; + uint32_t alarm : 1; + uint32_t nvram : 1; + uint32_t uart : 1; + uint32_t reserved : 28; + + } __attribute__ ((packed)) hw_present; + + uint32_t current_fw_time; + + /* + * Maximum data transfer sizes + */ + uint16_t max_concurrent_cmds; + uint16_t max_sge_count; + uint32_t max_request_size; + + /* + * Logical and physical device counts + */ + uint16_t ld_present_count; + uint16_t ld_degraded_count; + uint16_t ld_offline_count; + + uint16_t pd_present_count; + uint16_t pd_disk_present_count; + uint16_t pd_disk_pred_failure_count; + uint16_t pd_disk_failed_count; + + /* + * Memory size information + */ + uint16_t nvram_size; + uint16_t memory_size; + uint16_t flash_size; + + /* + * Error counters + */ + uint16_t mem_correctable_error_count; + uint16_t mem_uncorrectable_error_count; + + /* + * Cluster information + */ + uint8_t cluster_permitted; + uint8_t cluster_active; + uint8_t reserved_1[2]; + + /* + * Controller capabilities structures + */ + struct { + + uint32_t raid_level_0 : 1; + uint32_t raid_level_1 : 1; + uint32_t raid_level_5 : 1; + uint32_t raid_level_1E : 1; + uint32_t reserved : 28; + + } __attribute__ ((packed)) raid_levels; + + struct { + + uint32_t rbld_rate : 1; + uint32_t cc_rate : 1; + uint32_t bgi_rate : 1; + uint32_t recon_rate : 1; + uint32_t patrol_rate : 1; + uint32_t alarm_control : 1; + uint32_t cluster_supported : 1; + uint32_t bbu : 1; + uint32_t spanning_allowed : 1; + uint32_t dedicated_hotspares : 1; + uint32_t revertible_hotspares : 1; + uint32_t foreign_config_import : 1; + uint32_t self_diagnostic : 1; + uint32_t reserved : 19; + + } __attribute__ ((packed)) adapter_operations; + + struct { + + uint32_t read_policy : 1; + uint32_t write_policy : 1; + uint32_t io_policy : 1; + uint32_t access_policy : 1; + uint32_t reserved : 28; + + } __attribute__ ((packed)) ld_operations; + + struct { + + uint8_t min; + uint8_t max; + uint8_t reserved[2]; + + } __attribute__ ((packed)) stripe_size_operations; + + struct { + + uint32_t force_online : 1; + uint32_t force_offline : 1; + uint32_t force_rebuild : 1; + uint32_t reserved : 29; + + } __attribute__ ((packed)) pd_operations; + + struct { + + uint32_t ctrl_supports_sas : 1; + uint32_t ctrl_supports_sata : 1; + uint32_t allow_mix_in_encl : 1; + uint32_t allow_mix_in_ld : 1; + uint32_t allow_sata_in_cluster : 1; + uint32_t reserved : 27; + + } __attribute__ ((packed)) pd_mix_support; + + /* + * Include the controller properties (changeable items) + */ + uint8_t reserved_2[12]; + struct megasas_ctrl_prop properties; + + uint8_t pad[0x800 - 0x640]; + +} __attribute__ ((packed)); + +/* + * =============================== + * MegaRAID SAS driver definitions + * =============================== + */ + + +#define MEGADRV_MAX_NUM_CMD 1024 + +#define MEGADRV_MAX_PD_CHANNELS 2 +#define MEGADRV_MAX_LD_CHANNELS 2 +#define MEGADRV_MAX_CHANNELS (MEGADRV_MAX_PD_CHANNELS + \ + MEGADRV_MAX_LD_CHANNELS) +#define MEGADRV_MAX_DEV_PER_CHANNEL 128 +#define MEGADRV_DEFAULT_INIT_ID -1 +#define MEGADRV_MAX_CMD_PER_LUN 1000 +#define MEGADRV_MAX_LUN 8 +#define MEGADRV_MAX_LD 64 + +#define MEGADRV_RESET_WAIT_TIME 300 +#define MEGADRV_RESET_NOTICE_INTERVAL 5 + +/* + * All MFI register set macros accept megasas_register_set* + */ +#define RD_OB_MSG_0(regs) readl((void*)(&(regs)->outbound_msg_0)) +#define WR_IN_MSG_0(v, regs) writel((v),(void*)(&(regs)->inbound_msg_0)) +#define WR_IN_DOORBELL(v, regs) writel((v),(void*)(&(regs)->inbound_doorbell)) +#define WR_IN_QPORT(v, regs) writel((v),(void*)(&(regs)->inbound_queue_port)) + +#define RD_OB_INTR_STATUS(regs) readl((void*)(&(regs)->outbound_intr_status)) +#define WR_OB_INTR_STATUS(v, regs) writel((v),(&(regs)->outbound_intr_status)) + +/* + * When FW is in MFI_STATE_READY or MFI_STATE_OPERATIONAL, the state data + * of Outbound Msg Reg 0 indicates max concurrent cmds supported, max SGEs + * supported per cmd and if 64-bit MFAs (M64) is enabled or disabled. + */ +#define MFI_MAX_SUPP_CMDS(regs) ((RD_OB_MSG_0(regs)) & 0x00FFFF) +#define MFI_MAX_SUPP_SGES(regs) (((RD_OB_MSG_0(regs)) & 0x0FF0000) >> 0x10) +#define MFI_M64_ENABLED(regs) ((RD_OB_MSG_0(regs)) & 0x1000000) + +#define MFI_OB_INTR_STATUS_MASK 0x00000002 +#define MFI_POLL_TIMEOUT_SECS 10 + +#define MFI_ENABLE_INTR(regs) writel(1,(void*)(&(regs)->outbound_intr_mask)) + +#define MFI_DISABLE_INTR(regs) \ +{ \ + uint32_t disable = ~0x00000001; \ + uint32_t mask = readl((void*)(&(regs)->outbound_intr_mask)); \ + mask &= disable; \ + writel(mask, (void*)(&(regs)->outbound_intr_mask)); \ +} + + +struct megasas_register_set { + + uint32_t reserved_0[4]; /*0000h*/ + + uint32_t inbound_msg_0; /*0010h*/ + uint32_t inbound_msg_1; /*0014h*/ + uint32_t outbound_msg_0; /*0018h*/ + uint32_t outbound_msg_1; /*001Ch*/ + + uint32_t inbound_doorbell; /*0020h*/ + uint32_t inbound_intr_status; /*0024h*/ + uint32_t inbound_intr_mask; /*0028h*/ + + uint32_t outbound_doorbell; /*002Ch*/ + uint32_t outbound_intr_status; /*0030h*/ + uint32_t outbound_intr_mask; /*0034h*/ + + uint32_t reserved_1[2]; /*0038h*/ + + uint32_t inbound_queue_port; /*0040h*/ + uint32_t outbound_queue_port; /*0044h*/ + + uint32_t reserved_2; /*004Ch*/ + + uint32_t index_registers[1004]; /*0050h*/ + +} __attribute__ ((packed)); + +struct megasas_sge32 { + + uint32_t phys_addr; + uint32_t length; + +} __attribute__ ((packed)); + +struct megasas_sge64 { + + uint64_t phys_addr; + uint32_t length; + +} __attribute__ ((packed)); + +union megasas_sgl { + + struct megasas_sge32 sge32[1]; + struct megasas_sge64 sge64[1]; + +} __attribute__ ((packed)); + +struct megasas_header { + + uint8_t cmd; /*00h*/ + uint8_t sense_len; /*01h*/ + uint8_t cmd_status; /*02h*/ + uint8_t scsi_status; /*03h*/ + + uint8_t target_id; /*04h*/ + uint8_t lun; /*05h*/ + uint8_t cdb_len; /*06h*/ + uint8_t sge_count; /*07h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t timeout; /*12h*/ + uint32_t data_xferlen; /*14h*/ + +} __attribute__ ((packed)); + +union megasas_sgl_frame { + + struct megasas_sge32 sge32[8]; + struct megasas_sge64 sge64[5]; + +} __attribute__ ((packed)); + +struct megasas_init_frame { + + uint8_t cmd; /*00h*/ + uint8_t reserved_0; /*01h*/ + uint8_t cmd_status; /*02h*/ + + uint8_t reserved_1; /*03h*/ + uint32_t reserved_2; /*04h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t reserved_3; /*12h*/ + uint32_t data_xfer_len; /*14h*/ + + uint32_t queue_info_new_phys_addr_lo; /*18h*/ + uint32_t queue_info_new_phys_addr_hi; /*1Ch*/ + uint32_t queue_info_old_phys_addr_lo; /*20h*/ + uint32_t queue_info_old_phys_addr_hi; /*24h*/ + + uint32_t reserved_4[6]; /*28h*/ + +} __attribute__ ((packed)); + +struct megasas_init_queue_info { + + uint32_t init_flags; /*00h*/ + uint32_t reply_queue_entries; /*04h*/ + + uint32_t reply_queue_start_phys_addr_lo; /*08h*/ + uint32_t reply_queue_start_phys_addr_hi; /*0Ch*/ + uint32_t producer_index_phys_addr_lo; /*10h*/ + uint32_t producer_index_phys_addr_hi; /*14h*/ + uint32_t consumer_index_phys_addr_lo; /*18h*/ + uint32_t consumer_index_phys_addr_hi; /*1Ch*/ + +} __attribute__ ((packed)); + +struct megasas_io_frame { + + uint8_t cmd; /*00h*/ + uint8_t sense_len; /*01h*/ + uint8_t cmd_status; /*02h*/ + uint8_t scsi_status; /*03h*/ + + uint8_t target_id; /*04h*/ + uint8_t access_byte; /*05h*/ + uint8_t reserved_0; /*06h*/ + uint8_t sge_count; /*07h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t timeout; /*12h*/ + uint32_t lba_count; /*14h*/ + + uint32_t sense_buf_phys_addr_lo; /*18h*/ + uint32_t sense_buf_phys_addr_hi; /*1Ch*/ + + unsigned long start_lba_lo; /*20h*/ + unsigned long start_lba_hi; /*24h*/ + + union megasas_sgl sgl; /*28h*/ + +} __attribute__ ((packed)); + +struct megasas_pthru_frame { + + uint8_t cmd; /*00h*/ + uint8_t sense_len; /*01h*/ + uint8_t cmd_status; /*02h*/ + uint8_t scsi_status; /*03h*/ + + uint8_t target_id; /*04h*/ + uint8_t lun; /*05h*/ + uint8_t cdb_len; /*06h*/ + uint8_t sge_count; /*07h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t timeout; /*12h*/ + uint32_t data_xfer_len; /*14h*/ + + uint32_t sense_buf_phys_addr_lo; /*18h*/ + uint32_t sense_buf_phys_addr_hi; /*1Ch*/ + + uint8_t cdb[16]; /*20h*/ + union megasas_sgl sgl; /*30h*/ + +} __attribute__ ((packed)); + +struct megasas_dcmd_frame { + + uint8_t cmd; /*00h*/ + uint8_t reserved_0; /*01h*/ + uint8_t cmd_status; /*02h*/ + uint8_t reserved_1[4]; /*03h*/ + uint8_t sge_count; /*07h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t timeout; /*12h*/ + + uint32_t data_xfer_len; /*14h*/ + uint32_t opcode; /*18h*/ + + uint8_t mbox[12]; /*1Ch*/ + + union megasas_sgl sgl; /*28h*/ + +} __attribute__ ((packed)); + +struct megasas_abort_frame { + + uint8_t cmd; /*00h*/ + uint8_t reserved_0; /*01h*/ + uint8_t cmd_status; /*02h*/ + + uint8_t reserved_1; /*03h*/ + uint32_t reserved_2; /*04h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t reserved_3; /*12h*/ + uint32_t reserved_4; /*14h*/ + + uint32_t abort_context; /*18h*/ + uint32_t pad_1; /*1Ch*/ + + uint32_t abort_mfi_phys_addr_lo; /*20h*/ + uint32_t abort_mfi_phys_addr_hi; /*24h*/ + + uint32_t reserved_5[6]; /*28h*/ + +} __attribute__ ((packed)); + +struct megasas_smp_frame { + + uint8_t cmd; /*00h*/ + uint8_t reserved_1; /*01h*/ + uint8_t cmd_status; /*02h*/ + uint8_t connection_status; /*03h*/ + + uint8_t reserved_2[3]; /*04h*/ + uint8_t sge_count; /*07h*/ + + uint32_t context; /*08h*/ + uint32_t pad_0; /*0Ch*/ + + uint16_t flags; /*10h*/ + uint16_t timeout; /*12h*/ + + uint32_t data_xfer_len; /*14h*/ + + uint8_t phy_id; /*18h*/ + uint8_t port_id; /*19h*/ + uint8_t connection_rate; /*1Ah*/ + uint8_t reserved_3; /*1Bh*/ + + uint32_t reserved_4; /*1Ch*/ + + uint64_t sas_addr; /*20h*/ + + union megasas_sgl request_sgl; /*28h*/ + union megasas_sgl response_sgl; + +} __attribute__ ((packed)); + +union megasas_frame { + + struct megasas_header hdr; + struct megasas_init_frame init; + struct megasas_io_frame io; + struct megasas_pthru_frame pthru; + struct megasas_dcmd_frame dcmd; + struct megasas_abort_frame abort; + struct megasas_smp_frame smp; + + uint8_t raw_bytes[64]; + +}; + +struct megasas_cmd; + +union megasas_evt_class_locale { + + struct { + uint16_t locale; + uint8_t reserved; + int8_t class; + } __attribute__ ((packed)) members; + + uint32_t word; + +} __attribute__ ((packed)); + +struct megasas_evt_log_info { + uint32_t newest_seq_num; + uint32_t oldest_seq_num; + uint32_t clear_seq_num; + uint32_t shutdown_seq_num; + uint32_t boot_seq_num; + +} __attribute__ ((packed)); + +struct megasas_progress { + + uint16_t progress; + uint16_t elapsed_seconds; + +} __attribute__ ((packed)); + +struct megasas_evtarg_ld { + + uint16_t target_id; + uint8_t ld_index; + uint8_t reserved; + +} __attribute__ ((packed)); + +struct megasas_evtarg_pd { + uint16_t device_id; + uint8_t encl_index; + uint8_t slot_number; + +} __attribute__ ((packed)); + +struct megasas_evt_detail { + + uint32_t seq_num; + uint32_t time_stamp; + uint32_t code; + union megasas_evt_class_locale cl; + uint8_t arg_type; + uint8_t reserved1[15]; + + union { + struct { + struct megasas_evtarg_pd pd; + uint8_t cdb_length; + uint8_t sense_length; + uint8_t reserved[2]; + uint8_t cdb[16]; + uint8_t sense[64]; + } __attribute__ ((packed)) cdbSense; + + struct megasas_evtarg_ld ld; + + struct { + struct megasas_evtarg_ld ld; + uint64_t count; + } __attribute__ ((packed)) ld_count; + + struct { + uint64_t lba; + struct megasas_evtarg_ld ld; + } __attribute__ ((packed)) ld_lba; + + struct { + struct megasas_evtarg_ld ld; + uint32_t prevOwner; + uint32_t newOwner; + } __attribute__ ((packed)) ld_owner; + + struct { + uint64_t ld_lba; + uint64_t pd_lba; + struct megasas_evtarg_ld ld; + struct megasas_evtarg_pd pd; + } __attribute__ ((packed)) ld_lba_pd_lba; + + struct { + struct megasas_evtarg_ld ld; + struct megasas_progress prog; + } __attribute__ ((packed)) ld_prog; + + struct { + struct megasas_evtarg_ld ld; + uint32_t prev_state; + uint32_t new_state; + } __attribute__ ((packed)) ld_state; + + struct { + uint64_t strip; + struct megasas_evtarg_ld ld; + } __attribute__ ((packed)) ld_strip; + + struct megasas_evtarg_pd pd; + + struct { + struct megasas_evtarg_pd pd; + uint32_t err; + } __attribute__ ((packed)) pd_err; + + struct { + uint64_t lba; + struct megasas_evtarg_pd pd; + } __attribute__ ((packed)) pd_lba; + + struct { + uint64_t lba; + struct megasas_evtarg_pd pd; + struct megasas_evtarg_ld ld; + } __attribute__ ((packed)) pd_lba_ld; + + struct { + struct megasas_evtarg_pd pd; + struct megasas_progress prog; + } __attribute__ ((packed)) pd_prog; + + struct { + struct megasas_evtarg_pd pd; + uint32_t prevState; + uint32_t newState; + } __attribute__ ((packed)) pd_state; + + struct { + uint16_t vendorId; + uint16_t deviceId; + uint16_t subVendorId; + uint16_t subDeviceId; + } __attribute__ ((packed)) pci; + + uint32_t rate; + char str[96]; + + struct { + uint32_t rtc; + uint32_t elapsedSeconds; + } __attribute__ ((packed)) time; + + struct { + uint32_t ecar; + uint32_t elog; + char str[64]; + } __attribute__ ((packed)) ecc; + + uint8_t b[96]; + uint16_t s[48]; + uint32_t w[24]; + uint64_t d[12]; + } args; + + char description[128]; + +} __attribute__ ((packed)); + +struct megasas_instance { + + uint32_t producer; + uint32_t consumer; + + uint32_t* reply_queue; + dma_addr_t reply_queue_phys_addr; + + dma_addr_t phys_addr; + + unsigned long base_addr; + struct megasas_register_set __iomem* reg_set; + + int8_t init_id; + uint8_t reserved[3]; + + uint16_t max_num_sge; + uint16_t max_fw_cmds; + uint32_t max_sectors_per_req; + + struct megasas_cmd* cmd_list; + struct list_head cmd_pool; + spinlock_t cmd_pool_lock; + struct dma_pool* frame_dma_pool; + struct dma_pool* sense_dma_pool; + + struct megasas_evt_detail evt_detail; + struct megasas_cmd* aen_cmd; + + struct Scsi_Host* host; + spinlock_t lock; + spinlock_t* host_lock; + + wait_queue_head_t int_cmd_wait_q; + wait_queue_head_t abort_cmd_wait_q; + + struct pci_dev* pdev; + uint32_t unique_id; +}; + +/* + * Various conversion macros from SCSI command + */ +#define SCP2HOST(scp) (scp)->device->host // to host +#define SCP2HOSTDATA(scp) SCP2HOST(scp)->hostdata // to soft state +#define SCP2CHANNEL(scp) (scp)->device->channel // to channel +#define SCP2TARGET(scp) (scp)->device->id // to target +#define SCP2LUN(scp) (scp)->device->lun // to LUN + +#define SCSIHOST2ADAP(host) (((caddr_t *)(host->hostdata))[0]) +#define SCP2ADAPTER(scp) (struct megasas_instance*)SCSIHOST2ADAP(SCP2HOST(scp)) + +#define MEGADRV_IS_LOGICAL(scp) \ + (SCP2CHANNEL(scp) < MEGADRV_MAX_PD_CHANNELS) ? 0 : 1 + +#define MEGADRV_DEV_INDEX(inst, scp) \ + ((SCP2CHANNEL(scp) % 2) * MEGADRV_MAX_DEV_PER_CHANNEL) + SCP2TARGET(scp) + +struct megasas_cmd { + + union megasas_frame* frame; + dma_addr_t frame_phys_addr; + uint8_t* sense; + dma_addr_t sense_phys_addr; + + uint32_t index; + uint8_t sync_cmd; + uint8_t cmd_status; + uint16_t abort_aen; + + struct list_head list; + struct scsi_cmnd* scmd; + uint32_t frame_count; +}; + +#define MAX_MGMT_ADAPTERS 1024 +#define IOC_SIGNATURE "LSILOGIC" + +#define IOC_CMD_FIRMWARE 0x0 +#define MR_DRIVER_IOCTL_COMMON 0xF0010000 +#define MR_DRIVER_IOCTL_DRIVER_VERSION 0xF0010100 +#define MR_DRIVER_IOCTL_PCI_INFORMATION 0xF0010200 +#define MR_DRIVER_IOCTL_MEGARAID_STATISTICS 0xF0010300 + +#define MR_DRIVER_IOCTL_LINUX 0xF0040000 +#define MR_LINUX_GET_ADAPTER_COUNT (MR_DRIVER_IOCTL_LINUX | 0x0100) +#define MR_LINUX_GET_ADAPTER_MAP (MR_DRIVER_IOCTL_LINUX | 0x0200) +#define MR_LINUX_GET_AEN (MR_DRIVER_IOCTL_LINUX | 0x0300) + +#define MR_MAX_SENSE_LENGTH 32 + +struct iocpacket { + + uint16_t version; + uint16_t controller_id; + uint8_t signature[8]; + uint32_t reserved_1; + uint32_t control_code; + uint32_t reserved_2[2]; + uint8_t frame[64]; + union megasas_sgl_frame sgl_frame; + uint8_t sense_buff[MR_MAX_SENSE_LENGTH]; + uint8_t data[1]; + +} __attribute__ ((packed)); + +struct megasas_mgmt_info { + + uint16_t count; + struct megasas_instance* instance[MAX_MGMT_ADAPTERS]; + uint16_t map[MAX_MGMT_ADAPTERS]; + int max_index; +}; + +struct megasas_drv_ver { + uint8_t signature[12]; + uint8_t os_name[16]; + uint8_t os_ver[12]; + uint8_t drv_name[20]; + uint8_t drv_ver[32]; + uint8_t drv_rel_date[20]; + +} __attribute__ ((packed)); + +#endif /*LSI_MEGARAID_SAS_H*/ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/