1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
42
43
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
50#define IBMVSCSI_MAX_CMDS_PER_LUN 64
51
52
53
54
55
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
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
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
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
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
129