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