162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* ------------------------------------------------------------ 362306a36Sopenharmony_ci * ibmvscsi.h 462306a36Sopenharmony_ci * (C) Copyright IBM Corporation 1994, 2003 562306a36Sopenharmony_ci * Authors: Colin DeVilbiss (devilbis@us.ibm.com) 662306a36Sopenharmony_ci * Santiago Leon (santil@us.ibm.com) 762306a36Sopenharmony_ci * Dave Boutcher (sleddog@us.ibm.com) 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * ------------------------------------------------------------ 1062306a36Sopenharmony_ci * Emulation of a SCSI host adapter for Virtual I/O devices 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * This driver allows the Linux SCSI peripheral drivers to directly 1362306a36Sopenharmony_ci * access devices in the hosting partition, either on an iSeries 1462306a36Sopenharmony_ci * hypervisor system or a converged hypervisor system. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci#ifndef IBMVSCSI_H 1762306a36Sopenharmony_ci#define IBMVSCSI_H 1862306a36Sopenharmony_ci#include <linux/types.h> 1962306a36Sopenharmony_ci#include <linux/list.h> 2062306a36Sopenharmony_ci#include <linux/completion.h> 2162306a36Sopenharmony_ci#include <linux/interrupt.h> 2262306a36Sopenharmony_ci#include <scsi/viosrp.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct scsi_cmnd; 2562306a36Sopenharmony_cistruct Scsi_Host; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* Number of indirect bufs...the list of these has to fit in the 2862306a36Sopenharmony_ci * additional data of the srp_cmd struct along with the indirect 2962306a36Sopenharmony_ci * descriptor 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci#define MAX_INDIRECT_BUFS 10 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define IBMVSCSI_MAX_REQUESTS_DEFAULT 100 3462306a36Sopenharmony_ci#define IBMVSCSI_CMDS_PER_LUN_DEFAULT 16 3562306a36Sopenharmony_ci#define IBMVSCSI_MAX_SECTORS_DEFAULT 256 /* 32 * 8 = default max I/O 32 pages */ 3662306a36Sopenharmony_ci#define IBMVSCSI_MAX_CMDS_PER_LUN 64 3762306a36Sopenharmony_ci#define IBMVSCSI_MAX_LUN 32 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* ------------------------------------------------------------ 4062306a36Sopenharmony_ci * Data Structures 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_ci/* an RPA command/response transport queue */ 4362306a36Sopenharmony_cistruct crq_queue { 4462306a36Sopenharmony_ci struct viosrp_crq *msgs; 4562306a36Sopenharmony_ci int size, cur; 4662306a36Sopenharmony_ci dma_addr_t msg_token; 4762306a36Sopenharmony_ci spinlock_t lock; 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* a unit of work for the hosting partition */ 5162306a36Sopenharmony_cistruct srp_event_struct { 5262306a36Sopenharmony_ci union viosrp_iu *xfer_iu; 5362306a36Sopenharmony_ci struct scsi_cmnd *cmnd; 5462306a36Sopenharmony_ci struct list_head list; 5562306a36Sopenharmony_ci void (*done) (struct srp_event_struct *); 5662306a36Sopenharmony_ci struct viosrp_crq crq; 5762306a36Sopenharmony_ci struct ibmvscsi_host_data *hostdata; 5862306a36Sopenharmony_ci atomic_t free; 5962306a36Sopenharmony_ci union viosrp_iu iu; 6062306a36Sopenharmony_ci void (*cmnd_done) (struct scsi_cmnd *); 6162306a36Sopenharmony_ci struct completion comp; 6262306a36Sopenharmony_ci struct timer_list timer; 6362306a36Sopenharmony_ci union viosrp_iu *sync_srp; 6462306a36Sopenharmony_ci struct srp_direct_buf *ext_list; 6562306a36Sopenharmony_ci dma_addr_t ext_list_token; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* a pool of event structs for use */ 6962306a36Sopenharmony_cistruct event_pool { 7062306a36Sopenharmony_ci struct srp_event_struct *events; 7162306a36Sopenharmony_ci u32 size; 7262306a36Sopenharmony_ci int next; 7362306a36Sopenharmony_ci union viosrp_iu *iu_storage; 7462306a36Sopenharmony_ci dma_addr_t iu_token; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cienum ibmvscsi_host_action { 7862306a36Sopenharmony_ci IBMVSCSI_HOST_ACTION_NONE = 0, 7962306a36Sopenharmony_ci IBMVSCSI_HOST_ACTION_RESET, 8062306a36Sopenharmony_ci IBMVSCSI_HOST_ACTION_REENABLE, 8162306a36Sopenharmony_ci IBMVSCSI_HOST_ACTION_UNBLOCK, 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* all driver data associated with a host adapter */ 8562306a36Sopenharmony_cistruct ibmvscsi_host_data { 8662306a36Sopenharmony_ci struct list_head host_list; 8762306a36Sopenharmony_ci atomic_t request_limit; 8862306a36Sopenharmony_ci int client_migrated; 8962306a36Sopenharmony_ci enum ibmvscsi_host_action action; 9062306a36Sopenharmony_ci struct device *dev; 9162306a36Sopenharmony_ci struct event_pool pool; 9262306a36Sopenharmony_ci struct crq_queue queue; 9362306a36Sopenharmony_ci struct tasklet_struct srp_task; 9462306a36Sopenharmony_ci struct list_head sent; 9562306a36Sopenharmony_ci struct Scsi_Host *host; 9662306a36Sopenharmony_ci struct task_struct *work_thread; 9762306a36Sopenharmony_ci wait_queue_head_t work_wait_q; 9862306a36Sopenharmony_ci struct mad_adapter_info_data madapter_info; 9962306a36Sopenharmony_ci struct capabilities caps; 10062306a36Sopenharmony_ci dma_addr_t caps_addr; 10162306a36Sopenharmony_ci dma_addr_t adapter_info_addr; 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#endif /* IBMVSCSI_H */ 105