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