11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ibmvscsi.h
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (C) Copyright IBM Corporation 1994, 2003
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Authors: Colin DeVilbiss (devilbis@us.ibm.com)
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *          Santiago Leon (santil@us.ibm.com)
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *          Dave Boutcher (sleddog@us.ibm.com)
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version.
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful,
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details.
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * USA
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ------------------------------------------------------------
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Emulation of a SCSI host adapter for Virtual I/O devices
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This driver allows the Linux SCSI peripheral drivers to directly
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * access devices in the hosting partition, either on an iSeries
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * hypervisor system or a converged hypervisor system.
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef IBMVSCSI_H
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IBMVSCSI_H
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/list.h>
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/completion.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "viosrp.h"
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct scsi_cmnd;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct Scsi_Host;
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Number of indirect bufs...the list of these has to fit in the
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * additional data of the srp_cmd struct along with the indirect
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * descriptor
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_INDIRECT_BUFS 10
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47a897ff2a6386ac4368ba41db18b626afd903f9d8Robert Jennings#define IBMVSCSI_MAX_REQUESTS_DEFAULT 100
487912a0ac5907df1f8b214b3ca15ccf96129daae0Robert Jennings#define IBMVSCSI_CMDS_PER_LUN_DEFAULT 16
497912a0ac5907df1f8b214b3ca15ccf96129daae0Robert Jennings#define IBMVSCSI_MAX_SECTORS_DEFAULT 256 /* 32 * 8 = default max I/O 32 pages */
50742d25b819f11dce91b89e6c9ac17402a119f20aBrian King#define IBMVSCSI_MAX_CMDS_PER_LUN 64
51a897ff2a6386ac4368ba41db18b626afd903f9d8Robert Jennings
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Data Structures
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* an RPA command/response transport queue */
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct crq_queue {
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct viosrp_crq *msgs;
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int size, cur;
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_addr_t msg_token;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t lock;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* a unit of work for the hosting partition */
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct srp_event_struct {
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	union viosrp_iu *xfer_iu;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct scsi_cmnd *cmnd;
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head list;
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void (*done) (struct srp_event_struct *);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct viosrp_crq crq;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct ibmvscsi_host_data *hostdata;
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t free;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	union viosrp_iu iu;
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void (*cmnd_done) (struct scsi_cmnd *);
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct completion comp;
753d0e91f7ace12499c4b00088e9a6b1361e1bb0caBrian King	struct timer_list timer;
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	union viosrp_iu *sync_srp;
77ef265673434680f2307ceafae4a2badc657e94ccFUJITA Tomonori	struct srp_direct_buf *ext_list;
784dddbc26c3895ecdab1f4b16435685b47f96f599James Bottomley	dma_addr_t ext_list_token;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* a pool of event structs for use */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct event_pool {
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct srp_event_struct *events;
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 size;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int next;
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	union viosrp_iu *iu_storage;
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_addr_t iu_token;
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* all driver data associated with a host adapter */
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ibmvscsi_host_data {
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t request_limit;
93126c5cc37e682e7c5ae96754994b1cb50c2d0cb5Brian King	int client_migrated;
940f33ece5bc3d5a9567b65cfbc736e8f206ecfc7bBrian King	int reset_crq;
950f33ece5bc3d5a9567b65cfbc736e8f206ecfc7bBrian King	int reenable_crq;
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct device *dev;
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct event_pool pool;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct crq_queue queue;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct tasklet_struct srp_task;
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head sent;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct Scsi_Host *host;
1020f33ece5bc3d5a9567b65cfbc736e8f206ecfc7bBrian King	struct task_struct *work_thread;
1030f33ece5bc3d5a9567b65cfbc736e8f206ecfc7bBrian King	wait_queue_head_t work_wait_q;
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct mad_adapter_info_data madapter_info;
105126c5cc37e682e7c5ae96754994b1cb50c2d0cb5Brian King	struct capabilities caps;
106126c5cc37e682e7c5ae96754994b1cb50c2d0cb5Brian King	dma_addr_t caps_addr;
107126c5cc37e682e7c5ae96754994b1cb50c2d0cb5Brian King	dma_addr_t adapter_info_addr;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* routines for managing a command/response queue */
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid ibmvscsi_handle_crq(struct viosrp_crq *crq,
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 struct ibmvscsi_host_data *hostdata);
113d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse
114d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhousestruct ibmvscsi_ops {
115d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse	int (*init_crq_queue)(struct crq_queue *queue,
116d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse			      struct ibmvscsi_host_data *hostdata,
117d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse			      int max_requests);
118d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse	void (*release_crq_queue)(struct crq_queue *queue,
119d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse				  struct ibmvscsi_host_data *hostdata,
120d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse				  int max_requests);
121d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse	int (*reset_crq_queue)(struct crq_queue *queue,
122d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse			       struct ibmvscsi_host_data *hostdata);
123d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse	int (*reenable_crq_queue)(struct crq_queue *queue,
124d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse				  struct ibmvscsi_host_data *hostdata);
125d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse	int (*send_crq)(struct ibmvscsi_host_data *hostdata,
126d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse		       u64 word1, u64 word2);
12764355b929dec0cb6271e4ac7834c9cf262961e40Brian King	int (*resume) (struct ibmvscsi_host_data *hostdata);
128d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse};
129d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouse
130d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouseextern struct ibmvscsi_ops iseriesvscsi_ops;
131d3849d512fb0ca1e369e3efcaec910a949f55f62David Woodhouseextern struct ibmvscsi_ops rpavscsi_ops;
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif				/* IBMVSCSI_H */
134