xref: /openbmc/linux/drivers/scsi/esas2r/esas2r.h (revision 5f2d8c36)
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;
94874d2fd48SBinoy Jayan 	struct mutex fm_api_mutex;
949249cf320SBinoy Jayan 	struct mutex fs_api_mutex;
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 const char *esas2r_info(struct Scsi_Host *);
96626780d9eSBradley Grove int esas2r_write_params(struct esas2r_adapter *a, struct esas2r_request *rq,
96726780d9eSBradley Grove 			struct esas2r_sas_nvram *data);
9686f4e626fSNathan Chancellor int esas2r_ioctl_handler(void *hostdata, unsigned int cmd, void __user *arg);
9696f4e626fSNathan Chancellor int esas2r_ioctl(struct scsi_device *dev, unsigned int cmd, void __user *arg);
97026780d9eSBradley Grove u8 handle_hba_ioctl(struct esas2r_adapter *a,
97126780d9eSBradley Grove 		    struct atto_ioctl *ioctl_hba);
97226780d9eSBradley Grove int esas2r_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd);
97326780d9eSBradley Grove int esas2r_show_info(struct seq_file *m, struct Scsi_Host *sh);
97426780d9eSBradley Grove long esas2r_proc_ioctl(struct file *fp, unsigned int cmd, unsigned long arg);
97526780d9eSBradley Grove 
97626780d9eSBradley Grove /* SCSI error handler (eh) functions */
97726780d9eSBradley Grove int esas2r_eh_abort(struct scsi_cmnd *cmd);
97826780d9eSBradley Grove int esas2r_device_reset(struct scsi_cmnd *cmd);
97926780d9eSBradley Grove int esas2r_host_reset(struct scsi_cmnd *cmd);
98026780d9eSBradley Grove int esas2r_bus_reset(struct scsi_cmnd *cmd);
98126780d9eSBradley Grove int esas2r_target_reset(struct scsi_cmnd *cmd);
98226780d9eSBradley Grove 
98326780d9eSBradley Grove /* Internal functions */
98426780d9eSBradley Grove int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid,
98526780d9eSBradley Grove 			int index);
98626780d9eSBradley Grove int esas2r_read_fw(struct esas2r_adapter *a, char *buf, long off, int count);
98726780d9eSBradley Grove int esas2r_write_fw(struct esas2r_adapter *a, const char *buf, long off,
98826780d9eSBradley Grove 		    int count);
98926780d9eSBradley Grove int esas2r_read_vda(struct esas2r_adapter *a, char *buf, long off, int count);
99026780d9eSBradley Grove int esas2r_write_vda(struct esas2r_adapter *a, const char *buf, long off,
99126780d9eSBradley Grove 		     int count);
99226780d9eSBradley Grove int esas2r_read_fs(struct esas2r_adapter *a, char *buf, long off, int count);
99326780d9eSBradley Grove int esas2r_write_fs(struct esas2r_adapter *a, const char *buf, long off,
99426780d9eSBradley Grove 		    int count);
99526780d9eSBradley Grove void esas2r_adapter_tasklet(unsigned long context);
99626780d9eSBradley Grove irqreturn_t esas2r_interrupt(int irq, void *dev_id);
99726780d9eSBradley Grove irqreturn_t esas2r_msi_interrupt(int irq, void *dev_id);
99826780d9eSBradley Grove void esas2r_kickoff_timer(struct esas2r_adapter *a);
999*5f2d8c36SVaibhav Gupta 
1000*5f2d8c36SVaibhav Gupta extern const struct dev_pm_ops esas2r_pm_ops;
1001*5f2d8c36SVaibhav Gupta 
100226780d9eSBradley Grove void esas2r_fw_event_off(struct esas2r_adapter *a);
100326780d9eSBradley Grove void esas2r_fw_event_on(struct esas2r_adapter *a);
100426780d9eSBradley Grove bool esas2r_nvram_write(struct esas2r_adapter *a, struct esas2r_request *rq,
100526780d9eSBradley Grove 			struct esas2r_sas_nvram *nvram);
100626780d9eSBradley Grove void esas2r_nvram_get_defaults(struct esas2r_adapter *a,
100726780d9eSBradley Grove 			       struct esas2r_sas_nvram *nvram);
100826780d9eSBradley Grove void esas2r_complete_request_cb(struct esas2r_adapter *a,
100926780d9eSBradley Grove 				struct esas2r_request *rq);
101026780d9eSBradley Grove void esas2r_reset_detected(struct esas2r_adapter *a);
101126780d9eSBradley Grove void esas2r_target_state_changed(struct esas2r_adapter *ha, u16 targ_id,
101226780d9eSBradley Grove 				 u8 state);
101326780d9eSBradley Grove int esas2r_req_status_to_error(u8 req_stat);
101426780d9eSBradley Grove void esas2r_kill_adapter(int i);
101526780d9eSBradley Grove void esas2r_free_request(struct esas2r_adapter *a, struct esas2r_request *rq);
101626780d9eSBradley Grove struct esas2r_request *esas2r_alloc_request(struct esas2r_adapter *a);
101726780d9eSBradley Grove u32 esas2r_get_uncached_size(struct esas2r_adapter *a);
101826780d9eSBradley Grove bool esas2r_init_adapter_struct(struct esas2r_adapter *a,
101926780d9eSBradley Grove 				void **uncached_area);
102026780d9eSBradley Grove bool esas2r_check_adapter(struct esas2r_adapter *a);
102126780d9eSBradley Grove bool esas2r_init_adapter_hw(struct esas2r_adapter *a, bool init_poll);
102226780d9eSBradley Grove void esas2r_start_request(struct esas2r_adapter *a, struct esas2r_request *rq);
102326780d9eSBradley Grove bool esas2r_send_task_mgmt(struct esas2r_adapter *a,
102426780d9eSBradley Grove 			   struct esas2r_request *rqaux, u8 task_mgt_func);
102526780d9eSBradley Grove void esas2r_do_tasklet_tasks(struct esas2r_adapter *a);
102626780d9eSBradley Grove void esas2r_adapter_interrupt(struct esas2r_adapter *a);
102726780d9eSBradley Grove void esas2r_do_deferred_processes(struct esas2r_adapter *a);
102826780d9eSBradley Grove void esas2r_reset_bus(struct esas2r_adapter *a);
102926780d9eSBradley Grove void esas2r_reset_adapter(struct esas2r_adapter *a);
103026780d9eSBradley Grove void esas2r_timer_tick(struct esas2r_adapter *a);
103126780d9eSBradley Grove const char *esas2r_get_model_name(struct esas2r_adapter *a);
103226780d9eSBradley Grove const char *esas2r_get_model_name_short(struct esas2r_adapter *a);
103326780d9eSBradley Grove u32 esas2r_stall_execution(struct esas2r_adapter *a, u32 start_time,
103426780d9eSBradley Grove 			   u32 *delay);
103526780d9eSBradley Grove void esas2r_build_flash_req(struct esas2r_adapter *a,
103626780d9eSBradley Grove 			    struct esas2r_request *rq,
103726780d9eSBradley Grove 			    u8 sub_func,
103826780d9eSBradley Grove 			    u8 cksum,
103926780d9eSBradley Grove 			    u32 addr,
104026780d9eSBradley Grove 			    u32 length);
104126780d9eSBradley Grove void esas2r_build_mgt_req(struct esas2r_adapter *a,
104226780d9eSBradley Grove 			  struct esas2r_request *rq,
104326780d9eSBradley Grove 			  u8 sub_func,
104426780d9eSBradley Grove 			  u8 scan_gen,
104526780d9eSBradley Grove 			  u16 dev_index,
104626780d9eSBradley Grove 			  u32 length,
104726780d9eSBradley Grove 			  void *data);
104826780d9eSBradley Grove void esas2r_build_ae_req(struct esas2r_adapter *a, struct esas2r_request *rq);
104926780d9eSBradley Grove void esas2r_build_cli_req(struct esas2r_adapter *a,
105026780d9eSBradley Grove 			  struct esas2r_request *rq,
105126780d9eSBradley Grove 			  u32 length,
105226780d9eSBradley Grove 			  u32 cmd_rsp_len);
105326780d9eSBradley Grove void esas2r_build_ioctl_req(struct esas2r_adapter *a,
105426780d9eSBradley Grove 			    struct esas2r_request *rq,
105526780d9eSBradley Grove 			    u32 length,
105626780d9eSBradley Grove 			    u8 sub_func);
105726780d9eSBradley Grove void esas2r_build_cfg_req(struct esas2r_adapter *a,
105826780d9eSBradley Grove 			  struct esas2r_request *rq,
105926780d9eSBradley Grove 			  u8 sub_func,
106026780d9eSBradley Grove 			  u32 length,
106126780d9eSBradley Grove 			  void *data);
106226780d9eSBradley Grove void esas2r_power_down(struct esas2r_adapter *a);
106326780d9eSBradley Grove bool esas2r_power_up(struct esas2r_adapter *a, bool init_poll);
106426780d9eSBradley Grove void esas2r_wait_request(struct esas2r_adapter *a, struct esas2r_request *rq);
106526780d9eSBradley Grove u32 esas2r_map_data_window(struct esas2r_adapter *a, u32 addr_lo);
106626780d9eSBradley Grove bool esas2r_process_fs_ioctl(struct esas2r_adapter *a,
106726780d9eSBradley Grove 			     struct esas2r_ioctl_fs *fs,
106826780d9eSBradley Grove 			     struct esas2r_request *rq,
106926780d9eSBradley Grove 			     struct esas2r_sg_context *sgc);
107026780d9eSBradley Grove bool esas2r_read_flash_block(struct esas2r_adapter *a, void *to, u32 from,
107126780d9eSBradley Grove 			     u32 size);
107226780d9eSBradley Grove bool esas2r_read_mem_block(struct esas2r_adapter *a, void *to, u32 from,
107326780d9eSBradley Grove 			   u32 size);
107426780d9eSBradley Grove bool esas2r_fm_api(struct esas2r_adapter *a, struct esas2r_flash_img *fi,
107526780d9eSBradley Grove 		   struct esas2r_request *rq, struct esas2r_sg_context *sgc);
107626780d9eSBradley Grove void esas2r_force_interrupt(struct esas2r_adapter *a);
107726780d9eSBradley Grove void esas2r_local_start_request(struct esas2r_adapter *a,
107826780d9eSBradley Grove 				struct esas2r_request *rq);
107926780d9eSBradley Grove void esas2r_process_adapter_reset(struct esas2r_adapter *a);
108026780d9eSBradley Grove void esas2r_complete_request(struct esas2r_adapter *a,
108126780d9eSBradley Grove 			     struct esas2r_request *rq);
108226780d9eSBradley Grove void esas2r_dummy_complete(struct esas2r_adapter *a,
108326780d9eSBradley Grove 			   struct esas2r_request *rq);
108426780d9eSBradley Grove void esas2r_ae_complete(struct esas2r_adapter *a, struct esas2r_request *rq);
108526780d9eSBradley Grove void esas2r_start_vda_request(struct esas2r_adapter *a,
108626780d9eSBradley Grove 			      struct esas2r_request *rq);
108726780d9eSBradley Grove bool esas2r_read_flash_rev(struct esas2r_adapter *a);
108826780d9eSBradley Grove bool esas2r_read_image_type(struct esas2r_adapter *a);
108926780d9eSBradley Grove bool esas2r_nvram_read_direct(struct esas2r_adapter *a);
109026780d9eSBradley Grove bool esas2r_nvram_validate(struct esas2r_adapter *a);
109126780d9eSBradley Grove void esas2r_nvram_set_defaults(struct esas2r_adapter *a);
109226780d9eSBradley Grove bool esas2r_print_flash_rev(struct esas2r_adapter *a);
109326780d9eSBradley Grove void esas2r_send_reset_ae(struct esas2r_adapter *a, bool pwr_mgt);
109426780d9eSBradley Grove bool esas2r_init_msgs(struct esas2r_adapter *a);
109526780d9eSBradley Grove bool esas2r_is_adapter_present(struct esas2r_adapter *a);
109626780d9eSBradley Grove void esas2r_nuxi_mgt_data(u8 function, void *data);
109726780d9eSBradley Grove void esas2r_nuxi_cfg_data(u8 function, void *data);
109826780d9eSBradley Grove void esas2r_nuxi_ae_data(union atto_vda_ae *ae);
109926780d9eSBradley Grove void esas2r_reset_chip(struct esas2r_adapter *a);
110026780d9eSBradley Grove void esas2r_log_request_failure(struct esas2r_adapter *a,
110126780d9eSBradley Grove 				struct esas2r_request *rq);
110226780d9eSBradley Grove void esas2r_polled_interrupt(struct esas2r_adapter *a);
110326780d9eSBradley Grove bool esas2r_ioreq_aborted(struct esas2r_adapter *a, struct esas2r_request *rq,
110426780d9eSBradley Grove 			  u8 status);
110526780d9eSBradley Grove bool esas2r_build_sg_list_sge(struct esas2r_adapter *a,
110626780d9eSBradley Grove 			      struct esas2r_sg_context *sgc);
110726780d9eSBradley Grove bool esas2r_build_sg_list_prd(struct esas2r_adapter *a,
110826780d9eSBradley Grove 			      struct esas2r_sg_context *sgc);
110926780d9eSBradley Grove void esas2r_targ_db_initialize(struct esas2r_adapter *a);
111026780d9eSBradley Grove void esas2r_targ_db_remove_all(struct esas2r_adapter *a, bool notify);
111126780d9eSBradley Grove void esas2r_targ_db_report_changes(struct esas2r_adapter *a);
111226780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_add_raid(struct esas2r_adapter *a,
111326780d9eSBradley Grove 					      struct esas2r_disc_context *dc);
111426780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_add_pthru(struct esas2r_adapter *a,
111526780d9eSBradley Grove 					       struct esas2r_disc_context *dc,
111626780d9eSBradley Grove 					       u8 *ident,
111726780d9eSBradley Grove 					       u8 ident_len);
111826780d9eSBradley Grove void esas2r_targ_db_remove(struct esas2r_adapter *a, struct esas2r_target *t);
111926780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_find_by_sas_addr(struct esas2r_adapter *a,
112026780d9eSBradley Grove 						      u64 *sas_addr);
112126780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_find_by_ident(struct esas2r_adapter *a,
112226780d9eSBradley Grove 						   void *identifier,
112326780d9eSBradley Grove 						   u8 ident_len);
112426780d9eSBradley Grove u16 esas2r_targ_db_find_next_present(struct esas2r_adapter *a, u16 target_id);
112526780d9eSBradley Grove struct esas2r_target *esas2r_targ_db_find_by_virt_id(struct esas2r_adapter *a,
112626780d9eSBradley Grove 						     u16 virt_id);
112726780d9eSBradley Grove u16 esas2r_targ_db_get_tgt_cnt(struct esas2r_adapter *a);
112826780d9eSBradley Grove void esas2r_disc_initialize(struct esas2r_adapter *a);
112926780d9eSBradley Grove void esas2r_disc_start_waiting(struct esas2r_adapter *a);
113026780d9eSBradley Grove void esas2r_disc_check_for_work(struct esas2r_adapter *a);
113126780d9eSBradley Grove void esas2r_disc_check_complete(struct esas2r_adapter *a);
113226780d9eSBradley Grove void esas2r_disc_queue_event(struct esas2r_adapter *a, u8 disc_evt);
113326780d9eSBradley Grove bool esas2r_disc_start_port(struct esas2r_adapter *a);
113426780d9eSBradley Grove void esas2r_disc_local_start_request(struct esas2r_adapter *a,
113526780d9eSBradley Grove 				     struct esas2r_request *rq);
113626780d9eSBradley Grove bool esas2r_set_degraded_mode(struct esas2r_adapter *a, char *error_str);
113726780d9eSBradley Grove bool esas2r_process_vda_ioctl(struct esas2r_adapter *a,
113826780d9eSBradley Grove 			      struct atto_ioctl_vda *vi,
113926780d9eSBradley Grove 			      struct esas2r_request *rq,
114026780d9eSBradley Grove 			      struct esas2r_sg_context *sgc);
114126780d9eSBradley Grove void esas2r_queue_fw_event(struct esas2r_adapter *a,
114226780d9eSBradley Grove 			   enum fw_event_type type,
114326780d9eSBradley Grove 			   void *data,
114426780d9eSBradley Grove 			   int data_sz);
114526780d9eSBradley Grove 
114626780d9eSBradley Grove /* Inline functions */
114726780d9eSBradley Grove 
114826780d9eSBradley Grove /* Allocate a chip scatter/gather list entry */
esas2r_alloc_sgl(struct esas2r_adapter * a)114926780d9eSBradley Grove static inline struct esas2r_mem_desc *esas2r_alloc_sgl(struct esas2r_adapter *a)
115026780d9eSBradley Grove {
115126780d9eSBradley Grove 	unsigned long flags;
115226780d9eSBradley Grove 	struct list_head *sgl;
115326780d9eSBradley Grove 	struct esas2r_mem_desc *result = NULL;
115426780d9eSBradley Grove 
115526780d9eSBradley Grove 	spin_lock_irqsave(&a->sg_list_lock, flags);
115626780d9eSBradley Grove 	if (likely(!list_empty(&a->free_sg_list_head))) {
115726780d9eSBradley Grove 		sgl = a->free_sg_list_head.next;
115826780d9eSBradley Grove 		result = list_entry(sgl, struct esas2r_mem_desc, next_desc);
115926780d9eSBradley Grove 		list_del_init(sgl);
116026780d9eSBradley Grove 	}
116126780d9eSBradley Grove 	spin_unlock_irqrestore(&a->sg_list_lock, flags);
116226780d9eSBradley Grove 
116326780d9eSBradley Grove 	return result;
116426780d9eSBradley Grove }
116526780d9eSBradley Grove 
116626780d9eSBradley Grove /* Initialize a scatter/gather context */
esas2r_sgc_init(struct esas2r_sg_context * sgc,struct esas2r_adapter * a,struct esas2r_request * rq,struct atto_vda_sge * first)116726780d9eSBradley Grove static inline void esas2r_sgc_init(struct esas2r_sg_context *sgc,
116826780d9eSBradley Grove 				   struct esas2r_adapter *a,
116926780d9eSBradley Grove 				   struct esas2r_request *rq,
117026780d9eSBradley Grove 				   struct atto_vda_sge *first)
117126780d9eSBradley Grove {
117226780d9eSBradley Grove 	sgc->adapter = a;
117326780d9eSBradley Grove 	sgc->first_req = rq;
117426780d9eSBradley Grove 
117526780d9eSBradley Grove 	/*
117626780d9eSBradley Grove 	 * set the limit pointer such that an SGE pointer above this value
117726780d9eSBradley Grove 	 * would be the first one to overflow the SGL.
117826780d9eSBradley Grove 	 */
117926780d9eSBradley Grove 	sgc->sge.a64.limit = (struct atto_vda_sge *)((u8 *)rq->vrq
118026780d9eSBradley Grove 						     + (sizeof(union
118126780d9eSBradley Grove 							       atto_vda_req) /
118226780d9eSBradley Grove 							8)
118326780d9eSBradley Grove 						     - sizeof(struct
118426780d9eSBradley Grove 							      atto_vda_sge));
118526780d9eSBradley Grove 	if (first) {
118626780d9eSBradley Grove 		sgc->sge.a64.last =
118726780d9eSBradley Grove 			sgc->sge.a64.curr = first;
118826780d9eSBradley Grove 		rq->vrq->scsi.sg_list_offset = (u8)
118926780d9eSBradley Grove 					       ((u8 *)first -
119026780d9eSBradley Grove 						(u8 *)rq->vrq);
119126780d9eSBradley Grove 	} else {
119226780d9eSBradley Grove 		sgc->sge.a64.last =
119326780d9eSBradley Grove 			sgc->sge.a64.curr = &rq->vrq->scsi.u.sge[0];
119426780d9eSBradley Grove 		rq->vrq->scsi.sg_list_offset =
119526780d9eSBradley Grove 			(u8)offsetof(struct atto_vda_scsi_req, u.sge);
119626780d9eSBradley Grove 	}
119726780d9eSBradley Grove 	sgc->sge.a64.chain = NULL;
119826780d9eSBradley Grove }
119926780d9eSBradley Grove 
esas2r_rq_init_request(struct esas2r_request * rq,struct esas2r_adapter * a)120026780d9eSBradley Grove static inline void esas2r_rq_init_request(struct esas2r_request *rq,
120126780d9eSBradley Grove 					  struct esas2r_adapter *a)
120226780d9eSBradley Grove {
120326780d9eSBradley Grove 	union atto_vda_req *vrq = rq->vrq;
120426780d9eSBradley Grove 
120526780d9eSBradley Grove 	INIT_LIST_HEAD(&rq->sg_table_head);
120626780d9eSBradley Grove 	rq->data_buf = (void *)(vrq + 1);
120726780d9eSBradley Grove 	rq->interrupt_cb = NULL;
120826780d9eSBradley Grove 	rq->comp_cb = esas2r_complete_request_cb;
120926780d9eSBradley Grove 	rq->flags = 0;
121026780d9eSBradley Grove 	rq->timeout = 0;
121126780d9eSBradley Grove 	rq->req_stat = RS_PENDING;
121226780d9eSBradley Grove 	rq->req_type = RT_INI_REQ;
121326780d9eSBradley Grove 
121426780d9eSBradley Grove 	/* clear the outbound response */
121526780d9eSBradley Grove 	rq->func_rsp.dwords[0] = 0;
121626780d9eSBradley Grove 	rq->func_rsp.dwords[1] = 0;
121726780d9eSBradley Grove 
121826780d9eSBradley Grove 	/*
121926780d9eSBradley Grove 	 * clear the size of the VDA request.  esas2r_build_sg_list() will
122026780d9eSBradley Grove 	 * only allow the size of the request to grow.  there are some
122126780d9eSBradley Grove 	 * management requests that go through there twice and the second
122226780d9eSBradley Grove 	 * time through sets a smaller request size.  if this is not modified
122326780d9eSBradley Grove 	 * at all we'll set it to the size of the entire VDA request.
122426780d9eSBradley Grove 	 */
122526780d9eSBradley Grove 	rq->vda_req_sz = RQ_SIZE_DEFAULT;
122626780d9eSBradley Grove 
122726780d9eSBradley Grove 	/* req_table entry should be NULL at this point - if not, halt */
122826780d9eSBradley Grove 
1229e36e0427SLee Jones 	if (a->req_table[LOWORD(vrq->scsi.handle)]) {
123026780d9eSBradley Grove 		esas2r_bugon();
1231e36e0427SLee Jones 	}
123226780d9eSBradley Grove 
123326780d9eSBradley Grove 	/* fill in the table for this handle so we can get back to the
123426780d9eSBradley Grove 	 * request.
123526780d9eSBradley Grove 	 */
123626780d9eSBradley Grove 	a->req_table[LOWORD(vrq->scsi.handle)] = rq;
123726780d9eSBradley Grove 
123826780d9eSBradley Grove 	/*
123926780d9eSBradley Grove 	 * add a reference number to the handle to make it unique (until it
12408e65e2f0SBradley Grove 	 * wraps of course) while preserving the least significant word
124126780d9eSBradley Grove 	 */
12428e65e2f0SBradley Grove 	vrq->scsi.handle = (a->cmd_ref_no++ << 16) | (u16)vrq->scsi.handle;
124326780d9eSBradley Grove 
124426780d9eSBradley Grove 	/*
124526780d9eSBradley Grove 	 * the following formats a SCSI request.  the caller can override as
124626780d9eSBradley Grove 	 * necessary.  clear_vda_request can be called to clear the VDA
124726780d9eSBradley Grove 	 * request for another type of request.
124826780d9eSBradley Grove 	 */
124926780d9eSBradley Grove 	vrq->scsi.function = VDA_FUNC_SCSI;
125026780d9eSBradley Grove 	vrq->scsi.sense_len = SENSE_DATA_SZ;
125126780d9eSBradley Grove 
125226780d9eSBradley Grove 	/* clear out sg_list_offset and chain_offset */
125326780d9eSBradley Grove 	vrq->scsi.sg_list_offset = 0;
125426780d9eSBradley Grove 	vrq->scsi.chain_offset = 0;
125526780d9eSBradley Grove 	vrq->scsi.flags = 0;
125626780d9eSBradley Grove 	vrq->scsi.reserved = 0;
125726780d9eSBradley Grove 
125826780d9eSBradley Grove 	/* set the sense buffer to be the data payload buffer */
125926780d9eSBradley Grove 	vrq->scsi.ppsense_buf
126026780d9eSBradley Grove 		= cpu_to_le64(rq->vrq_md->phys_addr +
126126780d9eSBradley Grove 			      sizeof(union atto_vda_req));
126226780d9eSBradley Grove }
126326780d9eSBradley Grove 
esas2r_rq_free_sg_lists(struct esas2r_request * rq,struct esas2r_adapter * a)126426780d9eSBradley Grove static inline void esas2r_rq_free_sg_lists(struct esas2r_request *rq,
126526780d9eSBradley Grove 					   struct esas2r_adapter *a)
126626780d9eSBradley Grove {
126726780d9eSBradley Grove 	unsigned long flags;
126826780d9eSBradley Grove 
126926780d9eSBradley Grove 	if (list_empty(&rq->sg_table_head))
127026780d9eSBradley Grove 		return;
127126780d9eSBradley Grove 
127226780d9eSBradley Grove 	spin_lock_irqsave(&a->sg_list_lock, flags);
127326780d9eSBradley Grove 	list_splice_tail_init(&rq->sg_table_head, &a->free_sg_list_head);
127426780d9eSBradley Grove 	spin_unlock_irqrestore(&a->sg_list_lock, flags);
127526780d9eSBradley Grove }
127626780d9eSBradley Grove 
esas2r_rq_destroy_request(struct esas2r_request * rq,struct esas2r_adapter * a)127726780d9eSBradley Grove static inline void esas2r_rq_destroy_request(struct esas2r_request *rq,
127826780d9eSBradley Grove 					     struct esas2r_adapter *a)
127926780d9eSBradley Grove 
128026780d9eSBradley Grove {
128126780d9eSBradley Grove 	esas2r_rq_free_sg_lists(rq, a);
128226780d9eSBradley Grove 	a->req_table[LOWORD(rq->vrq->scsi.handle)] = NULL;
128326780d9eSBradley Grove 	rq->data_buf = NULL;
128426780d9eSBradley Grove }
128526780d9eSBradley Grove 
esas2r_is_tasklet_pending(struct esas2r_adapter * a)128626780d9eSBradley Grove static inline bool esas2r_is_tasklet_pending(struct esas2r_adapter *a)
128726780d9eSBradley Grove {
12889588d24eSBradley Grove 
12899588d24eSBradley Grove 	return test_bit(AF_BUSRST_NEEDED, &a->flags) ||
12909588d24eSBradley Grove 	       test_bit(AF_BUSRST_DETECTED, &a->flags) ||
12919588d24eSBradley Grove 	       test_bit(AF_CHPRST_NEEDED, &a->flags) ||
12929588d24eSBradley Grove 	       test_bit(AF_CHPRST_DETECTED, &a->flags) ||
12939588d24eSBradley Grove 	       test_bit(AF_PORT_CHANGE, &a->flags);
12949588d24eSBradley Grove 
129526780d9eSBradley Grove }
129626780d9eSBradley Grove 
129726780d9eSBradley Grove /*
129826780d9eSBradley Grove  * Build the scatter/gather list for an I/O request according to the
129926780d9eSBradley Grove  * specifications placed in the esas2r_sg_context.  The caller must initialize
130026780d9eSBradley Grove  * struct esas2r_sg_context prior to the initial call by calling
130126780d9eSBradley Grove  * esas2r_sgc_init()
130226780d9eSBradley Grove  */
esas2r_build_sg_list(struct esas2r_adapter * a,struct esas2r_request * rq,struct esas2r_sg_context * sgc)130326780d9eSBradley Grove static inline bool esas2r_build_sg_list(struct esas2r_adapter *a,
130426780d9eSBradley Grove 					struct esas2r_request *rq,
130526780d9eSBradley Grove 					struct esas2r_sg_context *sgc)
130626780d9eSBradley Grove {
130726780d9eSBradley Grove 	if (unlikely(le32_to_cpu(rq->vrq->scsi.length) == 0))
130826780d9eSBradley Grove 		return true;
130926780d9eSBradley Grove 
131026780d9eSBradley Grove 	return (*a->build_sgl)(a, sgc);
131126780d9eSBradley Grove }
131226780d9eSBradley Grove 
esas2r_disable_chip_interrupts(struct esas2r_adapter * a)131326780d9eSBradley Grove static inline void esas2r_disable_chip_interrupts(struct esas2r_adapter *a)
131426780d9eSBradley Grove {
131526780d9eSBradley Grove 	if (atomic_inc_return(&a->dis_ints_cnt) == 1)
131626780d9eSBradley Grove 		esas2r_write_register_dword(a, MU_INT_MASK_OUT,
131726780d9eSBradley Grove 					    ESAS2R_INT_DIS_MASK);
131826780d9eSBradley Grove }
131926780d9eSBradley Grove 
esas2r_enable_chip_interrupts(struct esas2r_adapter * a)132026780d9eSBradley Grove static inline void esas2r_enable_chip_interrupts(struct esas2r_adapter *a)
132126780d9eSBradley Grove {
132226780d9eSBradley Grove 	if (atomic_dec_return(&a->dis_ints_cnt) == 0)
132326780d9eSBradley Grove 		esas2r_write_register_dword(a, MU_INT_MASK_OUT,
132426780d9eSBradley Grove 					    ESAS2R_INT_ENB_MASK);
132526780d9eSBradley Grove }
132626780d9eSBradley Grove 
132726780d9eSBradley Grove /* Schedule a TASKLET to perform non-interrupt tasks that may require delays
132826780d9eSBradley Grove  * or long completion times.
132926780d9eSBradley Grove  */
esas2r_schedule_tasklet(struct esas2r_adapter * a)133026780d9eSBradley Grove static inline void esas2r_schedule_tasklet(struct esas2r_adapter *a)
133126780d9eSBradley Grove {
133226780d9eSBradley Grove 	/* make sure we don't schedule twice */
13339588d24eSBradley Grove 	if (!test_and_set_bit(AF_TASKLET_SCHEDULED, &a->flags))
133426780d9eSBradley Grove 		tasklet_hi_schedule(&a->tasklet);
133526780d9eSBradley Grove }
133626780d9eSBradley Grove 
esas2r_enable_heartbeat(struct esas2r_adapter * a)133726780d9eSBradley Grove static inline void esas2r_enable_heartbeat(struct esas2r_adapter *a)
133826780d9eSBradley Grove {
13399588d24eSBradley Grove 	if (!test_bit(AF_DEGRADED_MODE, &a->flags) &&
13409588d24eSBradley Grove 	    !test_bit(AF_CHPRST_PENDING, &a->flags) &&
13419588d24eSBradley Grove 	    (a->nvram->options2 & SASNVR2_HEARTBEAT))
13429588d24eSBradley Grove 		set_bit(AF_HEARTBEAT_ENB, &a->flags);
134326780d9eSBradley Grove 	else
13449588d24eSBradley Grove 		clear_bit(AF_HEARTBEAT_ENB, &a->flags);
134526780d9eSBradley Grove }
134626780d9eSBradley Grove 
esas2r_disable_heartbeat(struct esas2r_adapter * a)134726780d9eSBradley Grove static inline void esas2r_disable_heartbeat(struct esas2r_adapter *a)
134826780d9eSBradley Grove {
13499588d24eSBradley Grove 	clear_bit(AF_HEARTBEAT_ENB, &a->flags);
13509588d24eSBradley Grove 	clear_bit(AF_HEARTBEAT, &a->flags);
135126780d9eSBradley Grove }
135226780d9eSBradley Grove 
135326780d9eSBradley Grove /* Set the initial state for resetting the adapter on the next pass through
135426780d9eSBradley Grove  * esas2r_do_deferred.
135526780d9eSBradley Grove  */
esas2r_local_reset_adapter(struct esas2r_adapter * a)135626780d9eSBradley Grove static inline void esas2r_local_reset_adapter(struct esas2r_adapter *a)
135726780d9eSBradley Grove {
135826780d9eSBradley Grove 	esas2r_disable_heartbeat(a);
135926780d9eSBradley Grove 
13609588d24eSBradley Grove 	set_bit(AF_CHPRST_NEEDED, &a->flags);
13619588d24eSBradley Grove 	set_bit(AF_CHPRST_PENDING, &a->flags);
13629588d24eSBradley Grove 	set_bit(AF_DISC_PENDING, &a->flags);
136326780d9eSBradley Grove }
136426780d9eSBradley Grove 
136526780d9eSBradley Grove /* See if an interrupt is pending on the adapter. */
esas2r_adapter_interrupt_pending(struct esas2r_adapter * a)136626780d9eSBradley Grove static inline bool esas2r_adapter_interrupt_pending(struct esas2r_adapter *a)
136726780d9eSBradley Grove {
136826780d9eSBradley Grove 	u32 intstat;
136926780d9eSBradley Grove 
137026780d9eSBradley Grove 	if (a->int_mask == 0)
137126780d9eSBradley Grove 		return false;
137226780d9eSBradley Grove 
137326780d9eSBradley Grove 	intstat = esas2r_read_register_dword(a, MU_INT_STATUS_OUT);
137426780d9eSBradley Grove 
137526780d9eSBradley Grove 	if ((intstat & a->int_mask) == 0)
137626780d9eSBradley Grove 		return false;
137726780d9eSBradley Grove 
137826780d9eSBradley Grove 	esas2r_disable_chip_interrupts(a);
137926780d9eSBradley Grove 
138026780d9eSBradley Grove 	a->int_stat = intstat;
138126780d9eSBradley Grove 	a->int_mask = 0;
138226780d9eSBradley Grove 
138326780d9eSBradley Grove 	return true;
138426780d9eSBradley Grove }
138526780d9eSBradley Grove 
esas2r_targ_get_id(struct esas2r_target * t,struct esas2r_adapter * a)138626780d9eSBradley Grove static inline u16 esas2r_targ_get_id(struct esas2r_target *t,
138726780d9eSBradley Grove 				     struct esas2r_adapter *a)
138826780d9eSBradley Grove {
138926780d9eSBradley Grove 	return (u16)(uintptr_t)(t - a->targetdb);
139026780d9eSBradley Grove }
139126780d9eSBradley Grove 
139226780d9eSBradley Grove /*  Build and start an asynchronous event request */
esas2r_start_ae_request(struct esas2r_adapter * a,struct esas2r_request * rq)139326780d9eSBradley Grove static inline void esas2r_start_ae_request(struct esas2r_adapter *a,
139426780d9eSBradley Grove 					   struct esas2r_request *rq)
139526780d9eSBradley Grove {
139626780d9eSBradley Grove 	unsigned long flags;
139726780d9eSBradley Grove 
139826780d9eSBradley Grove 	esas2r_build_ae_req(a, rq);
139926780d9eSBradley Grove 
140026780d9eSBradley Grove 	spin_lock_irqsave(&a->queue_lock, flags);
140126780d9eSBradley Grove 	esas2r_start_vda_request(a, rq);
140226780d9eSBradley Grove 	spin_unlock_irqrestore(&a->queue_lock, flags);
140326780d9eSBradley Grove }
140426780d9eSBradley Grove 
esas2r_comp_list_drain(struct esas2r_adapter * a,struct list_head * comp_list)140526780d9eSBradley Grove static inline void esas2r_comp_list_drain(struct esas2r_adapter *a,
140626780d9eSBradley Grove 					  struct list_head *comp_list)
140726780d9eSBradley Grove {
140826780d9eSBradley Grove 	struct esas2r_request *rq;
140926780d9eSBradley Grove 	struct list_head *element, *next;
141026780d9eSBradley Grove 
141126780d9eSBradley Grove 	list_for_each_safe(element, next, comp_list) {
141226780d9eSBradley Grove 		rq = list_entry(element, struct esas2r_request, comp_list);
141326780d9eSBradley Grove 		list_del_init(element);
141426780d9eSBradley Grove 		esas2r_complete_request(a, rq);
141526780d9eSBradley Grove 	}
141626780d9eSBradley Grove }
141726780d9eSBradley Grove 
141826780d9eSBradley Grove /* sysfs handlers */
141926780d9eSBradley Grove extern struct bin_attribute bin_attr_fw;
142026780d9eSBradley Grove extern struct bin_attribute bin_attr_fs;
142126780d9eSBradley Grove extern struct bin_attribute bin_attr_vda;
142226780d9eSBradley Grove extern struct bin_attribute bin_attr_hw;
142326780d9eSBradley Grove extern struct bin_attribute bin_attr_live_nvram;
142426780d9eSBradley Grove extern struct bin_attribute bin_attr_default_nvram;
142526780d9eSBradley Grove 
142626780d9eSBradley Grove #endif /* ESAS2R_H */
1427