1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* ------------------------------------------------------------ 3*4882a593Smuzhiyun * ibmvscsi.h 4*4882a593Smuzhiyun * (C) Copyright IBM Corporation 1994, 2003 5*4882a593Smuzhiyun * Authors: Colin DeVilbiss (devilbis@us.ibm.com) 6*4882a593Smuzhiyun * Santiago Leon (santil@us.ibm.com) 7*4882a593Smuzhiyun * Dave Boutcher (sleddog@us.ibm.com) 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * ------------------------------------------------------------ 10*4882a593Smuzhiyun * Emulation of a SCSI host adapter for Virtual I/O devices 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * This driver allows the Linux SCSI peripheral drivers to directly 13*4882a593Smuzhiyun * access devices in the hosting partition, either on an iSeries 14*4882a593Smuzhiyun * hypervisor system or a converged hypervisor system. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun #ifndef IBMVSCSI_H 17*4882a593Smuzhiyun #define IBMVSCSI_H 18*4882a593Smuzhiyun #include <linux/types.h> 19*4882a593Smuzhiyun #include <linux/list.h> 20*4882a593Smuzhiyun #include <linux/completion.h> 21*4882a593Smuzhiyun #include <linux/interrupt.h> 22*4882a593Smuzhiyun #include <scsi/viosrp.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct scsi_cmnd; 25*4882a593Smuzhiyun struct Scsi_Host; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* Number of indirect bufs...the list of these has to fit in the 28*4882a593Smuzhiyun * additional data of the srp_cmd struct along with the indirect 29*4882a593Smuzhiyun * descriptor 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun #define MAX_INDIRECT_BUFS 10 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define IBMVSCSI_MAX_REQUESTS_DEFAULT 100 34*4882a593Smuzhiyun #define IBMVSCSI_CMDS_PER_LUN_DEFAULT 16 35*4882a593Smuzhiyun #define IBMVSCSI_MAX_SECTORS_DEFAULT 256 /* 32 * 8 = default max I/O 32 pages */ 36*4882a593Smuzhiyun #define IBMVSCSI_MAX_CMDS_PER_LUN 64 37*4882a593Smuzhiyun #define IBMVSCSI_MAX_LUN 32 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* ------------------------------------------------------------ 40*4882a593Smuzhiyun * Data Structures 41*4882a593Smuzhiyun */ 42*4882a593Smuzhiyun /* an RPA command/response transport queue */ 43*4882a593Smuzhiyun struct crq_queue { 44*4882a593Smuzhiyun struct viosrp_crq *msgs; 45*4882a593Smuzhiyun int size, cur; 46*4882a593Smuzhiyun dma_addr_t msg_token; 47*4882a593Smuzhiyun spinlock_t lock; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* a unit of work for the hosting partition */ 51*4882a593Smuzhiyun struct srp_event_struct { 52*4882a593Smuzhiyun union viosrp_iu *xfer_iu; 53*4882a593Smuzhiyun struct scsi_cmnd *cmnd; 54*4882a593Smuzhiyun struct list_head list; 55*4882a593Smuzhiyun void (*done) (struct srp_event_struct *); 56*4882a593Smuzhiyun struct viosrp_crq crq; 57*4882a593Smuzhiyun struct ibmvscsi_host_data *hostdata; 58*4882a593Smuzhiyun atomic_t free; 59*4882a593Smuzhiyun union viosrp_iu iu; 60*4882a593Smuzhiyun void (*cmnd_done) (struct scsi_cmnd *); 61*4882a593Smuzhiyun struct completion comp; 62*4882a593Smuzhiyun struct timer_list timer; 63*4882a593Smuzhiyun union viosrp_iu *sync_srp; 64*4882a593Smuzhiyun struct srp_direct_buf *ext_list; 65*4882a593Smuzhiyun dma_addr_t ext_list_token; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* a pool of event structs for use */ 69*4882a593Smuzhiyun struct event_pool { 70*4882a593Smuzhiyun struct srp_event_struct *events; 71*4882a593Smuzhiyun u32 size; 72*4882a593Smuzhiyun int next; 73*4882a593Smuzhiyun union viosrp_iu *iu_storage; 74*4882a593Smuzhiyun dma_addr_t iu_token; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun enum ibmvscsi_host_action { 78*4882a593Smuzhiyun IBMVSCSI_HOST_ACTION_NONE = 0, 79*4882a593Smuzhiyun IBMVSCSI_HOST_ACTION_RESET, 80*4882a593Smuzhiyun IBMVSCSI_HOST_ACTION_REENABLE, 81*4882a593Smuzhiyun IBMVSCSI_HOST_ACTION_UNBLOCK, 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* all driver data associated with a host adapter */ 85*4882a593Smuzhiyun struct ibmvscsi_host_data { 86*4882a593Smuzhiyun struct list_head host_list; 87*4882a593Smuzhiyun atomic_t request_limit; 88*4882a593Smuzhiyun int client_migrated; 89*4882a593Smuzhiyun enum ibmvscsi_host_action action; 90*4882a593Smuzhiyun struct device *dev; 91*4882a593Smuzhiyun struct event_pool pool; 92*4882a593Smuzhiyun struct crq_queue queue; 93*4882a593Smuzhiyun struct tasklet_struct srp_task; 94*4882a593Smuzhiyun struct list_head sent; 95*4882a593Smuzhiyun struct Scsi_Host *host; 96*4882a593Smuzhiyun struct task_struct *work_thread; 97*4882a593Smuzhiyun wait_queue_head_t work_wait_q; 98*4882a593Smuzhiyun struct mad_adapter_info_data madapter_info; 99*4882a593Smuzhiyun struct capabilities caps; 100*4882a593Smuzhiyun dma_addr_t caps_addr; 101*4882a593Smuzhiyun dma_addr_t adapter_info_addr; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #endif /* IBMVSCSI_H */ 105