linux/drivers/scsi/ibmvscsi/ibmvscsi.h
<<
>>
Prefs
   1/* ------------------------------------------------------------
   2 * ibmvscsi.h
   3 * (C) Copyright IBM Corporation 1994, 2003
   4 * Authors: Colin DeVilbiss (devilbis@us.ibm.com)
   5 *          Santiago Leon (santil@us.ibm.com)
   6 *          Dave Boutcher (sleddog@us.ibm.com)
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  21 * USA
  22 *
  23 * ------------------------------------------------------------
  24 * Emulation of a SCSI host adapter for Virtual I/O devices
  25 *
  26 * This driver allows the Linux SCSI peripheral drivers to directly
  27 * access devices in the hosting partition, either on an iSeries
  28 * hypervisor system or a converged hypervisor system.
  29 */
  30#ifndef IBMVSCSI_H
  31#define IBMVSCSI_H
  32#include <linux/types.h>
  33#include <linux/list.h>
  34#include <linux/completion.h>
  35#include <linux/interrupt.h>
  36#include "viosrp.h"
  37
  38struct scsi_cmnd;
  39struct Scsi_Host;
  40
  41/* Number of indirect bufs...the list of these has to fit in the
  42 * additional data of the srp_cmd struct along with the indirect
  43 * descriptor
  44 */
  45#define MAX_INDIRECT_BUFS 10
  46
  47#define IBMVSCSI_MAX_REQUESTS_DEFAULT 100
  48#define IBMVSCSI_CMDS_PER_LUN_DEFAULT 16
  49#define IBMVSCSI_MAX_SECTORS_DEFAULT 256 /* 32 * 8 = default max I/O 32 pages */
  50#define IBMVSCSI_MAX_CMDS_PER_LUN 64
  51
  52/* ------------------------------------------------------------
  53 * Data Structures
  54 */
  55/* an RPA command/response transport queue */
  56struct crq_queue {
  57        struct viosrp_crq *msgs;
  58        int size, cur;
  59        dma_addr_t msg_token;
  60        spinlock_t lock;
  61};
  62
  63/* a unit of work for the hosting partition */
  64struct srp_event_struct {
  65        union viosrp_iu *xfer_iu;
  66        struct scsi_cmnd *cmnd;
  67        struct list_head list;
  68        void (*done) (struct srp_event_struct *);
  69        struct viosrp_crq crq;
  70        struct ibmvscsi_host_data *hostdata;
  71        atomic_t free;
  72        union viosrp_iu iu;
  73        void (*cmnd_done) (struct scsi_cmnd *);
  74        struct completion comp;
  75        struct timer_list timer;
  76        union viosrp_iu *sync_srp;
  77        struct srp_direct_buf *ext_list;
  78        dma_addr_t ext_list_token;
  79};
  80
  81/* a pool of event structs for use */
  82struct event_pool {
  83        struct srp_event_struct *events;
  84        u32 size;
  85        int next;
  86        union viosrp_iu *iu_storage;
  87        dma_addr_t iu_token;
  88};
  89
  90/* all driver data associated with a host adapter */
  91struct ibmvscsi_host_data {
  92        atomic_t request_limit;
  93        int client_migrated;
  94        struct device *dev;
  95        struct event_pool pool;
  96        struct crq_queue queue;
  97        struct tasklet_struct srp_task;
  98        struct list_head sent;
  99        struct Scsi_Host *host;
 100        struct mad_adapter_info_data madapter_info;
 101        struct capabilities caps;
 102        dma_addr_t caps_addr;
 103        dma_addr_t adapter_info_addr;
 104};
 105
 106/* routines for managing a command/response queue */
 107void ibmvscsi_handle_crq(struct viosrp_crq *crq,
 108                         struct ibmvscsi_host_data *hostdata);
 109
 110struct ibmvscsi_ops {
 111        int (*init_crq_queue)(struct crq_queue *queue,
 112                              struct ibmvscsi_host_data *hostdata,
 113                              int max_requests);
 114        void (*release_crq_queue)(struct crq_queue *queue,
 115                                  struct ibmvscsi_host_data *hostdata,
 116                                  int max_requests);
 117        int (*reset_crq_queue)(struct crq_queue *queue,
 118                               struct ibmvscsi_host_data *hostdata);
 119        int (*reenable_crq_queue)(struct crq_queue *queue,
 120                                  struct ibmvscsi_host_data *hostdata);
 121        int (*send_crq)(struct ibmvscsi_host_data *hostdata,
 122                       u64 word1, u64 word2);
 123};
 124
 125extern struct ibmvscsi_ops iseriesvscsi_ops;
 126extern struct ibmvscsi_ops rpavscsi_ops;
 127
 128#endif                          /* IBMVSCSI_H */
 129