@@ -122,6 +122,40 @@ struct slibe {
122
122
u64 parms ;
123
123
};
124
124
125
+ /**
126
+ * struct qaob - queue asynchronous operation block
127
+ * @res0: reserved parameters
128
+ * @res1: reserved parameter
129
+ * @res2: reserved parameter
130
+ * @res3: reserved parameter
131
+ * @aorc: asynchronous operation return code
132
+ * @flags: internal flags
133
+ * @cbtbs: control block type
134
+ * @sb_count: number of storage blocks
135
+ * @sba: storage block element addresses
136
+ * @dcount: size of storage block elements
137
+ * @user0: user defineable value
138
+ * @res4: reserved paramater
139
+ * @user1: user defineable value
140
+ * @user2: user defineable value
141
+ */
142
+ struct qaob {
143
+ u64 res0 [6 ];
144
+ u8 res1 ;
145
+ u8 res2 ;
146
+ u8 res3 ;
147
+ u8 aorc ;
148
+ u8 flags ;
149
+ u16 cbtbs ;
150
+ u8 sb_count ;
151
+ u64 sba [QDIO_MAX_ELEMENTS_PER_BUFFER ];
152
+ u16 dcount [QDIO_MAX_ELEMENTS_PER_BUFFER ];
153
+ u64 user0 ;
154
+ u64 res4 [2 ];
155
+ u64 user1 ;
156
+ u64 user2 ;
157
+ } __attribute__ ((packed , aligned (256 )));
158
+
125
159
/**
126
160
* struct slib - storage list information block (SLIB)
127
161
* @nsliba: next SLIB address (if any)
@@ -225,6 +259,31 @@ struct slsb {
225
259
#define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010
226
260
#define CHSC_AC2_DATA_DIV_ENABLED 0x0002
227
261
262
+ /**
263
+ * struct qdio_outbuf_state - SBAL related asynchronous operation information
264
+ * (for communication with upper layer programs)
265
+ * (only required for use with completion queues)
266
+ * @flags: flags indicating state of buffer
267
+ * @aob: pointer to QAOB used for the particular SBAL
268
+ * @user: pointer to upper layer program's state information related to SBAL
269
+ * (stored in user1 data of QAOB)
270
+ */
271
+ struct qdio_outbuf_state {
272
+ u8 flags ;
273
+ struct qaob * aob ;
274
+ void * user ;
275
+ };
276
+
277
+ #define QDIO_OUTBUF_STATE_FLAG_NONE 0x00
278
+ #define QDIO_OUTBUF_STATE_FLAG_PENDING 0x01
279
+
280
+ #define CHSC_AC1_INITIATE_INPUTQ 0x80
281
+
282
+ #define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010
283
+ #define CHSC_AC2_DATA_DIV_ENABLED 0x0002
284
+
285
+ #define CHSC_AC3_FORMAT2_CQ_AVAILABLE 0x8000
286
+
228
287
struct qdio_ssqd_desc {
229
288
u8 flags ;
230
289
u8 :8 ;
@@ -243,8 +302,7 @@ struct qdio_ssqd_desc {
243
302
u64 sch_token ;
244
303
u8 mro ;
245
304
u8 mri ;
246
- u8 :8 ;
247
- u8 sbalic ;
305
+ u16 qdioac3 ;
248
306
u16 :16 ;
249
307
u8 :8 ;
250
308
u8 mmwc ;
@@ -280,9 +338,11 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
280
338
* @no_output_qs: number of output queues
281
339
* @input_handler: handler to be called for input queues
282
340
* @output_handler: handler to be called for output queues
341
+ * @queue_start_poll: polling handlers (one per input queue or NULL)
283
342
* @int_parm: interruption parameter
284
343
* @input_sbal_addr_array: address of no_input_qs * 128 pointers
285
344
* @output_sbal_addr_array: address of no_output_qs * 128 pointers
345
+ * @output_sbal_state_array: no_output_qs * 128 state info (for CQ or NULL)
286
346
*/
287
347
struct qdio_initialize {
288
348
struct ccw_device * cdev ;
@@ -297,11 +357,12 @@ struct qdio_initialize {
297
357
unsigned int no_output_qs ;
298
358
qdio_handler_t * input_handler ;
299
359
qdio_handler_t * output_handler ;
300
- void (* queue_start_poll ) (struct ccw_device * , int , unsigned long );
360
+ void (* * queue_start_poll ) (struct ccw_device * , int , unsigned long );
301
361
int scan_threshold ;
302
362
unsigned long int_parm ;
303
363
void * * input_sbal_addr_array ;
304
364
void * * output_sbal_addr_array ;
365
+ struct qdio_outbuf_state * output_sbal_state_array ;
305
366
};
306
367
307
368
#define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */
@@ -316,6 +377,7 @@ struct qdio_initialize {
316
377
extern int qdio_allocate (struct qdio_initialize * );
317
378
extern int qdio_establish (struct qdio_initialize * );
318
379
extern int qdio_activate (struct ccw_device * );
380
+ extern void qdio_release_aob (struct qaob * );
319
381
extern int do_QDIO (struct ccw_device * , unsigned int , int , unsigned int ,
320
382
unsigned int );
321
383
extern int qdio_start_irq (struct ccw_device * , int );
0 commit comments