xref: /dflybsd-src/sys/dev/raid/tws/tws.h (revision 26595b188cbe468e3b07a13e2a5cfaa3de0d7843)
133190b70SSascha Wildner /*
233190b70SSascha Wildner  * Copyright (c) 2010, LSI Corp.
333190b70SSascha Wildner  * All rights reserved.
433190b70SSascha Wildner  * Author : Manjunath Ranganathaiah
533190b70SSascha Wildner  * Support: freebsdraid@lsi.com
633190b70SSascha Wildner  *
733190b70SSascha Wildner  * Redistribution and use in source and binary forms, with or without
833190b70SSascha Wildner  * modification, are permitted provided that the following conditions
933190b70SSascha Wildner  * are met:
1033190b70SSascha Wildner  *
1133190b70SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1233190b70SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
1333190b70SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
1433190b70SSascha Wildner  *    notice, this list of conditions and the following disclaimer in
1533190b70SSascha Wildner  *    the documentation and/or other materials provided with the
1633190b70SSascha Wildner  *    distribution.
1733190b70SSascha Wildner  * 3. Neither the name of the <ORGANIZATION> nor the names of its
1833190b70SSascha Wildner  *    contributors may be used to endorse or promote products derived
1933190b70SSascha Wildner  *    from this software without specific prior written permission.
2033190b70SSascha Wildner  *
2133190b70SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2233190b70SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2333190b70SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2433190b70SSascha Wildner  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2533190b70SSascha Wildner  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2633190b70SSascha Wildner  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2733190b70SSascha Wildner  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2833190b70SSascha Wildner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2933190b70SSascha Wildner  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3033190b70SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
3133190b70SSascha Wildner  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3233190b70SSascha Wildner  * POSSIBILITY OF SUCH DAMAGE.
3333190b70SSascha Wildner  *
3433190b70SSascha Wildner  * $FreeBSD: src/sys/dev/tws/tws.h,v 1.3 2007/05/09 04:16:32 mrangana Exp $
3533190b70SSascha Wildner  */
3633190b70SSascha Wildner 
3733190b70SSascha Wildner #include <sys/param.h>        /* defines used in kernel.h */
3833190b70SSascha Wildner #include <sys/module.h>
3933190b70SSascha Wildner #include <sys/systm.h>
4033190b70SSascha Wildner #include <sys/proc.h>
4133190b70SSascha Wildner #include <sys/errno.h>
4233190b70SSascha Wildner #include <sys/kernel.h>       /* types used in module initialization */
4333190b70SSascha Wildner #include <sys/conf.h>         /* cdevsw struct */
4433190b70SSascha Wildner #include <sys/uio.h>          /* uio struct */
4533190b70SSascha Wildner #include <sys/malloc.h>
4633190b70SSascha Wildner #include <sys/bus.h>          /* structs, prototypes for pci bus stuff */
4733190b70SSascha Wildner 
4833190b70SSascha Wildner #include <sys/rman.h>
4933190b70SSascha Wildner #include <sys/device.h>
5033190b70SSascha Wildner #include <machine/clock.h>
5133190b70SSascha Wildner 
5233190b70SSascha Wildner #include <bus/pci/pcivar.h>   /* For pci_get macros! */
5333190b70SSascha Wildner #include <bus/pci/pcireg.h>
5433190b70SSascha Wildner 
5533190b70SSascha Wildner #include <sys/types.h>
5633190b70SSascha Wildner #include <sys/sysctl.h>
5733190b70SSascha Wildner #include <sys/stat.h>
5833190b70SSascha Wildner 
5933190b70SSascha Wildner 
6033190b70SSascha Wildner #define TWS_PULL_MODE_ENABLE 1
6133190b70SSascha Wildner 
6233190b70SSascha Wildner MALLOC_DECLARE(M_TWS);
6333190b70SSascha Wildner /* externs */
6433190b70SSascha Wildner extern int tws_queue_depth;
6533190b70SSascha Wildner 
6633190b70SSascha Wildner 
6733190b70SSascha Wildner #define TWS_DRIVER_VERSION_STRING "10.80.00.001"
6833190b70SSascha Wildner #define TWS_MAX_NUM_UNITS             65
6933190b70SSascha Wildner #define TWS_MAX_NUM_LUNS              16
7033190b70SSascha Wildner #define TWS_MAX_IRQS                  2
7133190b70SSascha Wildner #define TWS_SCSI_INITIATOR_ID         66
7233190b70SSascha Wildner #define TWS_MAX_IO_SIZE               0x20000 /* 128kB */
7333190b70SSascha Wildner #define TWS_SECTOR_SIZE               0x200
7433190b70SSascha Wildner #define TWS_POLL_TIMEOUT              60
7533190b70SSascha Wildner #define TWS_IO_TIMEOUT                60
7633190b70SSascha Wildner #define TWS_RESET_TIMEOUT             60
7733190b70SSascha Wildner 
7833190b70SSascha Wildner #define TWS_PCI_BAR0                  0x10
7933190b70SSascha Wildner #define TWS_PCI_BAR1                  0x14
8033190b70SSascha Wildner #define TWS_PCI_BAR2                  0x1C
8133190b70SSascha Wildner 
8233190b70SSascha Wildner #define TWS_VENDOR_ID                 0x13C1
8333190b70SSascha Wildner #define TWS_DEVICE_ID                 0x1010
8433190b70SSascha Wildner 
8533190b70SSascha Wildner #define TWS_INVALID_REQID             0xFFFF
8633190b70SSascha Wildner 
8733190b70SSascha Wildner /* bus tag related */
8833190b70SSascha Wildner #define TWS_ALIGNMENT                 4
8933190b70SSascha Wildner #define TWS_IN_MF_ALIGNMENT           16
9033190b70SSascha Wildner #define TWS_OUT_MF_ALIGNMENT          4
9133190b70SSascha Wildner 
9233190b70SSascha Wildner #define TWS_MAX_32BIT_SG_ELEMENTS     93     /* max 32-bit sg elements */
9333190b70SSascha Wildner #define TWS_MAX_64BIT_SG_ELEMENTS     46     /* max 64-bit sg elements */
9433190b70SSascha Wildner 
9533190b70SSascha Wildner #define TWS_MAX_QS                    4
9633190b70SSascha Wildner #define TWS_MAX_REQS                  256
9733190b70SSascha Wildner #define TWS_RESERVED_REQS             4
9833190b70SSascha Wildner 
9933190b70SSascha Wildner /* Request states */
10033190b70SSascha Wildner #define TWS_REQ_STATE_TRAN            0
10133190b70SSascha Wildner #define TWS_REQ_STATE_FREE            1
10233190b70SSascha Wildner #define TWS_REQ_STATE_PENDING         2
10333190b70SSascha Wildner #define TWS_REQ_STATE_BUSY            3
10433190b70SSascha Wildner #define TWS_REQ_STATE_COMPLETE        4
10533190b70SSascha Wildner 
10633190b70SSascha Wildner /* Request types */
10733190b70SSascha Wildner #define TWS_INTERNAL_CMD_REQ          0x0
10833190b70SSascha Wildner #define TWS_AEN_FETCH_REQ             0x1
10933190b70SSascha Wildner #define TWS_PASSTHRU_REQ              0x2
11033190b70SSascha Wildner #define TWS_GETSET_PARAM_REQ          0x3
11133190b70SSascha Wildner #define TWS_SCSI_IO_REQ               0x4
11233190b70SSascha Wildner 
11333190b70SSascha Wildner /* Driver states */
11433190b70SSascha Wildner 
11533190b70SSascha Wildner enum tws_states {
11633190b70SSascha Wildner     TWS_INIT=50,
11733190b70SSascha Wildner     TWS_UNINIT,
11833190b70SSascha Wildner     TWS_OFFLINE,
11933190b70SSascha Wildner     TWS_ONLINE,
12033190b70SSascha Wildner     TWS_RESET,
12133190b70SSascha Wildner };
12233190b70SSascha Wildner 
12333190b70SSascha Wildner /* events */
12433190b70SSascha Wildner 
12533190b70SSascha Wildner enum tws_events {
12633190b70SSascha Wildner     TWS_INIT_START=100,
12733190b70SSascha Wildner     TWS_INIT_COMPLETE,
12833190b70SSascha Wildner     TWS_UNINIT_START,
12933190b70SSascha Wildner     TWS_RESET_START,
13033190b70SSascha Wildner     TWS_RESET_COMPLETE,
13133190b70SSascha Wildner     TWS_SCAN_FAILURE,
13233190b70SSascha Wildner };
13333190b70SSascha Wildner 
13433190b70SSascha Wildner enum tws_req_flags {
13533190b70SSascha Wildner     TWS_DIR_UNKNOWN = 0x1,
13633190b70SSascha Wildner     TWS_DIR_IN = 0x2,
13733190b70SSascha Wildner     TWS_DIR_OUT = 0x4,
13833190b70SSascha Wildner     TWS_DIR_NONE = 0x8,
13933190b70SSascha Wildner };
14033190b70SSascha Wildner 
14133190b70SSascha Wildner enum tws_intrs {
14233190b70SSascha Wildner      TWS_INTx,
14333190b70SSascha Wildner      TWS_MSI,
14433190b70SSascha Wildner      TWS_MSIX,
14533190b70SSascha Wildner };
14633190b70SSascha Wildner 
14733190b70SSascha Wildner struct tws_msix_info {
14833190b70SSascha Wildner     int tbl_res_id;
14933190b70SSascha Wildner     bus_space_tag_t tbl_tag;
15033190b70SSascha Wildner     bus_space_handle_t tbl_handle;
15133190b70SSascha Wildner     struct resource *tbl_res;
15233190b70SSascha Wildner };
15333190b70SSascha Wildner 
15433190b70SSascha Wildner struct tws_ioctl_lock {
15533190b70SSascha Wildner     u_int32_t       lock;
15633190b70SSascha Wildner     time_t          timeout;
15733190b70SSascha Wildner };
15833190b70SSascha Wildner 
15933190b70SSascha Wildner 
16033190b70SSascha Wildner #define TWS_TRACE_FNAME_LEN  10
16133190b70SSascha Wildner #define TWS_TRACE_FUNC_LEN   15
16233190b70SSascha Wildner #define TWS_TRACE_DESC_LEN   10
16333190b70SSascha Wildner struct tws_trace_rec {
16433190b70SSascha Wildner     struct timespec ts;
16533190b70SSascha Wildner     char fname[TWS_TRACE_FNAME_LEN];
16633190b70SSascha Wildner     char func[TWS_TRACE_FUNC_LEN];
16733190b70SSascha Wildner     int linenum;
16833190b70SSascha Wildner     char desc[TWS_TRACE_DESC_LEN];
16933190b70SSascha Wildner     u_int64_t val1;
17033190b70SSascha Wildner     u_int64_t val2;
17133190b70SSascha Wildner };
17233190b70SSascha Wildner 
17333190b70SSascha Wildner struct tws_circular_q {
17433190b70SSascha Wildner     volatile int16_t head;
17533190b70SSascha Wildner     volatile int16_t tail;
17633190b70SSascha Wildner     u_int16_t depth;
17733190b70SSascha Wildner     u_int8_t  overflow;
17833190b70SSascha Wildner     void *    q;
17933190b70SSascha Wildner };
18033190b70SSascha Wildner 
18133190b70SSascha Wildner 
18233190b70SSascha Wildner 
18333190b70SSascha Wildner struct tws_stats {
18433190b70SSascha Wildner     u_int64_t reqs_in;
18533190b70SSascha Wildner     u_int64_t reqs_out;
18633190b70SSascha Wildner     u_int64_t reqs_errored;
18733190b70SSascha Wildner     u_int64_t spurios_intrs;
18833190b70SSascha Wildner     u_int64_t num_intrs;
18933190b70SSascha Wildner     u_int64_t num_aens;
19033190b70SSascha Wildner     u_int64_t ioctls;
19133190b70SSascha Wildner     u_int64_t scsi_ios;
19233190b70SSascha Wildner };
19333190b70SSascha Wildner 
19433190b70SSascha Wildner struct tws_init_connect_info {
19533190b70SSascha Wildner     u_int16_t     working_srl;
19633190b70SSascha Wildner     u_int16_t     working_branch;
19733190b70SSascha Wildner     u_int16_t     working_build;
19833190b70SSascha Wildner     u_int16_t     fw_on_ctlr_srl;
19933190b70SSascha Wildner     u_int16_t     fw_on_ctlr_branch;
20033190b70SSascha Wildner     u_int16_t     fw_on_ctlr_build;
20133190b70SSascha Wildner 
20233190b70SSascha Wildner };
20333190b70SSascha Wildner 
20433190b70SSascha Wildner 
20533190b70SSascha Wildner /* ------------ boolean types ------------------- */
20633190b70SSascha Wildner 
20733190b70SSascha Wildner /* typedef enum _boolean { false, true } boolean; */
20833190b70SSascha Wildner #define boolean _Bool
20933190b70SSascha Wildner enum err { SUCCESS, FAILURE };
21033190b70SSascha Wildner 
21133190b70SSascha Wildner /* ----------- per instance data ---------------- */
21233190b70SSascha Wildner 
21333190b70SSascha Wildner /* The softc holds our per-instance data. */
21433190b70SSascha Wildner struct tws_softc {
21533190b70SSascha Wildner     device_t    tws_dev;                  /* bus device */
21633190b70SSascha Wildner     struct cdev *tws_cdev;                /* controller device */
21733190b70SSascha Wildner     u_int32_t   device_id;                /* device id */
21833190b70SSascha Wildner     u_int32_t   subvendor_id;             /* device id */
21933190b70SSascha Wildner     u_int32_t   subdevice_id;             /* device id */
22033190b70SSascha Wildner     u_int8_t    tws_state;                /* driver state */
22133190b70SSascha Wildner     u_int8_t    tws_prev_state;           /* driver prev state */
22233190b70SSascha Wildner     struct resource *reg_res;             /* register interface window */
22333190b70SSascha Wildner     struct resource *mfa_res;             /* mfa interface window */
22433190b70SSascha Wildner     int reg_res_id;                       /* register resource id */
22533190b70SSascha Wildner     int mfa_res_id;                       /* register resource id */
22633190b70SSascha Wildner     bus_space_handle_t bus_handle;        /* bus space handle */
22733190b70SSascha Wildner     bus_space_handle_t bus_mfa_handle;     /* bus space handle */
22833190b70SSascha Wildner     bus_space_tag_t bus_tag;              /* bus space tag */
22933190b70SSascha Wildner     bus_space_tag_t bus_mfa_tag;          /* bus space tag for mfa's */
23033190b70SSascha Wildner     u_int64_t mfa_base;                   /* mfa base address */
231*5ef3096fSSascha Wildner     struct resource *irq_res;             /* interrupt resource */
232*5ef3096fSSascha Wildner     int irq_res_id;                       /* intr resource id */
233*5ef3096fSSascha Wildner     void *intr_handle;                    /* interrupt handle */
23433190b70SSascha Wildner     struct tws_msix_info msix;            /* msix info */
23533190b70SSascha Wildner     struct cam_sim *sim;                  /* sim for this controller */
23633190b70SSascha Wildner     struct cam_path *path;                /* Ctlr path to CAM */
23733190b70SSascha Wildner     struct lock q_lock;                   /* queue lock */
23833190b70SSascha Wildner     struct lock sim_lock;                 /* sim lock */
23933190b70SSascha Wildner     struct lock gen_lock;                 /* general driver  lock */
24033190b70SSascha Wildner     struct lock io_lock;                  /* IO  lock */
24133190b70SSascha Wildner     struct tws_ioctl_lock ioctl_lock;     /* ioctl lock */
24233190b70SSascha Wildner     u_int32_t seq_id;                     /* Sequence id */
24333190b70SSascha Wildner     int chan;                             /* wait channel */
24433190b70SSascha Wildner     struct tws_circular_q aen_q;          /* aen q */
24533190b70SSascha Wildner     struct tws_circular_q trace_q;        /* trace q */
24633190b70SSascha Wildner     struct tws_stats stats;               /* I/O stats */
24733190b70SSascha Wildner     struct tws_init_connect_info cinfo;   /* compatibility info */
24833190b70SSascha Wildner     boolean is64bit;                      /* True - 64bit else 32bit */
249*5ef3096fSSascha Wildner     int intr_type;                        /* Interrupt type used */
25033190b70SSascha Wildner     bus_dma_tag_t parent_tag;             /* parent DMA tag */
25133190b70SSascha Wildner     bus_dma_tag_t cmd_tag;                /* command DMA tag */
25233190b70SSascha Wildner     bus_dmamap_t cmd_map;                 /* command map */
25333190b70SSascha Wildner     void *dma_mem;                        /* pointer to dmable memory */
25433190b70SSascha Wildner     u_int64_t dma_mem_phys;               /* phy addr */
25533190b70SSascha Wildner     bus_dma_tag_t data_tag;               /* data DMA tag */
25633190b70SSascha Wildner     struct tws_request *reqs;             /* pointer to requests */
25733190b70SSascha Wildner     struct tws_sense *sense_bufs;         /* pointer to sense buffers */
25833190b70SSascha Wildner     boolean obfl_q_overrun;               /* OBFL overrun flag  */
25933190b70SSascha Wildner     union ccb *scan_ccb;                  /* pointer to a ccb */
26033190b70SSascha Wildner     struct tws_request *q_head[TWS_MAX_QS]; /* head pointers to q's */
26133190b70SSascha Wildner     struct tws_request *q_tail[TWS_MAX_QS]; /* tail pointers to q's */
26233190b70SSascha Wildner 
26333190b70SSascha Wildner     struct callout print_stats_handle;
26433190b70SSascha Wildner     struct callout reset_cb_handle;
26533190b70SSascha Wildner     struct callout reinit_handle;
26633190b70SSascha Wildner };
267