@@ -122,6 +122,40 @@ struct slibe {
122122 u64 parms ;
123123};
124124
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+
125159/**
126160 * struct slib - storage list information block (SLIB)
127161 * @nsliba: next SLIB address (if any)
@@ -225,6 +259,31 @@ struct slsb {
225259#define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010
226260#define CHSC_AC2_DATA_DIV_ENABLED 0x0002
227261
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+
228287struct qdio_ssqd_desc {
229288 u8 flags ;
230289 u8 :8 ;
@@ -243,8 +302,7 @@ struct qdio_ssqd_desc {
243302 u64 sch_token ;
244303 u8 mro ;
245304 u8 mri ;
246- u8 :8 ;
247- u8 sbalic ;
305+ u16 qdioac3 ;
248306 u16 :16 ;
249307 u8 :8 ;
250308 u8 mmwc ;
@@ -280,9 +338,11 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
280338 * @no_output_qs: number of output queues
281339 * @input_handler: handler to be called for input queues
282340 * @output_handler: handler to be called for output queues
341+ * @queue_start_poll: polling handlers (one per input queue or NULL)
283342 * @int_parm: interruption parameter
284343 * @input_sbal_addr_array: address of no_input_qs * 128 pointers
285344 * @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)
286346 */
287347struct qdio_initialize {
288348 struct ccw_device * cdev ;
@@ -297,11 +357,12 @@ struct qdio_initialize {
297357 unsigned int no_output_qs ;
298358 qdio_handler_t * input_handler ;
299359 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 );
301361 int scan_threshold ;
302362 unsigned long int_parm ;
303363 void * * input_sbal_addr_array ;
304364 void * * output_sbal_addr_array ;
365+ struct qdio_outbuf_state * output_sbal_state_array ;
305366};
306367
307368#define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */
@@ -316,6 +377,7 @@ struct qdio_initialize {
316377extern int qdio_allocate (struct qdio_initialize * );
317378extern int qdio_establish (struct qdio_initialize * );
318379extern int qdio_activate (struct ccw_device * );
380+ extern void qdio_release_aob (struct qaob * );
319381extern int do_QDIO (struct ccw_device * , unsigned int , int , unsigned int ,
320382 unsigned int );
321383extern int qdio_start_irq (struct ccw_device * , int );
0 commit comments