0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef ZFCP_QDIO_H
0011 #define ZFCP_QDIO_H
0012
0013 #include <linux/interrupt.h>
0014 #include <asm/qdio.h>
0015
0016 #define ZFCP_QDIO_SBALE_LEN PAGE_SIZE
0017
0018
0019 #define ZFCP_QDIO_MAX_SBALS_PER_REQ 36
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 struct zfcp_qdio {
0041 struct qdio_buffer *res_q[QDIO_MAX_BUFFERS_PER_Q];
0042 struct qdio_buffer *req_q[QDIO_MAX_BUFFERS_PER_Q];
0043 u8 req_q_idx;
0044 atomic_t req_q_free;
0045 spinlock_t stat_lock;
0046 spinlock_t req_q_lock;
0047 unsigned long long req_q_time;
0048 u64 req_q_util;
0049 atomic_t req_q_full;
0050 wait_queue_head_t req_q_wq;
0051 struct tasklet_struct irq_tasklet;
0052 struct tasklet_struct request_tasklet;
0053 struct timer_list request_timer;
0054 struct zfcp_adapter *adapter;
0055 u16 max_sbale_per_sbal;
0056 u16 max_sbale_per_req;
0057 };
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 struct zfcp_qdio_req {
0070 u8 sbtype;
0071 u8 sbal_number;
0072 u8 sbal_first;
0073 u8 sbal_last;
0074 u8 sbal_limit;
0075 u8 sbale_curr;
0076 u16 qdio_outb_usage;
0077 };
0078
0079
0080
0081
0082
0083
0084
0085 static inline struct qdio_buffer_element *
0086 zfcp_qdio_sbale_req(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
0087 {
0088 return &qdio->req_q[q_req->sbal_last]->element[0];
0089 }
0090
0091
0092
0093
0094
0095
0096
0097 static inline struct qdio_buffer_element *
0098 zfcp_qdio_sbale_curr(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
0099 {
0100 return &qdio->req_q[q_req->sbal_last]->element[q_req->sbale_curr];
0101 }
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 static inline
0117 void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
0118 unsigned long req_id, u8 sbtype, void *data, u32 len)
0119 {
0120 struct qdio_buffer_element *sbale;
0121 int count = min(atomic_read(&qdio->req_q_free),
0122 ZFCP_QDIO_MAX_SBALS_PER_REQ);
0123
0124 q_req->sbal_first = q_req->sbal_last = qdio->req_q_idx;
0125 q_req->sbal_number = 1;
0126 q_req->sbtype = sbtype;
0127 q_req->sbale_curr = 1;
0128 q_req->sbal_limit = (q_req->sbal_first + count - 1)
0129 % QDIO_MAX_BUFFERS_PER_Q;
0130
0131 sbale = zfcp_qdio_sbale_req(qdio, q_req);
0132 sbale->addr = req_id;
0133 sbale->eflags = 0;
0134 sbale->sflags = SBAL_SFLAGS0_COMMAND | sbtype;
0135
0136 if (unlikely(!data))
0137 return;
0138 sbale++;
0139 sbale->addr = virt_to_phys(data);
0140 sbale->length = len;
0141 }
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 static inline
0154 void zfcp_qdio_fill_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
0155 void *data, u32 len)
0156 {
0157 struct qdio_buffer_element *sbale;
0158
0159 BUG_ON(q_req->sbale_curr == qdio->max_sbale_per_sbal - 1);
0160 q_req->sbale_curr++;
0161 sbale = zfcp_qdio_sbale_curr(qdio, q_req);
0162 sbale->addr = virt_to_phys(data);
0163 sbale->length = len;
0164 }
0165
0166
0167
0168
0169
0170
0171 static inline
0172 void zfcp_qdio_set_sbale_last(struct zfcp_qdio *qdio,
0173 struct zfcp_qdio_req *q_req)
0174 {
0175 struct qdio_buffer_element *sbale;
0176
0177 sbale = zfcp_qdio_sbale_curr(qdio, q_req);
0178 sbale->eflags |= SBAL_EFLAGS_LAST_ENTRY;
0179 }
0180
0181
0182
0183
0184
0185
0186
0187
0188 static inline
0189 int zfcp_qdio_sg_one_sbale(struct scatterlist *sg)
0190 {
0191 return sg_is_last(sg) && sg->length <= ZFCP_QDIO_SBALE_LEN;
0192 }
0193
0194
0195
0196
0197
0198
0199 static inline
0200 void zfcp_qdio_skip_to_last_sbale(struct zfcp_qdio *qdio,
0201 struct zfcp_qdio_req *q_req)
0202 {
0203 q_req->sbale_curr = qdio->max_sbale_per_sbal - 1;
0204 }
0205
0206
0207
0208
0209
0210
0211
0212 static inline
0213 void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio,
0214 struct zfcp_qdio_req *q_req, int max_sbals)
0215 {
0216 int count = min(atomic_read(&qdio->req_q_free), max_sbals);
0217
0218 q_req->sbal_limit = (q_req->sbal_first + count - 1) %
0219 QDIO_MAX_BUFFERS_PER_Q;
0220 }
0221
0222
0223
0224
0225
0226
0227
0228 static inline
0229 void zfcp_qdio_set_data_div(struct zfcp_qdio *qdio,
0230 struct zfcp_qdio_req *q_req, u32 count)
0231 {
0232 struct qdio_buffer_element *sbale;
0233
0234 sbale = qdio->req_q[q_req->sbal_first]->element;
0235 sbale->length = count;
0236 }
0237
0238
0239
0240
0241
0242 static inline
0243 unsigned int zfcp_qdio_real_bytes(struct scatterlist *sg)
0244 {
0245 unsigned int real_bytes = 0;
0246
0247 for (; sg; sg = sg_next(sg))
0248 real_bytes += sg->length;
0249
0250 return real_bytes;
0251 }
0252
0253
0254
0255
0256
0257
0258 static inline
0259 void zfcp_qdio_set_scount(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
0260 {
0261 struct qdio_buffer_element *sbale;
0262
0263 sbale = qdio->req_q[q_req->sbal_first]->element;
0264 sbale->scount = q_req->sbal_number - 1;
0265 }
0266
0267 #endif