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