aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi/zfcp_qdio.h
diff options
context:
space:
mode:
authorSwen Schillig <swen@vnet.ibm.com>2010-07-16 09:37:38 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-28 10:48:50 -0400
commit706eca49a044a1ea89352dcc4b96ffc1631b2cb5 (patch)
treef36692c277a38c051536e06272ade7ed759ab4cc /drivers/s390/scsi/zfcp_qdio.h
parent01b047599ade30051bf6c14fbe64181d1fec3dfa (diff)
[SCSI] zfcp: Cleanup QDIO attachment and improve processing.
Some definitions and structures in the zfcp QDIO processing are improved by the removal of not required variables and processing steps. I addition the naming of some variables is changed to make their purpose more clear. Signed-off-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390/scsi/zfcp_qdio.h')
-rw-r--r--drivers/s390/scsi/zfcp_qdio.h57
1 files changed, 17 insertions, 40 deletions
diff --git a/drivers/s390/scsi/zfcp_qdio.h b/drivers/s390/scsi/zfcp_qdio.h
index 8bb00545f19c..10d0df99dbf4 100644
--- a/drivers/s390/scsi/zfcp_qdio.h
+++ b/drivers/s390/scsi/zfcp_qdio.h
@@ -28,21 +28,11 @@
28 (ZFCP_QDIO_MAX_SBALS_PER_REQ * ZFCP_QDIO_MAX_SBALES_PER_SBAL - 2) 28 (ZFCP_QDIO_MAX_SBALS_PER_REQ * ZFCP_QDIO_MAX_SBALES_PER_SBAL - 2)
29 29
30/** 30/**
31 * struct zfcp_qdio_queue - qdio queue buffer, zfcp index and free count
32 * @sbal: qdio buffers
33 * @first: index of next free buffer in queue
34 * @count: number of free buffers in queue
35 */
36struct zfcp_qdio_queue {
37 struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q];
38 u8 first;
39 atomic_t count;
40};
41
42/**
43 * struct zfcp_qdio - basic qdio data structure 31 * struct zfcp_qdio - basic qdio data structure
44 * @resp_q: response queue 32 * @res_q: response queue
45 * @req_q: request queue 33 * @req_q: request queue
34 * @req_q_idx: index of next free buffer
35 * @req_q_free: number of free buffers in queue
46 * @stat_lock: lock to protect req_q_util and req_q_time 36 * @stat_lock: lock to protect req_q_util and req_q_time
47 * @req_q_lock: lock to serialize access to request queue 37 * @req_q_lock: lock to serialize access to request queue
48 * @req_q_time: time of last fill level change 38 * @req_q_time: time of last fill level change
@@ -52,8 +42,10 @@ struct zfcp_qdio_queue {
52 * @adapter: adapter used in conjunction with this qdio structure 42 * @adapter: adapter used in conjunction with this qdio structure
53 */ 43 */
54struct zfcp_qdio { 44struct zfcp_qdio {
55 struct zfcp_qdio_queue resp_q; 45 struct qdio_buffer *res_q[QDIO_MAX_BUFFERS_PER_Q];
56 struct zfcp_qdio_queue req_q; 46 struct qdio_buffer *req_q[QDIO_MAX_BUFFERS_PER_Q];
47 u8 req_q_idx;
48 atomic_t req_q_free;
57 spinlock_t stat_lock; 49 spinlock_t stat_lock;
58 spinlock_t req_q_lock; 50 spinlock_t req_q_lock;
59 unsigned long long req_q_time; 51 unsigned long long req_q_time;
@@ -73,7 +65,6 @@ struct zfcp_qdio {
73 * @sbale_curr: current sbale at creation of this request 65 * @sbale_curr: current sbale at creation of this request
74 * @sbal_response: sbal used in interrupt 66 * @sbal_response: sbal used in interrupt
75 * @qdio_outb_usage: usage of outbound queue 67 * @qdio_outb_usage: usage of outbound queue
76 * @qdio_inb_usage: usage of inbound queue
77 */ 68 */
78struct zfcp_qdio_req { 69struct zfcp_qdio_req {
79 u32 sbtype; 70 u32 sbtype;
@@ -84,22 +75,9 @@ struct zfcp_qdio_req {
84 u8 sbale_curr; 75 u8 sbale_curr;
85 u8 sbal_response; 76 u8 sbal_response;
86 u16 qdio_outb_usage; 77 u16 qdio_outb_usage;
87 u16 qdio_inb_usage;
88}; 78};
89 79
90/** 80/**
91 * zfcp_qdio_sbale - return pointer to sbale in qdio queue
92 * @q: queue where to find sbal
93 * @sbal_idx: sbal index in queue
94 * @sbale_idx: sbale index in sbal
95 */
96static inline struct qdio_buffer_element *
97zfcp_qdio_sbale(struct zfcp_qdio_queue *q, int sbal_idx, int sbale_idx)
98{
99 return &q->sbal[sbal_idx]->element[sbale_idx];
100}
101
102/**
103 * zfcp_qdio_sbale_req - return pointer to sbale on req_q for a request 81 * zfcp_qdio_sbale_req - return pointer to sbale on req_q for a request
104 * @qdio: pointer to struct zfcp_qdio 82 * @qdio: pointer to struct zfcp_qdio
105 * @q_rec: pointer to struct zfcp_qdio_req 83 * @q_rec: pointer to struct zfcp_qdio_req
@@ -108,7 +86,7 @@ zfcp_qdio_sbale(struct zfcp_qdio_queue *q, int sbal_idx, int sbale_idx)
108static inline struct qdio_buffer_element * 86static inline struct qdio_buffer_element *
109zfcp_qdio_sbale_req(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) 87zfcp_qdio_sbale_req(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
110{ 88{
111 return zfcp_qdio_sbale(&qdio->req_q, q_req->sbal_last, 0); 89 return &qdio->req_q[q_req->sbal_last]->element[0];
112} 90}
113 91
114/** 92/**
@@ -120,8 +98,7 @@ zfcp_qdio_sbale_req(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
120static inline struct qdio_buffer_element * 98static inline struct qdio_buffer_element *
121zfcp_qdio_sbale_curr(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) 99zfcp_qdio_sbale_curr(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
122{ 100{
123 return zfcp_qdio_sbale(&qdio->req_q, q_req->sbal_last, 101 return &qdio->req_q[q_req->sbal_last]->element[q_req->sbale_curr];
124 q_req->sbale_curr);
125} 102}
126 103
127/** 104/**
@@ -142,25 +119,25 @@ void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
142 unsigned long req_id, u32 sbtype, void *data, u32 len) 119 unsigned long req_id, u32 sbtype, void *data, u32 len)
143{ 120{
144 struct qdio_buffer_element *sbale; 121 struct qdio_buffer_element *sbale;
145 int count = min(atomic_read(&qdio->req_q.count), 122 int count = min(atomic_read(&qdio->req_q_free),
146 ZFCP_QDIO_MAX_SBALS_PER_REQ); 123 ZFCP_QDIO_MAX_SBALS_PER_REQ);
147 124
148 q_req->sbal_first = q_req->sbal_last = qdio->req_q.first; 125 q_req->sbal_first = q_req->sbal_last = qdio->req_q_idx;
149 q_req->sbal_number = 1; 126 q_req->sbal_number = 1;
150 q_req->sbtype = sbtype; 127 q_req->sbtype = sbtype;
128 q_req->sbale_curr = 1;
151 q_req->sbal_limit = (q_req->sbal_first + count - 1) 129 q_req->sbal_limit = (q_req->sbal_first + count - 1)
152 % QDIO_MAX_BUFFERS_PER_Q; 130 % QDIO_MAX_BUFFERS_PER_Q;
153 131
154 sbale = zfcp_qdio_sbale_req(qdio, q_req); 132 sbale = zfcp_qdio_sbale_req(qdio, q_req);
155 sbale->addr = (void *) req_id; 133 sbale->addr = (void *) req_id;
156 sbale->flags |= SBAL_FLAGS0_COMMAND; 134 sbale->flags = SBAL_FLAGS0_COMMAND | sbtype;
157 sbale->flags |= sbtype;
158 135
159 q_req->sbale_curr = 1; 136 if (unlikely(!data))
137 return;
160 sbale++; 138 sbale++;
161 sbale->addr = data; 139 sbale->addr = data;
162 if (likely(data)) 140 sbale->length = len;
163 sbale->length = len;
164} 141}
165 142
166/** 143/**
@@ -232,7 +209,7 @@ static inline
232void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio, 209void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio,
233 struct zfcp_qdio_req *q_req, int max_sbals) 210 struct zfcp_qdio_req *q_req, int max_sbals)
234{ 211{
235 int count = min(atomic_read(&qdio->req_q.count), max_sbals); 212 int count = min(atomic_read(&qdio->req_q_free), max_sbals);
236 213
237 q_req->sbal_limit = (q_req->sbal_first + count - 1) % 214 q_req->sbal_limit = (q_req->sbal_first + count - 1) %
238 QDIO_MAX_BUFFERS_PER_Q; 215 QDIO_MAX_BUFFERS_PER_Q;