126780d9eSBradley Grove /* 226780d9eSBradley Grove * linux/drivers/scsi/esas2r/esas2r.h 326780d9eSBradley Grove * For use with ATTO ExpressSAS R6xx SAS/SATA RAID controllers 426780d9eSBradley Grove * 526780d9eSBradley Grove * Copyright (c) 2001-2013 ATTO Technology, Inc. 626780d9eSBradley Grove * (mailto:linuxdrivers@attotech.com) 726780d9eSBradley Grove * 826780d9eSBradley Grove * This program is free software; you can redistribute it and/or 926780d9eSBradley Grove * modify it under the terms of the GNU General Public License 1026780d9eSBradley Grove * as published by the Free Software Foundation; either version 2 1126780d9eSBradley Grove * of the License, or (at your option) any later version. 1226780d9eSBradley Grove * 1326780d9eSBradley Grove * This program is distributed in the hope that it will be useful, 1426780d9eSBradley Grove * but WITHOUT ANY WARRANTY; without even the implied warranty of 1526780d9eSBradley Grove * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1626780d9eSBradley Grove * GNU General Public License for more details. 1726780d9eSBradley Grove * 1826780d9eSBradley Grove * NO WARRANTY 1926780d9eSBradley Grove * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR 2026780d9eSBradley Grove * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT 2126780d9eSBradley Grove * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, 2226780d9eSBradley Grove * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is 2326780d9eSBradley Grove * solely responsible for determining the appropriateness of using and 2426780d9eSBradley Grove * distributing the Program and assumes all risks associated with its 2526780d9eSBradley Grove * exercise of rights under this Agreement, including but not limited to 2626780d9eSBradley Grove * the risks and costs of program errors, damage to or loss of data, 2726780d9eSBradley Grove * programs or equipment, and unavailability or interruption of operations. 2826780d9eSBradley Grove * 2926780d9eSBradley Grove * DISCLAIMER OF LIABILITY 3026780d9eSBradley Grove * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY 3126780d9eSBradley Grove * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3226780d9eSBradley Grove * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND 3326780d9eSBradley Grove * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 3426780d9eSBradley Grove * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 3526780d9eSBradley Grove * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED 3626780d9eSBradley Grove * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 3726780d9eSBradley Grove * 3826780d9eSBradley Grove * You should have received a copy of the GNU General Public License 3926780d9eSBradley Grove * along with this program; if not, write to the Free Software 4026780d9eSBradley Grove * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 4126780d9eSBradley Grove * USA. 4226780d9eSBradley Grove */ 4326780d9eSBradley Grove 4426780d9eSBradley Grove #include <linux/kernel.h> 4526780d9eSBradley Grove #include <linux/delay.h> 4626780d9eSBradley Grove #include <linux/pci.h> 4726780d9eSBradley Grove #include <linux/proc_fs.h> 4826780d9eSBradley Grove #include <linux/workqueue.h> 4926780d9eSBradley Grove #include <linux/interrupt.h> 5026780d9eSBradley Grove #include <linux/module.h> 5126780d9eSBradley Grove #include <linux/vmalloc.h> 5226780d9eSBradley Grove #include <scsi/scsi.h> 5326780d9eSBradley Grove #include <scsi/scsi_host.h> 5426780d9eSBradley Grove #include <scsi/scsi_cmnd.h> 5526780d9eSBradley Grove #include <scsi/scsi_device.h> 5626780d9eSBradley Grove #include <scsi/scsi_eh.h> 5726780d9eSBradley Grove #include <scsi/scsi_tcq.h> 5826780d9eSBradley Grove 5926780d9eSBradley Grove #include "esas2r_log.h" 6026780d9eSBradley Grove #include "atioctl.h" 6126780d9eSBradley Grove #include "atvda.h" 6226780d9eSBradley Grove 6326780d9eSBradley Grove #ifndef ESAS2R_H 6426780d9eSBradley Grove #define ESAS2R_H 6526780d9eSBradley Grove 6626780d9eSBradley Grove /* Global Variables */ 6726780d9eSBradley Grove extern struct esas2r_adapter *esas2r_adapters[]; 6826780d9eSBradley Grove extern u8 *esas2r_buffered_ioctl; 6926780d9eSBradley Grove extern dma_addr_t esas2r_buffered_ioctl_addr; 7026780d9eSBradley Grove extern u32 esas2r_buffered_ioctl_size; 7126780d9eSBradley Grove extern struct pci_dev *esas2r_buffered_ioctl_pcid; 7226780d9eSBradley Grove #define SGL_PG_SZ_MIN 64 7326780d9eSBradley Grove #define SGL_PG_SZ_MAX 1024 7426780d9eSBradley Grove extern int sgl_page_size; 7526780d9eSBradley Grove #define NUM_SGL_MIN 8 7626780d9eSBradley Grove #define NUM_SGL_MAX 2048 7726780d9eSBradley Grove extern int num_sg_lists; 7826780d9eSBradley Grove #define NUM_REQ_MIN 4 7926780d9eSBradley Grove #define NUM_REQ_MAX 256 8026780d9eSBradley Grove extern int num_requests; 8126780d9eSBradley Grove #define NUM_AE_MIN 2 8226780d9eSBradley Grove #define NUM_AE_MAX 8 8326780d9eSBradley Grove extern int num_ae_requests; 8426780d9eSBradley Grove extern int cmd_per_lun; 8526780d9eSBradley Grove extern int can_queue; 8626780d9eSBradley Grove extern int esas2r_max_sectors; 8726780d9eSBradley Grove extern int sg_tablesize; 8826780d9eSBradley Grove extern int interrupt_mode; 8926780d9eSBradley Grove extern int num_io_requests; 9026780d9eSBradley Grove 9126780d9eSBradley Grove /* Macro defintions */ 9226780d9eSBradley Grove #define ESAS2R_MAX_ID 255 9326780d9eSBradley Grove #define MAX_ADAPTERS 32 9426780d9eSBradley Grove #define ESAS2R_DRVR_NAME "esas2r" 9526780d9eSBradley Grove #define ESAS2R_LONGNAME "ATTO ExpressSAS 6GB RAID Adapter" 9626780d9eSBradley Grove #define ESAS2R_MAX_DEVICES 32 9726780d9eSBradley Grove #define ATTONODE_NAME "ATTONode" 9826780d9eSBradley Grove #define ESAS2R_MAJOR_REV 1 9926780d9eSBradley Grove #define ESAS2R_MINOR_REV 00 10026780d9eSBradley Grove #define ESAS2R_VERSION_STR DEFINED_NUM_TO_STR(ESAS2R_MAJOR_REV) "." \ 10126780d9eSBradley Grove DEFINED_NUM_TO_STR(ESAS2R_MINOR_REV) 10226780d9eSBradley Grove #define ESAS2R_COPYRIGHT_YEARS "2001-2013" 10326780d9eSBradley Grove #define ESAS2R_DEFAULT_SGL_PAGE_SIZE 384 10426780d9eSBradley Grove #define ESAS2R_DEFAULT_CMD_PER_LUN 64 10526780d9eSBradley Grove #define ESAS2R_DEFAULT_NUM_SG_LISTS 1024 10626780d9eSBradley Grove #define DEFINED_NUM_TO_STR(num) NUM_TO_STR(num) 10726780d9eSBradley Grove #define NUM_TO_STR(num) #num 10826780d9eSBradley Grove 10926780d9eSBradley Grove #define ESAS2R_SGL_ALIGN 16 11026780d9eSBradley Grove #define ESAS2R_LIST_ALIGN 16 11126780d9eSBradley Grove #define ESAS2R_LIST_EXTRA ESAS2R_NUM_EXTRA 11226780d9eSBradley Grove #define ESAS2R_DATA_BUF_LEN 256 11326780d9eSBradley Grove #define ESAS2R_DEFAULT_TMO 5000 11426780d9eSBradley Grove #define ESAS2R_DISC_BUF_LEN 512 11526780d9eSBradley Grove #define ESAS2R_FWCOREDUMP_SZ 0x80000 11626780d9eSBradley Grove #define ESAS2R_NUM_PHYS 8 11726780d9eSBradley Grove #define ESAS2R_TARG_ID_INV 0xFFFF 11826780d9eSBradley Grove #define ESAS2R_INT_STS_MASK MU_INTSTAT_MASK 11926780d9eSBradley Grove #define ESAS2R_INT_ENB_MASK MU_INTSTAT_MASK 12026780d9eSBradley Grove #define ESAS2R_INT_DIS_MASK 0 12126780d9eSBradley Grove #define ESAS2R_MAX_TARGETS 256 12226780d9eSBradley Grove #define ESAS2R_KOBJ_NAME_LEN 20 12326780d9eSBradley Grove 12426780d9eSBradley Grove /* u16 (WORD) component macros */ 12526780d9eSBradley Grove #define LOBYTE(w) ((u8)(u16)(w)) 12626780d9eSBradley Grove #define HIBYTE(w) ((u8)(((u16)(w)) >> 8)) 12726780d9eSBradley Grove #define MAKEWORD(lo, hi) ((u16)((u8)(lo) | ((u16)(u8)(hi) << 8))) 12826780d9eSBradley Grove 12926780d9eSBradley Grove /* u32 (DWORD) component macros */ 13026780d9eSBradley Grove #define LOWORD(d) ((u16)(u32)(d)) 13126780d9eSBradley Grove #define HIWORD(d) ((u16)(((u32)(d)) >> 16)) 13226780d9eSBradley Grove #define MAKEDWORD(lo, hi) ((u32)((u16)(lo) | ((u32)(u16)(hi) << 16))) 13326780d9eSBradley Grove 13426780d9eSBradley Grove /* macro to get the lowest nonzero bit of a value */ 13526780d9eSBradley Grove #define LOBIT(x) ((x) & (0 - (x))) 13626780d9eSBradley Grove 13726780d9eSBradley Grove /* These functions are provided to access the chip's control registers. 13826780d9eSBradley Grove * The register is specified by its byte offset from the register base 13926780d9eSBradley Grove * for the adapter. 14026780d9eSBradley Grove */ 14126780d9eSBradley Grove #define esas2r_read_register_dword(a, reg) \ 14226780d9eSBradley Grove readl((void __iomem *)a->regs + (reg) + MW_REG_OFFSET_HWREG) 14326780d9eSBradley Grove 14426780d9eSBradley Grove #define esas2r_write_register_dword(a, reg, data) \ 14526780d9eSBradley Grove writel(data, (void __iomem *)(a->regs + (reg) + MW_REG_OFFSET_HWREG)) 14626780d9eSBradley Grove 14726780d9eSBradley Grove #define esas2r_flush_register_dword(a, r) esas2r_read_register_dword(a, r) 14826780d9eSBradley Grove 14926780d9eSBradley Grove /* This function is provided to access the chip's data window. The 15026780d9eSBradley Grove * register is specified by its byte offset from the window base 15126780d9eSBradley Grove * for the adapter. 15226780d9eSBradley Grove */ 15326780d9eSBradley Grove #define esas2r_read_data_byte(a, reg) \ 15426780d9eSBradley Grove readb((void __iomem *)a->data_window + (reg)) 15526780d9eSBradley Grove 15626780d9eSBradley Grove /* ATTO vendor and device Ids */ 15726780d9eSBradley Grove #define ATTO_VENDOR_ID 0x117C 15826780d9eSBradley Grove #define ATTO_DID_INTEL_IOP348 0x002C 15926780d9eSBradley Grove #define ATTO_DID_MV_88RC9580 0x0049 16026780d9eSBradley Grove #define ATTO_DID_MV_88RC9580TS 0x0066 16126780d9eSBradley Grove #define ATTO_DID_MV_88RC9580TSE 0x0067 16226780d9eSBradley Grove #define ATTO_DID_MV_88RC9580TL 0x0068 16326780d9eSBradley Grove 16426780d9eSBradley Grove /* ATTO subsystem device Ids */ 16526780d9eSBradley Grove #define ATTO_SSDID_TBT 0x4000 16626780d9eSBradley Grove #define ATTO_TSSC_3808 0x4066 16726780d9eSBradley Grove #define ATTO_TSSC_3808E 0x4067 16826780d9eSBradley Grove #define ATTO_TLSH_1068 0x4068 16926780d9eSBradley Grove #define ATTO_ESAS_R680 0x0049 17026780d9eSBradley Grove #define ATTO_ESAS_R608 0x004A 17126780d9eSBradley Grove #define ATTO_ESAS_R60F 0x004B 17226780d9eSBradley Grove #define ATTO_ESAS_R6F0 0x004C 17326780d9eSBradley Grove #define ATTO_ESAS_R644 0x004D 17426780d9eSBradley Grove #define ATTO_ESAS_R648 0x004E 17526780d9eSBradley Grove 17626780d9eSBradley Grove /* 17726780d9eSBradley Grove * flash definitions & structures 17826780d9eSBradley Grove * define the code types 17926780d9eSBradley Grove */ 18026780d9eSBradley Grove #define FBT_CPYR 0xAA00 18126780d9eSBradley Grove #define FBT_SETUP 0xAA02 18226780d9eSBradley Grove #define FBT_FLASH_VER 0xAA04 18326780d9eSBradley Grove 18426780d9eSBradley Grove /* offsets to various locations in flash */ 18526780d9eSBradley Grove #define FLS_OFFSET_BOOT (u32)(0x00700000) 18626780d9eSBradley Grove #define FLS_OFFSET_NVR (u32)(0x007C0000) 18726780d9eSBradley Grove #define FLS_OFFSET_CPYR FLS_OFFSET_NVR 18826780d9eSBradley Grove #define FLS_LENGTH_BOOT (FLS_OFFSET_CPYR - FLS_OFFSET_BOOT) 18926780d9eSBradley Grove #define FLS_BLOCK_SIZE (u32)(0x00020000) 19026780d9eSBradley Grove #define FI_NVR_2KB 0x0800 19126780d9eSBradley Grove #define FI_NVR_8KB 0x2000 19226780d9eSBradley Grove #define FM_BUF_SZ 0x800 19326780d9eSBradley Grove 19426780d9eSBradley Grove /* 19526780d9eSBradley Grove * marvell frey (88R9580) register definitions 19626780d9eSBradley Grove * chip revision identifiers 19726780d9eSBradley Grove */ 19826780d9eSBradley Grove #define MVR_FREY_B2 0xB2 19926780d9eSBradley Grove 20026780d9eSBradley Grove /* 20126780d9eSBradley Grove * memory window definitions. window 0 is the data window with definitions 20226780d9eSBradley Grove * of MW_DATA_XXX. window 1 is the register window with definitions of 20326780d9eSBradley Grove * MW_REG_XXX. 20426780d9eSBradley Grove */ 20526780d9eSBradley Grove #define MW_REG_WINDOW_SIZE (u32)(0x00040000) 20626780d9eSBradley Grove #define MW_REG_OFFSET_HWREG (u32)(0x00000000) 20726780d9eSBradley Grove #define MW_REG_OFFSET_PCI (u32)(0x00008000) 20826780d9eSBradley Grove #define MW_REG_PCI_HWREG_DELTA (MW_REG_OFFSET_PCI - MW_REG_OFFSET_HWREG) 20926780d9eSBradley Grove #define MW_DATA_WINDOW_SIZE (u32)(0x00020000) 21026780d9eSBradley Grove #define MW_DATA_ADDR_SER_FLASH (u32)(0xEC000000) 21126780d9eSBradley Grove #define MW_DATA_ADDR_SRAM (u32)(0xF4000000) 21226780d9eSBradley Grove #define MW_DATA_ADDR_PAR_FLASH (u32)(0xFC000000) 21326780d9eSBradley Grove 21426780d9eSBradley Grove /* 21526780d9eSBradley Grove * the following registers are for the communication 21626780d9eSBradley Grove * list interface (AKA message unit (MU)) 21726780d9eSBradley Grove */ 21826780d9eSBradley Grove #define MU_IN_LIST_ADDR_LO (u32)(0x00004000) 21926780d9eSBradley Grove #define MU_IN_LIST_ADDR_HI (u32)(0x00004004) 22026780d9eSBradley Grove 22126780d9eSBradley Grove #define MU_IN_LIST_WRITE (u32)(0x00004018) 22226780d9eSBradley Grove #define MU_ILW_TOGGLE (u32)(0x00004000) 22326780d9eSBradley Grove 22426780d9eSBradley Grove #define MU_IN_LIST_READ (u32)(0x0000401C) 22526780d9eSBradley Grove #define MU_ILR_TOGGLE (u32)(0x00004000) 22626780d9eSBradley Grove #define MU_ILIC_LIST (u32)(0x0000000F) 22726780d9eSBradley Grove #define MU_ILIC_LIST_F0 (u32)(0x00000000) 22826780d9eSBradley Grove #define MU_ILIC_DEST (u32)(0x00000F00) 22926780d9eSBradley Grove #define MU_ILIC_DEST_DDR (u32)(0x00000200) 23026780d9eSBradley Grove #define MU_IN_LIST_IFC_CONFIG (u32)(0x00004028) 23126780d9eSBradley Grove 23226780d9eSBradley Grove #define MU_IN_LIST_CONFIG (u32)(0x0000402C) 23326780d9eSBradley Grove #define MU_ILC_ENABLE (u32)(0x00000001) 23426780d9eSBradley Grove #define MU_ILC_ENTRY_MASK (u32)(0x000000F0) 23526780d9eSBradley Grove #define MU_ILC_ENTRY_4_DW (u32)(0x00000020) 23626780d9eSBradley Grove #define MU_ILC_DYNAMIC_SRC (u32)(0x00008000) 23726780d9eSBradley Grove #define MU_ILC_NUMBER_MASK (u32)(0x7FFF0000) 23826780d9eSBradley Grove #define MU_ILC_NUMBER_SHIFT 16 23926780d9eSBradley Grove 24026780d9eSBradley Grove #define MU_OUT_LIST_ADDR_LO (u32)(0x00004050) 24126780d9eSBradley Grove #define MU_OUT_LIST_ADDR_HI (u32)(0x00004054) 24226780d9eSBradley Grove 24326780d9eSBradley Grove #define MU_OUT_LIST_COPY_PTR_LO (u32)(0x00004058) 24426780d9eSBradley Grove #define MU_OUT_LIST_COPY_PTR_HI (u32)(0x0000405C) 24526780d9eSBradley Grove 24626780d9eSBradley Grove #define MU_OUT_LIST_WRITE (u32)(0x00004068) 24726780d9eSBradley Grove #define MU_OLW_TOGGLE (u32)(0x00004000) 24826780d9eSBradley Grove 24926780d9eSBradley Grove #define MU_OUT_LIST_COPY (u32)(0x0000406C) 25026780d9eSBradley Grove #define MU_OLC_TOGGLE (u32)(0x00004000) 25126780d9eSBradley Grove #define MU_OLC_WRT_PTR (u32)(0x00003FFF) 25226780d9eSBradley Grove 25326780d9eSBradley Grove #define MU_OUT_LIST_IFC_CONFIG (u32)(0x00004078) 25426780d9eSBradley Grove #define MU_OLIC_LIST (u32)(0x0000000F) 25526780d9eSBradley Grove #define MU_OLIC_LIST_F0 (u32)(0x00000000) 25626780d9eSBradley Grove #define MU_OLIC_SOURCE (u32)(0x00000F00) 25726780d9eSBradley Grove #define MU_OLIC_SOURCE_DDR (u32)(0x00000200) 25826780d9eSBradley Grove 25926780d9eSBradley Grove #define MU_OUT_LIST_CONFIG (u32)(0x0000407C) 26026780d9eSBradley Grove #define MU_OLC_ENABLE (u32)(0x00000001) 26126780d9eSBradley Grove #define MU_OLC_ENTRY_MASK (u32)(0x000000F0) 26226780d9eSBradley Grove #define MU_OLC_ENTRY_4_DW (u32)(0x00000020) 26326780d9eSBradley Grove #define MU_OLC_NUMBER_MASK (u32)(0x7FFF0000) 26426780d9eSBradley Grove #define MU_OLC_NUMBER_SHIFT 16 26526780d9eSBradley Grove 26626780d9eSBradley Grove #define MU_OUT_LIST_INT_STAT (u32)(0x00004088) 26726780d9eSBradley Grove #define MU_OLIS_INT (u32)(0x00000001) 26826780d9eSBradley Grove 26926780d9eSBradley Grove #define MU_OUT_LIST_INT_MASK (u32)(0x0000408C) 27026780d9eSBradley Grove #define MU_OLIS_MASK (u32)(0x00000001) 27126780d9eSBradley Grove 27226780d9eSBradley Grove /* 27326780d9eSBradley Grove * the maximum size of the communication lists is two greater than the 27426780d9eSBradley Grove * maximum amount of VDA requests. the extra are to prevent queue overflow. 27526780d9eSBradley Grove */ 27626780d9eSBradley Grove #define ESAS2R_MAX_NUM_REQS 256 27726780d9eSBradley Grove #define ESAS2R_NUM_EXTRA 2 27826780d9eSBradley Grove #define ESAS2R_MAX_COMM_LIST_SIZE (ESAS2R_MAX_NUM_REQS + ESAS2R_NUM_EXTRA) 27926780d9eSBradley Grove 28026780d9eSBradley Grove /* 28126780d9eSBradley Grove * the following registers are for the CPU interface 28226780d9eSBradley Grove */ 28326780d9eSBradley Grove #define MU_CTL_STATUS_IN (u32)(0x00010108) 28426780d9eSBradley Grove #define MU_CTL_IN_FULL_RST (u32)(0x00000020) 28526780d9eSBradley Grove #define MU_CTL_STATUS_IN_B2 (u32)(0x00010130) 28626780d9eSBradley Grove #define MU_CTL_IN_FULL_RST2 (u32)(0x80000000) 28726780d9eSBradley Grove #define MU_DOORBELL_IN (u32)(0x00010460) 28826780d9eSBradley Grove #define DRBL_RESET_BUS (u32)(0x00000002) 28926780d9eSBradley Grove #define DRBL_PAUSE_AE (u32)(0x00000004) 29026780d9eSBradley Grove #define DRBL_RESUME_AE (u32)(0x00000008) 29126780d9eSBradley Grove #define DRBL_MSG_IFC_DOWN (u32)(0x00000010) 29226780d9eSBradley Grove #define DRBL_FLASH_REQ (u32)(0x00000020) 29326780d9eSBradley Grove #define DRBL_FLASH_DONE (u32)(0x00000040) 29426780d9eSBradley Grove #define DRBL_FORCE_INT (u32)(0x00000080) 29526780d9eSBradley Grove #define DRBL_MSG_IFC_INIT (u32)(0x00000100) 29626780d9eSBradley Grove #define DRBL_POWER_DOWN (u32)(0x00000200) 29726780d9eSBradley Grove #define DRBL_DRV_VER_1 (u32)(0x00010000) 29826780d9eSBradley Grove #define DRBL_DRV_VER DRBL_DRV_VER_1 29926780d9eSBradley Grove #define MU_DOORBELL_IN_ENB (u32)(0x00010464) 30026780d9eSBradley Grove #define MU_DOORBELL_OUT (u32)(0x00010480) 30126780d9eSBradley Grove #define DRBL_PANIC_REASON_MASK (u32)(0x00F00000) 30226780d9eSBradley Grove #define DRBL_UNUSED_HANDLER (u32)(0x00100000) 30326780d9eSBradley Grove #define DRBL_UNDEF_INSTR (u32)(0x00200000) 30426780d9eSBradley Grove #define DRBL_PREFETCH_ABORT (u32)(0x00300000) 30526780d9eSBradley Grove #define DRBL_DATA_ABORT (u32)(0x00400000) 30626780d9eSBradley Grove #define DRBL_JUMP_TO_ZERO (u32)(0x00500000) 30726780d9eSBradley Grove #define DRBL_FW_RESET (u32)(0x00080000) 30826780d9eSBradley Grove #define DRBL_FW_VER_MSK (u32)(0x00070000) 30926780d9eSBradley Grove #define DRBL_FW_VER_0 (u32)(0x00000000) 31026780d9eSBradley Grove #define DRBL_FW_VER_1 (u32)(0x00010000) 31126780d9eSBradley Grove #define DRBL_FW_VER DRBL_FW_VER_1 31226780d9eSBradley Grove #define MU_DOORBELL_OUT_ENB (u32)(0x00010484) 31326780d9eSBradley Grove #define DRBL_ENB_MASK (u32)(0x00F803FF) 31426780d9eSBradley Grove #define MU_INT_STATUS_OUT (u32)(0x00010200) 31526780d9eSBradley Grove #define MU_INTSTAT_POST_OUT (u32)(0x00000010) 31626780d9eSBradley Grove #define MU_INTSTAT_DRBL_IN (u32)(0x00000100) 31726780d9eSBradley Grove #define MU_INTSTAT_DRBL (u32)(0x00001000) 31826780d9eSBradley Grove #define MU_INTSTAT_MASK (u32)(0x00001010) 31926780d9eSBradley Grove #define MU_INT_MASK_OUT (u32)(0x0001020C) 32026780d9eSBradley Grove 32126780d9eSBradley Grove /* PCI express registers accessed via window 1 */ 32226780d9eSBradley Grove #define MVR_PCI_WIN1_REMAP (u32)(0x00008438) 32326780d9eSBradley Grove #define MVRPW1R_ENABLE (u32)(0x00000001) 32426780d9eSBradley Grove 32526780d9eSBradley Grove 32626780d9eSBradley Grove /* structures */ 32726780d9eSBradley Grove 32826780d9eSBradley Grove /* inbound list dynamic source entry */ 32926780d9eSBradley Grove struct esas2r_inbound_list_source_entry { 33026780d9eSBradley Grove u64 address; 33126780d9eSBradley Grove u32 length; 33226780d9eSBradley Grove #define HWILSE_INTERFACE_F0 0x00000000 33326780d9eSBradley Grove u32 reserved; 33426780d9eSBradley Grove }; 33526780d9eSBradley Grove 33626780d9eSBradley Grove /* PCI data structure in expansion ROM images */ 33726780d9eSBradley Grove struct __packed esas2r_boot_header { 33826780d9eSBradley Grove char signature[4]; 33926780d9eSBradley Grove u16 vendor_id; 34026780d9eSBradley Grove u16 device_id; 34126780d9eSBradley Grove u16 VPD; 34226780d9eSBradley Grove u16 struct_length; 34326780d9eSBradley Grove u8 struct_revision; 34426780d9eSBradley Grove u8 class_code[3]; 34526780d9eSBradley Grove u16 image_length; 34626780d9eSBradley Grove u16 code_revision; 34726780d9eSBradley Grove u8 code_type; 34826780d9eSBradley Grove #define CODE_TYPE_PC 0 34926780d9eSBradley Grove #define CODE_TYPE_OPEN 1 35026780d9eSBradley Grove #define CODE_TYPE_EFI 3 35126780d9eSBradley Grove u8 indicator; 35226780d9eSBradley Grove #define INDICATOR_LAST 0x80 35326780d9eSBradley Grove u8 reserved[2]; 35426780d9eSBradley Grove }; 35526780d9eSBradley Grove 35626780d9eSBradley Grove struct __packed esas2r_boot_image { 35726780d9eSBradley Grove u16 signature; 35826780d9eSBradley Grove u8 reserved[22]; 35926780d9eSBradley Grove u16 header_offset; 36026780d9eSBradley Grove u16 pnp_offset; 36126780d9eSBradley Grove }; 36226780d9eSBradley Grove 36326780d9eSBradley Grove struct __packed esas2r_pc_image { 36426780d9eSBradley Grove u16 signature; 36526780d9eSBradley Grove u8 length; 36626780d9eSBradley Grove u8 entry_point[3]; 36726780d9eSBradley Grove u8 checksum; 36826780d9eSBradley Grove u16 image_end; 36926780d9eSBradley Grove u16 min_size; 37026780d9eSBradley Grove u8 rom_flags; 37126780d9eSBradley Grove u8 reserved[12]; 37226780d9eSBradley Grove u16 header_offset; 37326780d9eSBradley Grove u16 pnp_offset; 37426780d9eSBradley Grove struct esas2r_boot_header boot_image; 37526780d9eSBradley Grove }; 37626780d9eSBradley Grove 37726780d9eSBradley Grove struct __packed esas2r_efi_image { 37826780d9eSBradley Grove u16 signature; 37926780d9eSBradley Grove u16 length; 38026780d9eSBradley Grove u32 efi_signature; 38126780d9eSBradley Grove #define EFI_ROM_SIG 0x00000EF1 38226780d9eSBradley Grove u16 image_type; 38326780d9eSBradley Grove #define EFI_IMAGE_APP 10 38426780d9eSBradley Grove #define EFI_IMAGE_BSD 11 38526780d9eSBradley Grove #define EFI_IMAGE_RTD 12 38626780d9eSBradley Grove u16 machine_type; 38726780d9eSBradley Grove #define EFI_MACHINE_IA32 0x014c 38826780d9eSBradley Grove #define EFI_MACHINE_IA64 0x0200 38926780d9eSBradley Grove #define EFI_MACHINE_X64 0x8664 39026780d9eSBradley Grove #define EFI_MACHINE_EBC 0x0EBC 39126780d9eSBradley Grove u16 compression; 39226780d9eSBradley Grove #define EFI_UNCOMPRESSED 0x0000 39326780d9eSBradley Grove #define EFI_COMPRESSED 0x0001 39426780d9eSBradley Grove u8 reserved[8]; 39526780d9eSBradley Grove u16 efi_offset; 39626780d9eSBradley Grove u16 header_offset; 39726780d9eSBradley Grove u16 reserved2; 39826780d9eSBradley Grove struct esas2r_boot_header boot_image; 39926780d9eSBradley Grove }; 40026780d9eSBradley Grove 40126780d9eSBradley Grove struct esas2r_adapter; 40226780d9eSBradley Grove struct esas2r_sg_context; 40326780d9eSBradley Grove struct esas2r_request; 40426780d9eSBradley Grove 40526780d9eSBradley Grove typedef void (*RQCALLBK) (struct esas2r_adapter *a, 40626780d9eSBradley Grove struct esas2r_request *rq); 40726780d9eSBradley Grove typedef bool (*RQBUILDSGL) (struct esas2r_adapter *a, 40826780d9eSBradley Grove struct esas2r_sg_context *sgc); 40926780d9eSBradley Grove 41026780d9eSBradley Grove struct esas2r_component_header { 41126780d9eSBradley Grove u8 img_type; 41226780d9eSBradley Grove #define CH_IT_FW 0x00 41326780d9eSBradley Grove #define CH_IT_NVR 0x01 41426780d9eSBradley Grove #define CH_IT_BIOS 0x02 41526780d9eSBradley Grove #define CH_IT_MAC 0x03 41626780d9eSBradley Grove #define CH_IT_CFG 0x04 41726780d9eSBradley Grove #define CH_IT_EFI 0x05 41826780d9eSBradley Grove u8 status; 41926780d9eSBradley Grove #define CH_STAT_PENDING 0xff 42026780d9eSBradley Grove #define CH_STAT_FAILED 0x00 42126780d9eSBradley Grove #define CH_STAT_SUCCESS 0x01 42226780d9eSBradley Grove #define CH_STAT_RETRY 0x02 42326780d9eSBradley Grove #define CH_STAT_INVALID 0x03 42426780d9eSBradley Grove u8 pad[2]; 42526780d9eSBradley Grove u32 version; 42626780d9eSBradley Grove u32 length; 42726780d9eSBradley Grove u32 image_offset; 42826780d9eSBradley Grove }; 42926780d9eSBradley Grove 43026780d9eSBradley Grove #define FI_REL_VER_SZ 16 43126780d9eSBradley Grove 43226780d9eSBradley Grove struct esas2r_flash_img_v0 { 43326780d9eSBradley Grove u8 fi_version; 43426780d9eSBradley Grove #define FI_VERSION_0 00 43526780d9eSBradley Grove u8 status; 43626780d9eSBradley Grove u8 adap_typ; 43726780d9eSBradley Grove u8 action; 43826780d9eSBradley Grove u32 length; 43926780d9eSBradley Grove u16 checksum; 44026780d9eSBradley Grove u16 driver_error; 44126780d9eSBradley Grove u16 flags; 44226780d9eSBradley Grove u16 num_comps; 44326780d9eSBradley Grove #define FI_NUM_COMPS_V0 5 44426780d9eSBradley Grove u8 rel_version[FI_REL_VER_SZ]; 44526780d9eSBradley Grove struct esas2r_component_header cmp_hdr[FI_NUM_COMPS_V0]; 44626780d9eSBradley Grove u8 scratch_buf[FM_BUF_SZ]; 44726780d9eSBradley Grove }; 44826780d9eSBradley Grove 44926780d9eSBradley Grove struct esas2r_flash_img { 45026780d9eSBradley Grove u8 fi_version; 45126780d9eSBradley Grove #define FI_VERSION_1 01 45226780d9eSBradley Grove u8 status; 45326780d9eSBradley Grove #define FI_STAT_SUCCESS 0x00 45426780d9eSBradley Grove #define FI_STAT_FAILED 0x01 45526780d9eSBradley Grove #define FI_STAT_REBOOT 0x02 45626780d9eSBradley Grove #define FI_STAT_ADAPTYP 0x03 45726780d9eSBradley Grove #define FI_STAT_INVALID 0x04 45826780d9eSBradley Grove #define FI_STAT_CHKSUM 0x05 45926780d9eSBradley Grove #define FI_STAT_LENGTH 0x06 46026780d9eSBradley Grove #define FI_STAT_UNKNOWN 0x07 46126780d9eSBradley Grove #define FI_STAT_IMG_VER 0x08 46226780d9eSBradley Grove #define FI_STAT_BUSY 0x09 46326780d9eSBradley Grove #define FI_STAT_DUAL 0x0A 46426780d9eSBradley Grove #define FI_STAT_MISSING 0x0B 46526780d9eSBradley Grove #define FI_STAT_UNSUPP 0x0C 46626780d9eSBradley Grove #define FI_STAT_ERASE 0x0D 46726780d9eSBradley Grove #define FI_STAT_FLASH 0x0E 46826780d9eSBradley Grove #define FI_STAT_DEGRADED 0x0F 46926780d9eSBradley Grove u8 adap_typ; 47026780d9eSBradley Grove #define FI_AT_UNKNWN 0xFF 47126780d9eSBradley Grove #define FI_AT_SUN_LAKE 0x0B 47226780d9eSBradley Grove #define FI_AT_MV_9580 0x0F 47326780d9eSBradley Grove u8 action; 47426780d9eSBradley Grove #define FI_ACT_DOWN 0x00 47526780d9eSBradley Grove #define FI_ACT_UP 0x01 47626780d9eSBradley Grove #define FI_ACT_UPSZ 0x02 47726780d9eSBradley Grove #define FI_ACT_MAX 0x02 47826780d9eSBradley Grove #define FI_ACT_DOWN1 0x80 47926780d9eSBradley Grove u32 length; 48026780d9eSBradley Grove u16 checksum; 48126780d9eSBradley Grove u16 driver_error; 48226780d9eSBradley Grove u16 flags; 48326780d9eSBradley Grove #define FI_FLG_NVR_DEF 0x0001 48426780d9eSBradley Grove u16 num_comps; 48526780d9eSBradley Grove #define FI_NUM_COMPS_V1 6 48626780d9eSBradley Grove u8 rel_version[FI_REL_VER_SZ]; 48726780d9eSBradley Grove struct esas2r_component_header cmp_hdr[FI_NUM_COMPS_V1]; 48826780d9eSBradley Grove u8 scratch_buf[FM_BUF_SZ]; 48926780d9eSBradley Grove }; 49026780d9eSBradley Grove 49126780d9eSBradley Grove /* definitions for flash script (FS) commands */ 49226780d9eSBradley Grove struct esas2r_ioctlfs_command { 49326780d9eSBradley Grove u8 command; 49426780d9eSBradley Grove #define ESAS2R_FS_CMD_ERASE 0 49526780d9eSBradley Grove #define ESAS2R_FS_CMD_READ 1 49626780d9eSBradley Grove #define ESAS2R_FS_CMD_BEGINW 2 49726780d9eSBradley Grove #define ESAS2R_FS_CMD_WRITE 3 49826780d9eSBradley Grove #define ESAS2R_FS_CMD_COMMIT 4 49926780d9eSBradley Grove #define ESAS2R_FS_CMD_CANCEL 5 50026780d9eSBradley Grove u8 checksum; 50126780d9eSBradley Grove u8 reserved[2]; 50226780d9eSBradley Grove u32 flash_addr; 50326780d9eSBradley Grove u32 length; 50426780d9eSBradley Grove u32 image_offset; 50526780d9eSBradley Grove }; 50626780d9eSBradley Grove 50726780d9eSBradley Grove struct esas2r_ioctl_fs { 50826780d9eSBradley Grove u8 version; 50926780d9eSBradley Grove #define ESAS2R_FS_VER 0 51026780d9eSBradley Grove u8 status; 51126780d9eSBradley Grove u8 driver_error; 51226780d9eSBradley Grove u8 adap_type; 51326780d9eSBradley Grove #define ESAS2R_FS_AT_ESASRAID2 3 51426780d9eSBradley Grove #define ESAS2R_FS_AT_TSSASRAID2 4 51526780d9eSBradley Grove #define ESAS2R_FS_AT_TSSASRAID2E 5 51626780d9eSBradley Grove #define ESAS2R_FS_AT_TLSASHBA 6 51726780d9eSBradley Grove u8 driver_ver; 51826780d9eSBradley Grove u8 reserved[11]; 51926780d9eSBradley Grove struct esas2r_ioctlfs_command command; 52026780d9eSBradley Grove u8 data[1]; 52126780d9eSBradley Grove }; 52226780d9eSBradley Grove 52326780d9eSBradley Grove struct esas2r_sas_nvram { 52426780d9eSBradley Grove u8 signature[4]; 52526780d9eSBradley Grove u8 version; 52626780d9eSBradley Grove #define SASNVR_VERSION_0 0x00 52726780d9eSBradley Grove #define SASNVR_VERSION SASNVR_VERSION_0 52826780d9eSBradley Grove u8 checksum; 52926780d9eSBradley Grove #define SASNVR_CKSUM_SEED 0x5A 53026780d9eSBradley Grove u8 max_lun_for_target; 53126780d9eSBradley Grove u8 pci_latency; 53226780d9eSBradley Grove #define SASNVR_PCILAT_DIS 0x00 53326780d9eSBradley Grove #define SASNVR_PCILAT_MIN 0x10 53426780d9eSBradley Grove #define SASNVR_PCILAT_MAX 0xF8 53526780d9eSBradley Grove u8 options1; 53626780d9eSBradley Grove #define SASNVR1_BOOT_DRVR 0x01 53726780d9eSBradley Grove #define SASNVR1_BOOT_SCAN 0x02 53826780d9eSBradley Grove #define SASNVR1_DIS_PCI_MWI 0x04 53926780d9eSBradley Grove #define SASNVR1_FORCE_ORD_Q 0x08 54026780d9eSBradley Grove #define SASNVR1_CACHELINE_0 0x10 54126780d9eSBradley Grove #define SASNVR1_DIS_DEVSORT 0x20 54226780d9eSBradley Grove #define SASNVR1_PWR_MGT_EN 0x40 54326780d9eSBradley Grove #define SASNVR1_WIDEPORT 0x80 54426780d9eSBradley Grove u8 options2; 54526780d9eSBradley Grove #define SASNVR2_SINGLE_BUS 0x01 54626780d9eSBradley Grove #define SASNVR2_SLOT_BIND 0x02 54726780d9eSBradley Grove #define SASNVR2_EXP_PROG 0x04 54826780d9eSBradley Grove #define SASNVR2_CMDTHR_LUN 0x08 54926780d9eSBradley Grove #define SASNVR2_HEARTBEAT 0x10 55026780d9eSBradley Grove #define SASNVR2_INT_CONNECT 0x20 55126780d9eSBradley Grove #define SASNVR2_SW_MUX_CTRL 0x40 55226780d9eSBradley Grove #define SASNVR2_DISABLE_NCQ 0x80 55326780d9eSBradley Grove u8 int_coalescing; 55426780d9eSBradley Grove #define SASNVR_COAL_DIS 0x00 55526780d9eSBradley Grove #define SASNVR_COAL_LOW 0x01 55626780d9eSBradley Grove #define SASNVR_COAL_MED 0x02 55726780d9eSBradley Grove #define SASNVR_COAL_HI 0x03 55826780d9eSBradley Grove u8 cmd_throttle; 55926780d9eSBradley Grove #define SASNVR_CMDTHR_NONE 0x00 56026780d9eSBradley Grove u8 dev_wait_time; 56126780d9eSBradley Grove u8 dev_wait_count; 56226780d9eSBradley Grove u8 spin_up_delay; 56326780d9eSBradley Grove #define SASNVR_SPINUP_MAX 0x14 56426780d9eSBradley Grove u8 ssp_align_rate; 56526780d9eSBradley Grove u8 sas_addr[8]; 56626780d9eSBradley Grove u8 phy_speed[16]; 56726780d9eSBradley Grove #define SASNVR_SPEED_AUTO 0x00 56826780d9eSBradley Grove #define SASNVR_SPEED_1_5GB 0x01 56926780d9eSBradley Grove #define SASNVR_SPEED_3GB 0x02 57026780d9eSBradley Grove #define SASNVR_SPEED_6GB 0x03 57126780d9eSBradley Grove #define SASNVR_SPEED_12GB 0x04 57226780d9eSBradley Grove u8 phy_mux[16]; 57326780d9eSBradley Grove #define SASNVR_MUX_DISABLED 0x00 57426780d9eSBradley Grove #define SASNVR_MUX_1_5GB 0x01 57526780d9eSBradley Grove #define SASNVR_MUX_3GB 0x02 57626780d9eSBradley Grove #define SASNVR_MUX_6GB 0x03 57726780d9eSBradley Grove u8 phy_flags[16]; 57826780d9eSBradley Grove #define SASNVR_PHF_DISABLED 0x01 57926780d9eSBradley Grove #define SASNVR_PHF_RD_ONLY 0x02 58026780d9eSBradley Grove u8 sort_type; 58126780d9eSBradley Grove #define SASNVR_SORT_SAS_ADDR 0x00 58226780d9eSBradley Grove #define SASNVR_SORT_H308_CONN 0x01 58326780d9eSBradley Grove #define SASNVR_SORT_PHY_ID 0x02 58426780d9eSBradley Grove #define SASNVR_SORT_SLOT_ID 0x03 58526780d9eSBradley Grove u8 dpm_reqcmd_lmt; 58626780d9eSBradley Grove u8 dpm_stndby_time; 58726780d9eSBradley Grove u8 dpm_active_time; 58826780d9eSBradley Grove u8 phy_target_id[16]; 58926780d9eSBradley Grove #define SASNVR_PTI_DISABLED 0xFF 59026780d9eSBradley Grove u8 virt_ses_mode; 59126780d9eSBradley Grove #define SASNVR_VSMH_DISABLED 0x00 59226780d9eSBradley Grove u8 read_write_mode; 59326780d9eSBradley Grove #define SASNVR_RWM_DEFAULT 0x00 59426780d9eSBradley Grove u8 link_down_to; 59526780d9eSBradley Grove u8 reserved[0xA1]; 59626780d9eSBradley Grove }; 59726780d9eSBradley Grove 59826780d9eSBradley Grove typedef u32 (*PGETPHYSADDR) (struct esas2r_sg_context *sgc, u64 *addr); 59926780d9eSBradley Grove 60026780d9eSBradley Grove struct esas2r_sg_context { 60126780d9eSBradley Grove struct esas2r_adapter *adapter; 60226780d9eSBradley Grove struct esas2r_request *first_req; 60326780d9eSBradley Grove u32 length; 60426780d9eSBradley Grove u8 *cur_offset; 60526780d9eSBradley Grove PGETPHYSADDR get_phys_addr; 60626780d9eSBradley Grove union { 60726780d9eSBradley Grove struct { 60826780d9eSBradley Grove struct atto_vda_sge *curr; 60926780d9eSBradley Grove struct atto_vda_sge *last; 61026780d9eSBradley Grove struct atto_vda_sge *limit; 61126780d9eSBradley Grove struct atto_vda_sge *chain; 61226780d9eSBradley Grove } a64; 61326780d9eSBradley Grove struct { 61426780d9eSBradley Grove struct atto_physical_region_description *curr; 61526780d9eSBradley Grove struct atto_physical_region_description *chain; 61626780d9eSBradley Grove u32 sgl_max_cnt; 61726780d9eSBradley Grove u32 sge_cnt; 61826780d9eSBradley Grove } prd; 61926780d9eSBradley Grove } sge; 62026780d9eSBradley Grove struct scatterlist *cur_sgel; 62126780d9eSBradley Grove u8 *exp_offset; 62226780d9eSBradley Grove int num_sgel; 62326780d9eSBradley Grove int sgel_count; 62426780d9eSBradley Grove }; 62526780d9eSBradley Grove 62626780d9eSBradley Grove struct esas2r_target { 62726780d9eSBradley Grove u8 flags; 62826780d9eSBradley Grove #define TF_PASS_THRU 0x01 62926780d9eSBradley Grove #define TF_USED 0x02 63026780d9eSBradley Grove u8 new_target_state; 63126780d9eSBradley Grove u8 target_state; 63226780d9eSBradley Grove u8 buffered_target_state; 63326780d9eSBradley Grove #define TS_NOT_PRESENT 0x00 63426780d9eSBradley Grove #define TS_PRESENT 0x05 63526780d9eSBradley Grove #define TS_LUN_CHANGE 0x06 63626780d9eSBradley Grove #define TS_INVALID 0xFF 63726780d9eSBradley Grove u32 block_size; 63826780d9eSBradley Grove u32 inter_block; 63926780d9eSBradley Grove u32 inter_byte; 64026780d9eSBradley Grove u16 virt_targ_id; 64126780d9eSBradley Grove u16 phys_targ_id; 64226780d9eSBradley Grove u8 identifier_len; 64326780d9eSBradley Grove u64 sas_addr; 64426780d9eSBradley Grove u8 identifier[60]; 64526780d9eSBradley Grove struct atto_vda_ae_lu lu_event; 64626780d9eSBradley Grove }; 64726780d9eSBradley Grove 64826780d9eSBradley Grove struct esas2r_request { 64926780d9eSBradley Grove struct list_head comp_list; 65026780d9eSBradley Grove struct list_head req_list; 65126780d9eSBradley Grove union atto_vda_req *vrq; 65226780d9eSBradley Grove struct esas2r_mem_desc *vrq_md; 65326780d9eSBradley Grove union { 65426780d9eSBradley Grove void *data_buf; 65526780d9eSBradley Grove union atto_vda_rsp_data *vda_rsp_data; 65626780d9eSBradley Grove }; 65726780d9eSBradley Grove u8 *sense_buf; 65826780d9eSBradley Grove struct list_head sg_table_head; 65926780d9eSBradley Grove struct esas2r_mem_desc *sg_table; 66026780d9eSBradley Grove u32 timeout; 66126780d9eSBradley Grove #define RQ_TIMEOUT_S1 0xFFFFFFFF 66226780d9eSBradley Grove #define RQ_TIMEOUT_S2 0xFFFFFFFE 66326780d9eSBradley Grove #define RQ_MAX_TIMEOUT 0xFFFFFFFD 66426780d9eSBradley Grove u16 target_id; 66526780d9eSBradley Grove u8 req_type; 66626780d9eSBradley Grove #define RT_INI_REQ 0x01 66726780d9eSBradley Grove #define RT_DISC_REQ 0x02 66826780d9eSBradley Grove u8 sense_len; 66926780d9eSBradley Grove union atto_vda_func_rsp func_rsp; 67026780d9eSBradley Grove RQCALLBK comp_cb; 67126780d9eSBradley Grove RQCALLBK interrupt_cb; 67226780d9eSBradley Grove void *interrupt_cx; 67326780d9eSBradley Grove u8 flags; 67426780d9eSBradley Grove #define RF_1ST_IBLK_BASE 0x04 67526780d9eSBradley Grove #define RF_FAILURE_OK 0x08 67626780d9eSBradley Grove u8 req_stat; 67726780d9eSBradley Grove u16 vda_req_sz; 67826780d9eSBradley Grove #define RQ_SIZE_DEFAULT 0 67926780d9eSBradley Grove u64 lba; 68026780d9eSBradley Grove RQCALLBK aux_req_cb; 68126780d9eSBradley Grove void *aux_req_cx; 68226780d9eSBradley Grove u32 blk_len; 68326780d9eSBradley Grove u32 max_blk_len; 68426780d9eSBradley Grove union { 68526780d9eSBradley Grove struct scsi_cmnd *cmd; 68626780d9eSBradley Grove u8 *task_management_status_ptr; 68726780d9eSBradley Grove }; 68826780d9eSBradley Grove }; 68926780d9eSBradley Grove 69026780d9eSBradley Grove struct esas2r_flash_context { 69126780d9eSBradley Grove struct esas2r_flash_img *fi; 69226780d9eSBradley Grove RQCALLBK interrupt_cb; 69326780d9eSBradley Grove u8 *sgc_offset; 69426780d9eSBradley Grove u8 *scratch; 69526780d9eSBradley Grove u32 fi_hdr_len; 69626780d9eSBradley Grove u8 task; 69726780d9eSBradley Grove #define FMTSK_ERASE_BOOT 0 69826780d9eSBradley Grove #define FMTSK_WRTBIOS 1 69926780d9eSBradley Grove #define FMTSK_READBIOS 2 70026780d9eSBradley Grove #define FMTSK_WRTMAC 3 70126780d9eSBradley Grove #define FMTSK_READMAC 4 70226780d9eSBradley Grove #define FMTSK_WRTEFI 5 70326780d9eSBradley Grove #define FMTSK_READEFI 6 70426780d9eSBradley Grove #define FMTSK_WRTCFG 7 70526780d9eSBradley Grove #define FMTSK_READCFG 8 70626780d9eSBradley Grove u8 func; 70726780d9eSBradley Grove u16 num_comps; 70826780d9eSBradley Grove u32 cmp_len; 70926780d9eSBradley Grove u32 flsh_addr; 71026780d9eSBradley Grove u32 curr_len; 71126780d9eSBradley Grove u8 comp_typ; 71226780d9eSBradley Grove struct esas2r_sg_context sgc; 71326780d9eSBradley Grove }; 71426780d9eSBradley Grove 71526780d9eSBradley Grove struct esas2r_disc_context { 71626780d9eSBradley Grove u8 disc_evt; 71726780d9eSBradley Grove #define DCDE_DEV_CHANGE 0x01 71826780d9eSBradley Grove #define DCDE_DEV_SCAN 0x02 71926780d9eSBradley Grove u8 state; 72026780d9eSBradley Grove #define DCS_DEV_RMV 0x00 72126780d9eSBradley Grove #define DCS_DEV_ADD 0x01 72226780d9eSBradley Grove #define DCS_BLOCK_DEV_SCAN 0x02 72326780d9eSBradley Grove #define DCS_RAID_GRP_INFO 0x03 72426780d9eSBradley Grove #define DCS_PART_INFO 0x04 72526780d9eSBradley Grove #define DCS_PT_DEV_INFO 0x05 72626780d9eSBradley Grove #define DCS_PT_DEV_ADDR 0x06 72726780d9eSBradley Grove #define DCS_DISC_DONE 0xFF 72826780d9eSBradley Grove u16 flags; 72926780d9eSBradley Grove #define DCF_DEV_CHANGE 0x0001 73026780d9eSBradley Grove #define DCF_DEV_SCAN 0x0002 73126780d9eSBradley Grove #define DCF_POLLED 0x8000 73226780d9eSBradley Grove u32 interleave; 73326780d9eSBradley Grove u32 block_size; 73426780d9eSBradley Grove u16 dev_ix; 73526780d9eSBradley Grove u8 part_num; 73626780d9eSBradley Grove u8 raid_grp_ix; 73726780d9eSBradley Grove char raid_grp_name[16]; 73826780d9eSBradley Grove struct esas2r_target *curr_targ; 73926780d9eSBradley Grove u16 curr_virt_id; 74026780d9eSBradley Grove u16 curr_phys_id; 74126780d9eSBradley Grove u8 scan_gen; 74226780d9eSBradley Grove u8 dev_addr_type; 74326780d9eSBradley Grove u64 sas_addr; 74426780d9eSBradley Grove }; 74526780d9eSBradley Grove 74626780d9eSBradley Grove struct esas2r_mem_desc { 74726780d9eSBradley Grove struct list_head next_desc; 74826780d9eSBradley Grove void *virt_addr; 74926780d9eSBradley Grove u64 phys_addr; 75026780d9eSBradley Grove void *pad; 75126780d9eSBradley Grove void *esas2r_data; 75226780d9eSBradley Grove u32 esas2r_param; 75326780d9eSBradley Grove u32 size; 75426780d9eSBradley Grove }; 75526780d9eSBradley Grove 75626780d9eSBradley Grove enum fw_event_type { 75726780d9eSBradley Grove fw_event_null, 75826780d9eSBradley Grove fw_event_lun_change, 75926780d9eSBradley Grove fw_event_present, 76026780d9eSBradley Grove fw_event_not_present, 76126780d9eSBradley Grove fw_event_vda_ae 76226780d9eSBradley Grove }; 76326780d9eSBradley Grove 76426780d9eSBradley Grove struct esas2r_vda_ae { 76526780d9eSBradley Grove u32 signature; 76626780d9eSBradley Grove #define ESAS2R_VDA_EVENT_SIG 0x4154544F 76726780d9eSBradley Grove u8 bus_number; 76826780d9eSBradley Grove u8 devfn; 76926780d9eSBradley Grove u8 pad[2]; 77026780d9eSBradley Grove union atto_vda_ae vda_ae; 77126780d9eSBradley Grove }; 77226780d9eSBradley Grove 77326780d9eSBradley Grove struct esas2r_fw_event_work { 77426780d9eSBradley Grove struct list_head list; 77526780d9eSBradley Grove struct delayed_work work; 77626780d9eSBradley Grove struct esas2r_adapter *a; 77726780d9eSBradley Grove enum fw_event_type type; 77826780d9eSBradley Grove u8 data[sizeof(struct esas2r_vda_ae)]; 77926780d9eSBradley Grove }; 78026780d9eSBradley Grove 78126780d9eSBradley Grove enum state { 78226780d9eSBradley Grove FW_INVALID_ST, 78326780d9eSBradley Grove FW_STATUS_ST, 78426780d9eSBradley Grove FW_COMMAND_ST 78526780d9eSBradley Grove }; 78626780d9eSBradley Grove 78726780d9eSBradley Grove struct esas2r_firmware { 78826780d9eSBradley Grove enum state state; 78926780d9eSBradley Grove struct esas2r_flash_img header; 79026780d9eSBradley Grove u8 *data; 79126780d9eSBradley Grove u64 phys; 79226780d9eSBradley Grove int orig_len; 79326780d9eSBradley Grove void *header_buff; 79426780d9eSBradley Grove u64 header_buff_phys; 79526780d9eSBradley Grove }; 79626780d9eSBradley Grove 79726780d9eSBradley Grove struct esas2r_adapter { 79826780d9eSBradley Grove struct esas2r_target targetdb[ESAS2R_MAX_TARGETS]; 79926780d9eSBradley Grove struct esas2r_target *targetdb_end; 80026780d9eSBradley Grove unsigned char *regs; 80126780d9eSBradley Grove unsigned char *data_window; 8029588d24eSBradley Grove long flags; 8039588d24eSBradley Grove #define AF_PORT_CHANGE 0 8049588d24eSBradley Grove #define AF_CHPRST_NEEDED 1 8059588d24eSBradley Grove #define AF_CHPRST_PENDING 2 8069588d24eSBradley Grove #define AF_CHPRST_DETECTED 3 8079588d24eSBradley Grove #define AF_BUSRST_NEEDED 4 8089588d24eSBradley Grove #define AF_BUSRST_PENDING 5 8099588d24eSBradley Grove #define AF_BUSRST_DETECTED 6 8109588d24eSBradley Grove #define AF_DISABLED 7 8119588d24eSBradley Grove #define AF_FLASH_LOCK 8 8129588d24eSBradley Grove #define AF_OS_RESET 9 8139588d24eSBradley Grove #define AF_FLASHING 10 8149588d24eSBradley Grove #define AF_POWER_MGT 11 8159588d24eSBradley Grove #define AF_NVR_VALID 12 8169588d24eSBradley Grove #define AF_DEGRADED_MODE 13 8179588d24eSBradley Grove #define AF_DISC_PENDING 14 8189588d24eSBradley Grove #define AF_TASKLET_SCHEDULED 15 8199588d24eSBradley Grove #define AF_HEARTBEAT 16 8209588d24eSBradley Grove #define AF_HEARTBEAT_ENB 17 8219588d24eSBradley Grove #define AF_NOT_PRESENT 18 8229588d24eSBradley Grove #define AF_CHPRST_STARTED 19 8239588d24eSBradley Grove #define AF_FIRST_INIT 20 8249588d24eSBradley Grove #define AF_POWER_DOWN 21 8259588d24eSBradley Grove #define AF_DISC_IN_PROG 22 8269588d24eSBradley Grove #define AF_COMM_LIST_TOGGLE 23 8279588d24eSBradley Grove #define AF_LEGACY_SGE_MODE 24 8289588d24eSBradley Grove #define AF_DISC_POLLED 25 8299588d24eSBradley Grove long flags2; 8309588d24eSBradley Grove #define AF2_SERIAL_FLASH 0 8319588d24eSBradley Grove #define AF2_DEV_SCAN 1 8329588d24eSBradley Grove #define AF2_DEV_CNT_OK 2 8339588d24eSBradley Grove #define AF2_COREDUMP_AVAIL 3 8349588d24eSBradley Grove #define AF2_COREDUMP_SAVED 4 8359588d24eSBradley Grove #define AF2_VDA_POWER_DOWN 5 8369588d24eSBradley Grove #define AF2_THUNDERLINK 6 8379588d24eSBradley Grove #define AF2_THUNDERBOLT 7 8389588d24eSBradley Grove #define AF2_INIT_DONE 8 8399588d24eSBradley Grove #define AF2_INT_PENDING 9 8409588d24eSBradley Grove #define AF2_TIMER_TICK 10 8419588d24eSBradley Grove #define AF2_IRQ_CLAIMED 11 8429588d24eSBradley Grove #define AF2_MSI_ENABLED 12 84326780d9eSBradley Grove atomic_t disable_cnt; 84426780d9eSBradley Grove atomic_t dis_ints_cnt; 84526780d9eSBradley Grove u32 int_stat; 84626780d9eSBradley Grove u32 int_mask; 84726780d9eSBradley Grove u32 volatile *outbound_copy; 84826780d9eSBradley Grove struct list_head avail_request; 84926780d9eSBradley Grove spinlock_t request_lock; 85026780d9eSBradley Grove spinlock_t sg_list_lock; 85126780d9eSBradley Grove spinlock_t queue_lock; 85226780d9eSBradley Grove spinlock_t mem_lock; 85326780d9eSBradley Grove struct list_head free_sg_list_head; 85426780d9eSBradley Grove struct esas2r_mem_desc *sg_list_mds; 85526780d9eSBradley Grove struct list_head active_list; 85626780d9eSBradley Grove struct list_head defer_list; 85726780d9eSBradley Grove struct esas2r_request **req_table; 85826780d9eSBradley Grove union { 85926780d9eSBradley Grove u16 prev_dev_cnt; 86026780d9eSBradley Grove u32 heartbeat_time; 86126780d9eSBradley Grove #define ESAS2R_HEARTBEAT_TIME (3000) 86226780d9eSBradley Grove }; 86326780d9eSBradley Grove u32 chip_uptime; 86426780d9eSBradley Grove #define ESAS2R_CHP_UPTIME_MAX (60000) 86526780d9eSBradley Grove #define ESAS2R_CHP_UPTIME_CNT (20000) 86626780d9eSBradley Grove u64 uncached_phys; 86726780d9eSBradley Grove u8 *uncached; 86826780d9eSBradley Grove struct esas2r_sas_nvram *nvram; 86926780d9eSBradley Grove struct esas2r_request general_req; 87026780d9eSBradley Grove u8 init_msg; 87126780d9eSBradley Grove #define ESAS2R_INIT_MSG_START 1 87226780d9eSBradley Grove #define ESAS2R_INIT_MSG_INIT 2 87326780d9eSBradley Grove #define ESAS2R_INIT_MSG_GET_INIT 3 87426780d9eSBradley Grove #define ESAS2R_INIT_MSG_REINIT 4 87526780d9eSBradley Grove u16 cmd_ref_no; 87626780d9eSBradley Grove u32 fw_version; 87726780d9eSBradley Grove u32 fw_build; 87826780d9eSBradley Grove u32 chip_init_time; 87926780d9eSBradley Grove #define ESAS2R_CHPRST_TIME (180000) 88026780d9eSBradley Grove #define ESAS2R_CHPRST_WAIT_TIME (2000) 88126780d9eSBradley Grove u32 last_tick_time; 88226780d9eSBradley Grove u32 window_base; 88326780d9eSBradley Grove RQBUILDSGL build_sgl; 88426780d9eSBradley Grove struct esas2r_request *first_ae_req; 88526780d9eSBradley Grove u32 list_size; 88626780d9eSBradley Grove u32 last_write; 88726780d9eSBradley Grove u32 last_read; 88826780d9eSBradley Grove u16 max_vdareq_size; 88926780d9eSBradley Grove u16 disc_wait_cnt; 89026780d9eSBradley Grove struct esas2r_mem_desc inbound_list_md; 89126780d9eSBradley Grove struct esas2r_mem_desc outbound_list_md; 89226780d9eSBradley Grove struct esas2r_disc_context disc_ctx; 89326780d9eSBradley Grove u8 *disc_buffer; 89426780d9eSBradley Grove u32 disc_start_time; 89526780d9eSBradley Grove u32 disc_wait_time; 89626780d9eSBradley Grove u32 flash_ver; 89726780d9eSBradley Grove char flash_rev[16]; 89826780d9eSBradley Grove char fw_rev[16]; 89926780d9eSBradley Grove char image_type[16]; 90026780d9eSBradley Grove struct esas2r_flash_context flash_context; 90126780d9eSBradley Grove u32 num_targets_backend; 90226780d9eSBradley Grove u32 ioctl_tunnel; 90326780d9eSBradley Grove struct tasklet_struct tasklet; 90426780d9eSBradley Grove struct pci_dev *pcid; 90526780d9eSBradley Grove struct Scsi_Host *host; 90626780d9eSBradley Grove unsigned int index; 90726780d9eSBradley Grove char name[32]; 90826780d9eSBradley Grove struct timer_list timer; 90926780d9eSBradley Grove struct esas2r_firmware firmware; 91026780d9eSBradley Grove wait_queue_head_t nvram_waiter; 91126780d9eSBradley Grove int nvram_command_done; 91226780d9eSBradley Grove wait_queue_head_t fm_api_waiter; 91326780d9eSBradley Grove int fm_api_command_done; 91426780d9eSBradley Grove wait_queue_head_t vda_waiter; 91526780d9eSBradley Grove int vda_command_done; 91626780d9eSBradley Grove u8 *vda_buffer; 91726780d9eSBradley Grove u64 ppvda_buffer; 91826780d9eSBradley Grove #define VDA_BUFFER_HEADER_SZ (offsetof(struct atto_ioctl_vda, data)) 91926780d9eSBradley Grove #define VDA_MAX_BUFFER_SIZE (0x40000 + VDA_BUFFER_HEADER_SZ) 92026780d9eSBradley Grove wait_queue_head_t fs_api_waiter; 92126780d9eSBradley Grove int fs_api_command_done; 92226780d9eSBradley Grove u64 ppfs_api_buffer; 92326780d9eSBradley Grove u8 *fs_api_buffer; 92426780d9eSBradley Grove u32 fs_api_buffer_size; 92526780d9eSBradley Grove wait_queue_head_t buffered_ioctl_waiter; 92626780d9eSBradley Grove int buffered_ioctl_done; 92726780d9eSBradley Grove int uncached_size; 92826780d9eSBradley Grove struct workqueue_struct *fw_event_q; 92926780d9eSBradley Grove struct list_head fw_event_list; 93026780d9eSBradley Grove spinlock_t fw_event_lock; 93126780d9eSBradley Grove u8 fw_events_off; /* if '1', then ignore events */ 93226780d9eSBradley Grove char fw_event_q_name[ESAS2R_KOBJ_NAME_LEN]; 93326780d9eSBradley Grove /* 93426780d9eSBradley Grove * intr_mode stores the interrupt mode currently being used by this 93526780d9eSBradley Grove * adapter. it is based on the interrupt_mode module parameter, but 93626780d9eSBradley Grove * can be changed based on the ability (or not) to utilize the 93726780d9eSBradley Grove * mode requested by the parameter. 93826780d9eSBradley Grove */ 93926780d9eSBradley Grove int intr_mode; 94026780d9eSBradley Grove #define INTR_MODE_LEGACY 0 94126780d9eSBradley Grove #define INTR_MODE_MSI 1 94226780d9eSBradley Grove #define INTR_MODE_MSIX 2 94326780d9eSBradley Grove struct esas2r_sg_context fm_api_sgc; 94426780d9eSBradley Grove u8 *save_offset; 94526780d9eSBradley Grove struct list_head vrq_mds_head; 94626780d9eSBradley Grove struct esas2r_mem_desc *vrq_mds; 94726780d9eSBradley Grove int num_vrqs; 94826780d9eSBradley Grove struct semaphore fm_api_semaphore; 94926780d9eSBradley Grove struct semaphore fs_api_semaphore; 95026780d9eSBradley Grove struct semaphore nvram_semaphore; 95126780d9eSBradley Grove struct atto_ioctl *local_atto_ioctl; 95226780d9eSBradley Grove u8 fw_coredump_buff[ESAS2R_FWCOREDUMP_SZ]; 95326780d9eSBradley Grove unsigned int sysfs_fw_created:1; 95426780d9eSBradley Grove unsigned int sysfs_fs_created:1; 95526780d9eSBradley Grove unsigned int sysfs_vda_created:1; 95626780d9eSBradley Grove unsigned int sysfs_hw_created:1; 95726780d9eSBradley Grove unsigned int sysfs_live_nvram_created:1; 95826780d9eSBradley Grove unsigned int sysfs_default_nvram_created:1; 95926780d9eSBradley Grove }; 96026780d9eSBradley Grove 96126780d9eSBradley Grove /* 96226780d9eSBradley Grove * Function Declarations 96326780d9eSBradley Grove * SCSI functions 96426780d9eSBradley Grove */ 96526780d9eSBradley Grove int esas2r_release(struct Scsi_Host *); 96626780d9eSBradley Grove const char *esas2r_info(struct Scsi_Host *); 96726780d9eSBradley Grove int esas2r_write_params(struct esas2r_adapter *a, struct esas2r_request *rq, 96826780d9eSBradley Grove struct esas2r_sas_nvram *data); 96926780d9eSBradley Grove int esas2r_ioctl_handler(void *hostdata, int cmd, void __user *arg); 97026780d9eSBradley Grove int esas2r_ioctl(struct scsi_device *dev, int cmd, void __user *arg); 97126780d9eSBradley Grove u8 handle_hba_ioctl(struct esas2r_adapter *a, 97226780d9eSBradley Grove struct atto_ioctl *ioctl_hba); 97326780d9eSBradley Grove int esas2r_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd); 97426780d9eSBradley Grove int esas2r_show_info(struct seq_file *m, struct Scsi_Host *sh); 97526780d9eSBradley Grove int esas2r_slave_alloc(struct scsi_device *dev); 97626780d9eSBradley Grove int esas2r_slave_configure(struct scsi_device *dev); 97726780d9eSBradley Grove void esas2r_slave_destroy(struct scsi_device *dev); 97826780d9eSBradley Grove int esas2r_change_queue_depth(struct scsi_device *dev, int depth, int reason); 97926780d9eSBradley Grove int esas2r_change_queue_type(struct scsi_device *dev, int type); 98026780d9eSBradley Grove long esas2r_proc_ioctl(struct file *fp, unsigned int cmd, unsigned long arg); 98126780d9eSBradley Grove 98226780d9eSBradley Grove /* SCSI error handler (eh) functions */ 98326780d9eSBradley Grove int esas2r_eh_abort(struct scsi_cmnd *cmd); 98426780d9eSBradley Grove int esas2r_device_reset(struct scsi_cmnd *cmd); 98526780d9eSBradley Grove int esas2r_host_reset(struct scsi_cmnd *cmd); 98626780d9eSBradley Grove int esas2r_bus_reset(struct scsi_cmnd *cmd); 98726780d9eSBradley Grove int esas2r_target_reset(struct scsi_cmnd *cmd); 98826780d9eSBradley Grove 98926780d9eSBradley Grove /* Internal functions */ 99026780d9eSBradley Grove int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid, 99126780d9eSBradley Grove int index); 99226780d9eSBradley Grove int esas2r_cleanup(struct Scsi_Host *host); 99326780d9eSBradley Grove int esas2r_read_fw(struct esas2r_adapter *a, char *buf, long off, int count); 99426780d9eSBradley Grove int esas2r_write_fw(struct esas2r_adapter *a, const char *buf, long off, 99526780d9eSBradley Grove int count); 99626780d9eSBradley Grove int esas2r_read_vda(struct esas2r_adapter *a, char *buf, long off, int count); 99726780d9eSBradley Grove int esas2r_write_vda(struct esas2r_adapter *a, const char *buf, long off, 99826780d9eSBradley Grove int count); 99926780d9eSBradley Grove int esas2r_read_fs(struct esas2r_adapter *a, char *buf, long off, int count); 100026780d9eSBradley Grove int esas2r_write_fs(struct esas2r_adapter *a, const char *buf, long off, 100126780d9eSBradley Grove int count); 100226780d9eSBradley Grove void esas2r_adapter_tasklet(unsigned long context); 100326780d9eSBradley Grove irqreturn_t esas2r_interrupt(int irq, void *dev_id); 100426780d9eSBradley Grove irqreturn_t esas2r_msi_interrupt(int irq, void *dev_id); 100526780d9eSBradley Grove void esas2r_kickoff_timer(struct esas2r_adapter *a); 100626780d9eSBradley Grove int esas2r_suspend(struct pci_dev *pcid, pm_message_t state); 100726780d9eSBradley Grove int esas2r_resume(struct pci_dev *pcid); 100826780d9eSBradley Grove void esas2r_fw_event_off(struct esas2r_adapter *a); 100926780d9eSBradley Grove void esas2r_fw_event_on(struct esas2r_adapter *a); 101026780d9eSBradley Grove bool esas2r_nvram_write(struct esas2r_adapter *a, struct esas2r_request *rq, 101126780d9eSBradley Grove struct esas2r_sas_nvram *nvram); 101226780d9eSBradley Grove void esas2r_nvram_get_defaults(struct esas2r_adapter *a, 101326780d9eSBradley Grove struct esas2r_sas_nvram *nvram); 101426780d9eSBradley Grove void esas2r_complete_request_cb(struct esas2r_adapter *a, 101526780d9eSBradley Grove struct esas2r_request *rq); 101626780d9eSBradley Grove void esas2r_reset_detected(struct esas2r_adapter *a); 101726780d9eSBradley Grove void esas2r_target_state_changed(struct esas2r_adapter *ha, u16 targ_id, 101826780d9eSBradley Grove u8 state); 101926780d9eSBradley Grove int esas2r_req_status_to_error(u8 req_stat); 102026780d9eSBradley Grove void esas2r_kill_adapter(int i); 102126780d9eSBradley Grove void esas2r_free_request(struct esas2r_adapter *a, struct esas2r_request *rq); 102226780d9eSBradley Grove struct esas2r_request *esas2r_alloc_request(struct esas2r_adapter *a); 102326780d9eSBradley Grove u32 esas2r_get_uncached_size(struct esas2r_adapter *a); 102426780d9eSBradley Grove bool esas2r_init_adapter_struct(struct esas2r_adapter *a, 102526780d9eSBradley Grove void **uncached_area); 102626780d9eSBradley Grove bool esas2r_check_adapter(struct esas2r_adapter *a); 102726780d9eSBradley Grove bool esas2r_init_adapter_hw(struct esas2r_adapter *a, bool init_poll); 102826780d9eSBradley Grove void esas2r_start_request(struct esas2r_adapter *a, struct esas2r_request *rq); 102926780d9eSBradley Grove bool esas2r_send_task_mgmt(struct esas2r_adapter *a, 103026780d9eSBradley Grove struct esas2r_request *rqaux, u8 task_mgt_func); 103126780d9eSBradley Grove void esas2r_do_tasklet_tasks(struct esas2r_adapter *a); 103226780d9eSBradley Grove void esas2r_adapter_interrupt(struct esas2r_adapter *a); 103326780d9eSBradley Grove void esas2r_do_deferred_processes(struct esas2r_adapter *a); 103426780d9eSBradley Grove void esas2r_reset_bus(struct esas2r_adapter *a); 103526780d9eSBradley Grove void esas2r_reset_adapter(struct esas2r_adapter *a); 103626780d9eSBradley Grove void esas2r_timer_tick(struct esas2r_adapter *a); 103726780d9eSBradley Grove const char *esas2r_get_model_name(struct esas2r_adapter *a); 103826780d9eSBradley Grove const char *esas2r_get_model_name_short(struct esas2r_adapter *a); 103926780d9eSBradley Grove u32 esas2r_stall_execution(struct esas2r_adapter *a, u32 start_time, 104026780d9eSBradley Grove u32 *delay); 104126780d9eSBradley Grove void esas2r_build_flash_req(struct esas2r_adapter *a, 104226780d9eSBradley Grove struct esas2r_request *rq, 104326780d9eSBradley Grove u8 sub_func, 104426780d9eSBradley Grove u8 cksum, 104526780d9eSBradley Grove u32 addr, 104626780d9eSBradley Grove u32 length); 104726780d9eSBradley Grove void esas2r_build_mgt_req(struct esas2r_adapter *a, 104826780d9eSBradley Grove struct esas2r_request *rq, 104926780d9eSBradley Grove u8 sub_func, 105026780d9eSBradley Grove u8 scan_gen, 105126780d9eSBradley Grove u16 dev_index, 105226780d9eSBradley Grove u32 length, 105326780d9eSBradley Grove void *data); 105426780d9eSBradley Grove void esas2r_build_ae_req(struct esas2r_adapter *a, struct esas2r_request *rq); 105526780d9eSBradley Grove void esas2r_build_cli_req(struct esas2r_adapter *a, 105626780d9eSBradley Grove struct esas2r_request *rq, 105726780d9eSBradley Grove u32 length, 105826780d9eSBradley Grove u32 cmd_rsp_len); 105926780d9eSBradley Grove void esas2r_build_ioctl_req(struct esas2r_adapter *a, 106026780d9eSBradley Grove struct esas2r_request *rq, 106126780d9eSBradley Grove u32 length, 106226780d9eSBradley Grove u8 sub_func); 106326780d9eSBradley Grove void esas2r_build_cfg_req(struct esas2r_adapter *a, 106426780d9eSBradley Grove struct esas2r_request *rq, 106526780d9eSBradley Grove u8 sub_func, 106626780d9eSBradley Grove u32 length, 106726780d9eSBradley Grove void *data); 106826780d9eSBradley Grove void esas2r_power_down(struct esas2r_adapter *a); 106926780d9eSBradley Grove bool esas2r_power_up(struct esas2r_adapter *a, bool init_poll); 107026780d9eSBradley Grove void esas2r_wait_request(struct esas2r_adapter *a, struct esas2r_request *rq); 107126780d9eSBradley Grove u32 esas2r_map_data_window(struct esas2r_adapter *a, u32 addr_lo); 107226780d9eSBradley Grove bool esas2r_process_fs_ioctl(struct esas2r_adapter *a, 107326780d9eSBradley Grove struct esas2r_ioctl_fs *fs, 107426780d9eSBradley Grove struct esas2r_request *rq, 107526780d9eSBradley Grove struct esas2r_sg_context *sgc); 107626780d9eSBradley Grove bool esas2r_read_flash_block(struct esas2r_adapter *a, void *to, u32 from, 107726780d9eSBradley Grove u32 size); 107826780d9eSBradley Grove bool esas2r_read_mem_block(struct esas2r_adapter *a, void *to, u32 from, 107926780d9eSBradley Grove u32 size); 108026780d9eSBradley Grove bool esas2r_fm_api(struct esas2r_adapter *a, struct esas2r_flash_img *fi, 108126780d9eSBradley Grove struct esas2r_request *rq, struct esas2r_sg_context *sgc); 108226780d9eSBradley Grove void esas2r_force_interrupt(struct esas2r_adapter *a); 108326780d9eSBradley Grove void esas2r_local_start_request(struct esas2r_adapter *a, 108426780d9eSBradley Grove struct esas2r_request *rq); 108526780d9eSBradley Grove void esas2r_process_adapter_reset(struct esas2r_adapter *a); 108626780d9eSBradley Grove void esas2r_complete_request(struct esas2r_adapter *a, 108726780d9eSBradley Grove struct esas2r_request *rq); 108826780d9eSBradley Grove void esas2r_dummy_complete(struct esas2r_adapter *a, 108926780d9eSBradley Grove struct esas2r_request *rq); 109026780d9eSBradley Grove void esas2r_ae_complete(struct esas2r_adapter *a, struct esas2r_request *rq); 109126780d9eSBradley Grove void esas2r_start_vda_request(struct esas2r_adapter *a, 109226780d9eSBradley Grove struct esas2r_request *rq); 109326780d9eSBradley Grove bool esas2r_read_flash_rev(struct esas2r_adapter *a); 109426780d9eSBradley Grove bool esas2r_read_image_type(struct esas2r_adapter *a); 109526780d9eSBradley Grove bool esas2r_nvram_read_direct(struct esas2r_adapter *a); 109626780d9eSBradley Grove bool esas2r_nvram_validate(struct esas2r_adapter *a); 109726780d9eSBradley Grove void esas2r_nvram_set_defaults(struct esas2r_adapter *a); 109826780d9eSBradley Grove bool esas2r_print_flash_rev(struct esas2r_adapter *a); 109926780d9eSBradley Grove void esas2r_send_reset_ae(struct esas2r_adapter *a, bool pwr_mgt); 110026780d9eSBradley Grove bool esas2r_init_msgs(struct esas2r_adapter *a); 110126780d9eSBradley Grove bool esas2r_is_adapter_present(struct esas2r_adapter *a); 110226780d9eSBradley Grove void esas2r_nuxi_mgt_data(u8 function, void *data); 110326780d9eSBradley Grove void esas2r_nuxi_cfg_data(u8 function, void *data); 110426780d9eSBradley Grove void esas2r_nuxi_ae_data(union atto_vda_ae *ae); 110526780d9eSBradley Grove void esas2r_reset_chip(struct esas2r_adapter *a); 110626780d9eSBradley Grove void esas2r_log_request_failure(struct esas2r_adapter *a, 110726780d9eSBradley Grove struct esas2r_request *rq); 110826780d9eSBradley Grove void esas2r_polled_interrupt(struct esas2r_adapter *a); 110926780d9eSBradley Grove bool esas2r_ioreq_aborted(struct esas2r_adapter *a, struct esas2r_request *rq, 111026780d9eSBradley Grove u8 status); 111126780d9eSBradley Grove bool esas2r_build_sg_list_sge(struct esas2r_adapter *a, 111226780d9eSBradley Grove struct esas2r_sg_context *sgc); 111326780d9eSBradley Grove bool esas2r_build_sg_list_prd(struct esas2r_adapter *a, 111426780d9eSBradley Grove struct esas2r_sg_context *sgc); 111526780d9eSBradley Grove void esas2r_targ_db_initialize(struct esas2r_adapter *a); 111626780d9eSBradley Grove void esas2r_targ_db_remove_all(struct esas2r_adapter *a, bool notify); 111726780d9eSBradley Grove void esas2r_targ_db_report_changes(struct esas2r_adapter *a); 111826780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_add_raid(struct esas2r_adapter *a, 111926780d9eSBradley Grove struct esas2r_disc_context *dc); 112026780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_add_pthru(struct esas2r_adapter *a, 112126780d9eSBradley Grove struct esas2r_disc_context *dc, 112226780d9eSBradley Grove u8 *ident, 112326780d9eSBradley Grove u8 ident_len); 112426780d9eSBradley Grove void esas2r_targ_db_remove(struct esas2r_adapter *a, struct esas2r_target *t); 112526780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_find_by_sas_addr(struct esas2r_adapter *a, 112626780d9eSBradley Grove u64 *sas_addr); 112726780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_find_by_ident(struct esas2r_adapter *a, 112826780d9eSBradley Grove void *identifier, 112926780d9eSBradley Grove u8 ident_len); 113026780d9eSBradley Grove u16 esas2r_targ_db_find_next_present(struct esas2r_adapter *a, u16 target_id); 113126780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_find_by_virt_id(struct esas2r_adapter *a, 113226780d9eSBradley Grove u16 virt_id); 113326780d9eSBradley Grove u16 esas2r_targ_db_get_tgt_cnt(struct esas2r_adapter *a); 113426780d9eSBradley Grove void esas2r_disc_initialize(struct esas2r_adapter *a); 113526780d9eSBradley Grove void esas2r_disc_start_waiting(struct esas2r_adapter *a); 113626780d9eSBradley Grove void esas2r_disc_check_for_work(struct esas2r_adapter *a); 113726780d9eSBradley Grove void esas2r_disc_check_complete(struct esas2r_adapter *a); 113826780d9eSBradley Grove void esas2r_disc_queue_event(struct esas2r_adapter *a, u8 disc_evt); 113926780d9eSBradley Grove bool esas2r_disc_start_port(struct esas2r_adapter *a); 114026780d9eSBradley Grove void esas2r_disc_local_start_request(struct esas2r_adapter *a, 114126780d9eSBradley Grove struct esas2r_request *rq); 114226780d9eSBradley Grove bool esas2r_set_degraded_mode(struct esas2r_adapter *a, char *error_str); 114326780d9eSBradley Grove bool esas2r_process_vda_ioctl(struct esas2r_adapter *a, 114426780d9eSBradley Grove struct atto_ioctl_vda *vi, 114526780d9eSBradley Grove struct esas2r_request *rq, 114626780d9eSBradley Grove struct esas2r_sg_context *sgc); 114726780d9eSBradley Grove void esas2r_queue_fw_event(struct esas2r_adapter *a, 114826780d9eSBradley Grove enum fw_event_type type, 114926780d9eSBradley Grove void *data, 115026780d9eSBradley Grove int data_sz); 115126780d9eSBradley Grove 115226780d9eSBradley Grove /* Inline functions */ 115326780d9eSBradley Grove 115426780d9eSBradley Grove /* Allocate a chip scatter/gather list entry */ 115526780d9eSBradley Grove static inline struct esas2r_mem_desc *esas2r_alloc_sgl(struct esas2r_adapter *a) 115626780d9eSBradley Grove { 115726780d9eSBradley Grove unsigned long flags; 115826780d9eSBradley Grove struct list_head *sgl; 115926780d9eSBradley Grove struct esas2r_mem_desc *result = NULL; 116026780d9eSBradley Grove 116126780d9eSBradley Grove spin_lock_irqsave(&a->sg_list_lock, flags); 116226780d9eSBradley Grove if (likely(!list_empty(&a->free_sg_list_head))) { 116326780d9eSBradley Grove sgl = a->free_sg_list_head.next; 116426780d9eSBradley Grove result = list_entry(sgl, struct esas2r_mem_desc, next_desc); 116526780d9eSBradley Grove list_del_init(sgl); 116626780d9eSBradley Grove } 116726780d9eSBradley Grove spin_unlock_irqrestore(&a->sg_list_lock, flags); 116826780d9eSBradley Grove 116926780d9eSBradley Grove return result; 117026780d9eSBradley Grove } 117126780d9eSBradley Grove 117226780d9eSBradley Grove /* Initialize a scatter/gather context */ 117326780d9eSBradley Grove static inline void esas2r_sgc_init(struct esas2r_sg_context *sgc, 117426780d9eSBradley Grove struct esas2r_adapter *a, 117526780d9eSBradley Grove struct esas2r_request *rq, 117626780d9eSBradley Grove struct atto_vda_sge *first) 117726780d9eSBradley Grove { 117826780d9eSBradley Grove sgc->adapter = a; 117926780d9eSBradley Grove sgc->first_req = rq; 118026780d9eSBradley Grove 118126780d9eSBradley Grove /* 118226780d9eSBradley Grove * set the limit pointer such that an SGE pointer above this value 118326780d9eSBradley Grove * would be the first one to overflow the SGL. 118426780d9eSBradley Grove */ 118526780d9eSBradley Grove sgc->sge.a64.limit = (struct atto_vda_sge *)((u8 *)rq->vrq 118626780d9eSBradley Grove + (sizeof(union 118726780d9eSBradley Grove atto_vda_req) / 118826780d9eSBradley Grove 8) 118926780d9eSBradley Grove - sizeof(struct 119026780d9eSBradley Grove atto_vda_sge)); 119126780d9eSBradley Grove if (first) { 119226780d9eSBradley Grove sgc->sge.a64.last = 119326780d9eSBradley Grove sgc->sge.a64.curr = first; 119426780d9eSBradley Grove rq->vrq->scsi.sg_list_offset = (u8) 119526780d9eSBradley Grove ((u8 *)first - 119626780d9eSBradley Grove (u8 *)rq->vrq); 119726780d9eSBradley Grove } else { 119826780d9eSBradley Grove sgc->sge.a64.last = 119926780d9eSBradley Grove sgc->sge.a64.curr = &rq->vrq->scsi.u.sge[0]; 120026780d9eSBradley Grove rq->vrq->scsi.sg_list_offset = 120126780d9eSBradley Grove (u8)offsetof(struct atto_vda_scsi_req, u.sge); 120226780d9eSBradley Grove } 120326780d9eSBradley Grove sgc->sge.a64.chain = NULL; 120426780d9eSBradley Grove } 120526780d9eSBradley Grove 120626780d9eSBradley Grove static inline void esas2r_rq_init_request(struct esas2r_request *rq, 120726780d9eSBradley Grove struct esas2r_adapter *a) 120826780d9eSBradley Grove { 120926780d9eSBradley Grove union atto_vda_req *vrq = rq->vrq; 121026780d9eSBradley Grove u32 handle; 121126780d9eSBradley Grove 121226780d9eSBradley Grove INIT_LIST_HEAD(&rq->sg_table_head); 121326780d9eSBradley Grove rq->data_buf = (void *)(vrq + 1); 121426780d9eSBradley Grove rq->interrupt_cb = NULL; 121526780d9eSBradley Grove rq->comp_cb = esas2r_complete_request_cb; 121626780d9eSBradley Grove rq->flags = 0; 121726780d9eSBradley Grove rq->timeout = 0; 121826780d9eSBradley Grove rq->req_stat = RS_PENDING; 121926780d9eSBradley Grove rq->req_type = RT_INI_REQ; 122026780d9eSBradley Grove 122126780d9eSBradley Grove /* clear the outbound response */ 122226780d9eSBradley Grove rq->func_rsp.dwords[0] = 0; 122326780d9eSBradley Grove rq->func_rsp.dwords[1] = 0; 122426780d9eSBradley Grove 122526780d9eSBradley Grove /* 122626780d9eSBradley Grove * clear the size of the VDA request. esas2r_build_sg_list() will 122726780d9eSBradley Grove * only allow the size of the request to grow. there are some 122826780d9eSBradley Grove * management requests that go through there twice and the second 122926780d9eSBradley Grove * time through sets a smaller request size. if this is not modified 123026780d9eSBradley Grove * at all we'll set it to the size of the entire VDA request. 123126780d9eSBradley Grove */ 123226780d9eSBradley Grove rq->vda_req_sz = RQ_SIZE_DEFAULT; 123326780d9eSBradley Grove 123426780d9eSBradley Grove /* req_table entry should be NULL at this point - if not, halt */ 123526780d9eSBradley Grove 123626780d9eSBradley Grove if (a->req_table[LOWORD(vrq->scsi.handle)]) 123726780d9eSBradley Grove esas2r_bugon(); 123826780d9eSBradley Grove 123926780d9eSBradley Grove /* fill in the table for this handle so we can get back to the 124026780d9eSBradley Grove * request. 124126780d9eSBradley Grove */ 124226780d9eSBradley Grove a->req_table[LOWORD(vrq->scsi.handle)] = rq; 124326780d9eSBradley Grove 124426780d9eSBradley Grove /* 124526780d9eSBradley Grove * add a reference number to the handle to make it unique (until it 124626780d9eSBradley Grove * wraps of course) while preserving the upper word 124726780d9eSBradley Grove */ 124826780d9eSBradley Grove 124926780d9eSBradley Grove handle = be32_to_cpu(vrq->scsi.handle) & 0xFFFF0000; 125026780d9eSBradley Grove vrq->scsi.handle = cpu_to_be32(handle + a->cmd_ref_no++); 125126780d9eSBradley Grove 125226780d9eSBradley Grove /* 125326780d9eSBradley Grove * the following formats a SCSI request. the caller can override as 125426780d9eSBradley Grove * necessary. clear_vda_request can be called to clear the VDA 125526780d9eSBradley Grove * request for another type of request. 125626780d9eSBradley Grove */ 125726780d9eSBradley Grove vrq->scsi.function = VDA_FUNC_SCSI; 125826780d9eSBradley Grove vrq->scsi.sense_len = SENSE_DATA_SZ; 125926780d9eSBradley Grove 126026780d9eSBradley Grove /* clear out sg_list_offset and chain_offset */ 126126780d9eSBradley Grove vrq->scsi.sg_list_offset = 0; 126226780d9eSBradley Grove vrq->scsi.chain_offset = 0; 126326780d9eSBradley Grove vrq->scsi.flags = 0; 126426780d9eSBradley Grove vrq->scsi.reserved = 0; 126526780d9eSBradley Grove 126626780d9eSBradley Grove /* set the sense buffer to be the data payload buffer */ 126726780d9eSBradley Grove vrq->scsi.ppsense_buf 126826780d9eSBradley Grove = cpu_to_le64(rq->vrq_md->phys_addr + 126926780d9eSBradley Grove sizeof(union atto_vda_req)); 127026780d9eSBradley Grove } 127126780d9eSBradley Grove 127226780d9eSBradley Grove static inline void esas2r_rq_free_sg_lists(struct esas2r_request *rq, 127326780d9eSBradley Grove struct esas2r_adapter *a) 127426780d9eSBradley Grove { 127526780d9eSBradley Grove unsigned long flags; 127626780d9eSBradley Grove 127726780d9eSBradley Grove if (list_empty(&rq->sg_table_head)) 127826780d9eSBradley Grove return; 127926780d9eSBradley Grove 128026780d9eSBradley Grove spin_lock_irqsave(&a->sg_list_lock, flags); 128126780d9eSBradley Grove list_splice_tail_init(&rq->sg_table_head, &a->free_sg_list_head); 128226780d9eSBradley Grove spin_unlock_irqrestore(&a->sg_list_lock, flags); 128326780d9eSBradley Grove } 128426780d9eSBradley Grove 128526780d9eSBradley Grove static inline void esas2r_rq_destroy_request(struct esas2r_request *rq, 128626780d9eSBradley Grove struct esas2r_adapter *a) 128726780d9eSBradley Grove 128826780d9eSBradley Grove { 128926780d9eSBradley Grove esas2r_rq_free_sg_lists(rq, a); 129026780d9eSBradley Grove a->req_table[LOWORD(rq->vrq->scsi.handle)] = NULL; 129126780d9eSBradley Grove rq->data_buf = NULL; 129226780d9eSBradley Grove } 129326780d9eSBradley Grove 129426780d9eSBradley Grove static inline bool esas2r_is_tasklet_pending(struct esas2r_adapter *a) 129526780d9eSBradley Grove { 12969588d24eSBradley Grove 12979588d24eSBradley Grove return test_bit(AF_BUSRST_NEEDED, &a->flags) || 12989588d24eSBradley Grove test_bit(AF_BUSRST_DETECTED, &a->flags) || 12999588d24eSBradley Grove test_bit(AF_CHPRST_NEEDED, &a->flags) || 13009588d24eSBradley Grove test_bit(AF_CHPRST_DETECTED, &a->flags) || 13019588d24eSBradley Grove test_bit(AF_PORT_CHANGE, &a->flags); 13029588d24eSBradley Grove 130326780d9eSBradley Grove } 130426780d9eSBradley Grove 130526780d9eSBradley Grove /* 130626780d9eSBradley Grove * Build the scatter/gather list for an I/O request according to the 130726780d9eSBradley Grove * specifications placed in the esas2r_sg_context. The caller must initialize 130826780d9eSBradley Grove * struct esas2r_sg_context prior to the initial call by calling 130926780d9eSBradley Grove * esas2r_sgc_init() 131026780d9eSBradley Grove */ 131126780d9eSBradley Grove static inline bool esas2r_build_sg_list(struct esas2r_adapter *a, 131226780d9eSBradley Grove struct esas2r_request *rq, 131326780d9eSBradley Grove struct esas2r_sg_context *sgc) 131426780d9eSBradley Grove { 131526780d9eSBradley Grove if (unlikely(le32_to_cpu(rq->vrq->scsi.length) == 0)) 131626780d9eSBradley Grove return true; 131726780d9eSBradley Grove 131826780d9eSBradley Grove return (*a->build_sgl)(a, sgc); 131926780d9eSBradley Grove } 132026780d9eSBradley Grove 132126780d9eSBradley Grove static inline void esas2r_disable_chip_interrupts(struct esas2r_adapter *a) 132226780d9eSBradley Grove { 132326780d9eSBradley Grove if (atomic_inc_return(&a->dis_ints_cnt) == 1) 132426780d9eSBradley Grove esas2r_write_register_dword(a, MU_INT_MASK_OUT, 132526780d9eSBradley Grove ESAS2R_INT_DIS_MASK); 132626780d9eSBradley Grove } 132726780d9eSBradley Grove 132826780d9eSBradley Grove static inline void esas2r_enable_chip_interrupts(struct esas2r_adapter *a) 132926780d9eSBradley Grove { 133026780d9eSBradley Grove if (atomic_dec_return(&a->dis_ints_cnt) == 0) 133126780d9eSBradley Grove esas2r_write_register_dword(a, MU_INT_MASK_OUT, 133226780d9eSBradley Grove ESAS2R_INT_ENB_MASK); 133326780d9eSBradley Grove } 133426780d9eSBradley Grove 133526780d9eSBradley Grove /* Schedule a TASKLET to perform non-interrupt tasks that may require delays 133626780d9eSBradley Grove * or long completion times. 133726780d9eSBradley Grove */ 133826780d9eSBradley Grove static inline void esas2r_schedule_tasklet(struct esas2r_adapter *a) 133926780d9eSBradley Grove { 134026780d9eSBradley Grove /* make sure we don't schedule twice */ 13419588d24eSBradley Grove if (!test_and_set_bit(AF_TASKLET_SCHEDULED, &a->flags)) 134226780d9eSBradley Grove tasklet_hi_schedule(&a->tasklet); 134326780d9eSBradley Grove } 134426780d9eSBradley Grove 134526780d9eSBradley Grove static inline void esas2r_enable_heartbeat(struct esas2r_adapter *a) 134626780d9eSBradley Grove { 13479588d24eSBradley Grove if (!test_bit(AF_DEGRADED_MODE, &a->flags) && 13489588d24eSBradley Grove !test_bit(AF_CHPRST_PENDING, &a->flags) && 13499588d24eSBradley Grove (a->nvram->options2 & SASNVR2_HEARTBEAT)) 13509588d24eSBradley Grove set_bit(AF_HEARTBEAT_ENB, &a->flags); 135126780d9eSBradley Grove else 13529588d24eSBradley Grove clear_bit(AF_HEARTBEAT_ENB, &a->flags); 135326780d9eSBradley Grove } 135426780d9eSBradley Grove 135526780d9eSBradley Grove static inline void esas2r_disable_heartbeat(struct esas2r_adapter *a) 135626780d9eSBradley Grove { 13579588d24eSBradley Grove clear_bit(AF_HEARTBEAT_ENB, &a->flags); 13589588d24eSBradley Grove clear_bit(AF_HEARTBEAT, &a->flags); 135926780d9eSBradley Grove } 136026780d9eSBradley Grove 136126780d9eSBradley Grove /* Set the initial state for resetting the adapter on the next pass through 136226780d9eSBradley Grove * esas2r_do_deferred. 136326780d9eSBradley Grove */ 136426780d9eSBradley Grove static inline void esas2r_local_reset_adapter(struct esas2r_adapter *a) 136526780d9eSBradley Grove { 136626780d9eSBradley Grove esas2r_disable_heartbeat(a); 136726780d9eSBradley Grove 13689588d24eSBradley Grove set_bit(AF_CHPRST_NEEDED, &a->flags); 13699588d24eSBradley Grove set_bit(AF_CHPRST_PENDING, &a->flags); 13709588d24eSBradley Grove set_bit(AF_DISC_PENDING, &a->flags); 137126780d9eSBradley Grove } 137226780d9eSBradley Grove 137326780d9eSBradley Grove /* See if an interrupt is pending on the adapter. */ 137426780d9eSBradley Grove static inline bool esas2r_adapter_interrupt_pending(struct esas2r_adapter *a) 137526780d9eSBradley Grove { 137626780d9eSBradley Grove u32 intstat; 137726780d9eSBradley Grove 137826780d9eSBradley Grove if (a->int_mask == 0) 137926780d9eSBradley Grove return false; 138026780d9eSBradley Grove 138126780d9eSBradley Grove intstat = esas2r_read_register_dword(a, MU_INT_STATUS_OUT); 138226780d9eSBradley Grove 138326780d9eSBradley Grove if ((intstat & a->int_mask) == 0) 138426780d9eSBradley Grove return false; 138526780d9eSBradley Grove 138626780d9eSBradley Grove esas2r_disable_chip_interrupts(a); 138726780d9eSBradley Grove 138826780d9eSBradley Grove a->int_stat = intstat; 138926780d9eSBradley Grove a->int_mask = 0; 139026780d9eSBradley Grove 139126780d9eSBradley Grove return true; 139226780d9eSBradley Grove } 139326780d9eSBradley Grove 139426780d9eSBradley Grove static inline u16 esas2r_targ_get_id(struct esas2r_target *t, 139526780d9eSBradley Grove struct esas2r_adapter *a) 139626780d9eSBradley Grove { 139726780d9eSBradley Grove return (u16)(uintptr_t)(t - a->targetdb); 139826780d9eSBradley Grove } 139926780d9eSBradley Grove 140026780d9eSBradley Grove /* Build and start an asynchronous event request */ 140126780d9eSBradley Grove static inline void esas2r_start_ae_request(struct esas2r_adapter *a, 140226780d9eSBradley Grove struct esas2r_request *rq) 140326780d9eSBradley Grove { 140426780d9eSBradley Grove unsigned long flags; 140526780d9eSBradley Grove 140626780d9eSBradley Grove esas2r_build_ae_req(a, rq); 140726780d9eSBradley Grove 140826780d9eSBradley Grove spin_lock_irqsave(&a->queue_lock, flags); 140926780d9eSBradley Grove esas2r_start_vda_request(a, rq); 141026780d9eSBradley Grove spin_unlock_irqrestore(&a->queue_lock, flags); 141126780d9eSBradley Grove } 141226780d9eSBradley Grove 141326780d9eSBradley Grove static inline void esas2r_comp_list_drain(struct esas2r_adapter *a, 141426780d9eSBradley Grove struct list_head *comp_list) 141526780d9eSBradley Grove { 141626780d9eSBradley Grove struct esas2r_request *rq; 141726780d9eSBradley Grove struct list_head *element, *next; 141826780d9eSBradley Grove 141926780d9eSBradley Grove list_for_each_safe(element, next, comp_list) { 142026780d9eSBradley Grove rq = list_entry(element, struct esas2r_request, comp_list); 142126780d9eSBradley Grove list_del_init(element); 142226780d9eSBradley Grove esas2r_complete_request(a, rq); 142326780d9eSBradley Grove } 142426780d9eSBradley Grove } 142526780d9eSBradley Grove 142626780d9eSBradley Grove /* sysfs handlers */ 142726780d9eSBradley Grove extern struct bin_attribute bin_attr_fw; 142826780d9eSBradley Grove extern struct bin_attribute bin_attr_fs; 142926780d9eSBradley Grove extern struct bin_attribute bin_attr_vda; 143026780d9eSBradley Grove extern struct bin_attribute bin_attr_hw; 143126780d9eSBradley Grove extern struct bin_attribute bin_attr_live_nvram; 143226780d9eSBradley Grove extern struct bin_attribute bin_attr_default_nvram; 143326780d9eSBradley Grove 143426780d9eSBradley Grove #endif /* ESAS2R_H */ 1435