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 struct device *dev;
94 struct event_pool pool;
95 struct crq_queue queue;
96 struct tasklet_struct srp_task;
97 struct list_head sent;
98 struct Scsi_Host *host;
99 struct mad_adapter_info_data madapter_info;
100};
101
102
103void ibmvscsi_handle_crq(struct viosrp_crq *crq,
104 struct ibmvscsi_host_data *hostdata);
105
106struct ibmvscsi_ops {
107 int (*init_crq_queue)(struct crq_queue *queue,
108 struct ibmvscsi_host_data *hostdata,
109 int max_requests);
110 void (*release_crq_queue)(struct crq_queue *queue,
111 struct ibmvscsi_host_data *hostdata,
112 int max_requests);
113 int (*reset_crq_queue)(struct crq_queue *queue,
114 struct ibmvscsi_host_data *hostdata);
115 int (*reenable_crq_queue)(struct crq_queue *queue,
116 struct ibmvscsi_host_data *hostdata);
117 int (*send_crq)(struct ibmvscsi_host_data *hostdata,
118 u64 word1, u64 word2);
119};
120
121extern struct ibmvscsi_ops iseriesvscsi_ops;
122extern struct ibmvscsi_ops rpavscsi_ops;
123
124#endif
125