1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright IBM Corp. 2000, 2008 4*4882a593Smuzhiyun * Author(s): Utz Bacher <utz.bacher@de.ibm.com> 5*4882a593Smuzhiyun * Jan Glauber <jang@linux.vnet.ibm.com> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun #ifndef __QDIO_H__ 9*4882a593Smuzhiyun #define __QDIO_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/interrupt.h> 12*4882a593Smuzhiyun #include <asm/cio.h> 13*4882a593Smuzhiyun #include <asm/ccwdev.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* only use 4 queues to save some cachelines */ 16*4882a593Smuzhiyun #define QDIO_MAX_QUEUES_PER_IRQ 4 17*4882a593Smuzhiyun #define QDIO_MAX_BUFFERS_PER_Q 128 18*4882a593Smuzhiyun #define QDIO_MAX_BUFFERS_MASK (QDIO_MAX_BUFFERS_PER_Q - 1) 19*4882a593Smuzhiyun #define QDIO_BUFNR(num) ((num) & QDIO_MAX_BUFFERS_MASK) 20*4882a593Smuzhiyun #define QDIO_MAX_ELEMENTS_PER_BUFFER 16 21*4882a593Smuzhiyun #define QDIO_SBAL_SIZE 256 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define QDIO_QETH_QFMT 0 24*4882a593Smuzhiyun #define QDIO_ZFCP_QFMT 1 25*4882a593Smuzhiyun #define QDIO_IQDIO_QFMT 2 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /** 28*4882a593Smuzhiyun * struct qdesfmt0 - queue descriptor, format 0 29*4882a593Smuzhiyun * @sliba: absolute address of storage list information block 30*4882a593Smuzhiyun * @sla: absolute address of storage list 31*4882a593Smuzhiyun * @slsba: absolute address of storage list state block 32*4882a593Smuzhiyun * @akey: access key for SLIB 33*4882a593Smuzhiyun * @bkey: access key for SL 34*4882a593Smuzhiyun * @ckey: access key for SBALs 35*4882a593Smuzhiyun * @dkey: access key for SLSB 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun struct qdesfmt0 { 38*4882a593Smuzhiyun u64 sliba; 39*4882a593Smuzhiyun u64 sla; 40*4882a593Smuzhiyun u64 slsba; 41*4882a593Smuzhiyun u32 : 32; 42*4882a593Smuzhiyun u32 akey : 4; 43*4882a593Smuzhiyun u32 bkey : 4; 44*4882a593Smuzhiyun u32 ckey : 4; 45*4882a593Smuzhiyun u32 dkey : 4; 46*4882a593Smuzhiyun u32 : 16; 47*4882a593Smuzhiyun } __attribute__ ((packed)); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define QDR_AC_MULTI_BUFFER_ENABLE 0x01 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /** 52*4882a593Smuzhiyun * struct qdr - queue description record (QDR) 53*4882a593Smuzhiyun * @qfmt: queue format 54*4882a593Smuzhiyun * @ac: adapter characteristics 55*4882a593Smuzhiyun * @iqdcnt: input queue descriptor count 56*4882a593Smuzhiyun * @oqdcnt: output queue descriptor count 57*4882a593Smuzhiyun * @iqdsz: input queue descriptor size 58*4882a593Smuzhiyun * @oqdsz: output queue descriptor size 59*4882a593Smuzhiyun * @qiba: absolute address of queue information block 60*4882a593Smuzhiyun * @qkey: queue information block key 61*4882a593Smuzhiyun * @qdf0: queue descriptions 62*4882a593Smuzhiyun */ 63*4882a593Smuzhiyun struct qdr { 64*4882a593Smuzhiyun u32 qfmt : 8; 65*4882a593Smuzhiyun u32 : 16; 66*4882a593Smuzhiyun u32 ac : 8; 67*4882a593Smuzhiyun u32 : 8; 68*4882a593Smuzhiyun u32 iqdcnt : 8; 69*4882a593Smuzhiyun u32 : 8; 70*4882a593Smuzhiyun u32 oqdcnt : 8; 71*4882a593Smuzhiyun u32 : 8; 72*4882a593Smuzhiyun u32 iqdsz : 8; 73*4882a593Smuzhiyun u32 : 8; 74*4882a593Smuzhiyun u32 oqdsz : 8; 75*4882a593Smuzhiyun /* private: */ 76*4882a593Smuzhiyun u32 res[9]; 77*4882a593Smuzhiyun /* public: */ 78*4882a593Smuzhiyun u64 qiba; 79*4882a593Smuzhiyun u32 : 32; 80*4882a593Smuzhiyun u32 qkey : 4; 81*4882a593Smuzhiyun u32 : 28; 82*4882a593Smuzhiyun struct qdesfmt0 qdf0[126]; 83*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40 86*4882a593Smuzhiyun #define QIB_RFLAGS_ENABLE_QEBSM 0x80 87*4882a593Smuzhiyun #define QIB_RFLAGS_ENABLE_DATA_DIV 0x02 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /** 90*4882a593Smuzhiyun * struct qib - queue information block (QIB) 91*4882a593Smuzhiyun * @qfmt: queue format 92*4882a593Smuzhiyun * @pfmt: implementation dependent parameter format 93*4882a593Smuzhiyun * @rflags: QEBSM 94*4882a593Smuzhiyun * @ac: adapter characteristics 95*4882a593Smuzhiyun * @isliba: absolute address of first input SLIB 96*4882a593Smuzhiyun * @osliba: absolute address of first output SLIB 97*4882a593Smuzhiyun * @ebcnam: adapter identifier in EBCDIC 98*4882a593Smuzhiyun * @parm: implementation dependent parameters 99*4882a593Smuzhiyun */ 100*4882a593Smuzhiyun struct qib { 101*4882a593Smuzhiyun u32 qfmt : 8; 102*4882a593Smuzhiyun u32 pfmt : 8; 103*4882a593Smuzhiyun u32 rflags : 8; 104*4882a593Smuzhiyun u32 ac : 8; 105*4882a593Smuzhiyun u32 : 32; 106*4882a593Smuzhiyun u64 isliba; 107*4882a593Smuzhiyun u64 osliba; 108*4882a593Smuzhiyun u32 : 32; 109*4882a593Smuzhiyun u32 : 32; 110*4882a593Smuzhiyun u8 ebcnam[8]; 111*4882a593Smuzhiyun /* private: */ 112*4882a593Smuzhiyun u8 res[88]; 113*4882a593Smuzhiyun /* public: */ 114*4882a593Smuzhiyun u8 parm[128]; 115*4882a593Smuzhiyun } __attribute__ ((packed, aligned(256))); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /** 118*4882a593Smuzhiyun * struct slibe - storage list information block element (SLIBE) 119*4882a593Smuzhiyun * @parms: implementation dependent parameters 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun struct slibe { 122*4882a593Smuzhiyun u64 parms; 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /** 126*4882a593Smuzhiyun * struct qaob - queue asynchronous operation block 127*4882a593Smuzhiyun * @res0: reserved parameters 128*4882a593Smuzhiyun * @res1: reserved parameter 129*4882a593Smuzhiyun * @res2: reserved parameter 130*4882a593Smuzhiyun * @res3: reserved parameter 131*4882a593Smuzhiyun * @aorc: asynchronous operation return code 132*4882a593Smuzhiyun * @flags: internal flags 133*4882a593Smuzhiyun * @cbtbs: control block type 134*4882a593Smuzhiyun * @sb_count: number of storage blocks 135*4882a593Smuzhiyun * @sba: storage block element addresses 136*4882a593Smuzhiyun * @dcount: size of storage block elements 137*4882a593Smuzhiyun * @user0: user defineable value 138*4882a593Smuzhiyun * @res4: reserved paramater 139*4882a593Smuzhiyun * @user1: user defineable value 140*4882a593Smuzhiyun * @user2: user defineable value 141*4882a593Smuzhiyun */ 142*4882a593Smuzhiyun struct qaob { 143*4882a593Smuzhiyun u64 res0[6]; 144*4882a593Smuzhiyun u8 res1; 145*4882a593Smuzhiyun u8 res2; 146*4882a593Smuzhiyun u8 res3; 147*4882a593Smuzhiyun u8 aorc; 148*4882a593Smuzhiyun u8 flags; 149*4882a593Smuzhiyun u16 cbtbs; 150*4882a593Smuzhiyun u8 sb_count; 151*4882a593Smuzhiyun u64 sba[QDIO_MAX_ELEMENTS_PER_BUFFER]; 152*4882a593Smuzhiyun u16 dcount[QDIO_MAX_ELEMENTS_PER_BUFFER]; 153*4882a593Smuzhiyun u64 user0; 154*4882a593Smuzhiyun u64 res4[2]; 155*4882a593Smuzhiyun u64 user1; 156*4882a593Smuzhiyun u64 user2; 157*4882a593Smuzhiyun } __attribute__ ((packed, aligned(256))); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /** 160*4882a593Smuzhiyun * struct slib - storage list information block (SLIB) 161*4882a593Smuzhiyun * @nsliba: next SLIB address (if any) 162*4882a593Smuzhiyun * @sla: SL address 163*4882a593Smuzhiyun * @slsba: SLSB address 164*4882a593Smuzhiyun * @slibe: SLIB elements 165*4882a593Smuzhiyun */ 166*4882a593Smuzhiyun struct slib { 167*4882a593Smuzhiyun u64 nsliba; 168*4882a593Smuzhiyun u64 sla; 169*4882a593Smuzhiyun u64 slsba; 170*4882a593Smuzhiyun /* private: */ 171*4882a593Smuzhiyun u8 res[1000]; 172*4882a593Smuzhiyun /* public: */ 173*4882a593Smuzhiyun struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q]; 174*4882a593Smuzhiyun } __attribute__ ((packed, aligned(2048))); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define SBAL_EFLAGS_LAST_ENTRY 0x40 177*4882a593Smuzhiyun #define SBAL_EFLAGS_CONTIGUOUS 0x20 178*4882a593Smuzhiyun #define SBAL_EFLAGS_FIRST_FRAG 0x04 179*4882a593Smuzhiyun #define SBAL_EFLAGS_MIDDLE_FRAG 0x08 180*4882a593Smuzhiyun #define SBAL_EFLAGS_LAST_FRAG 0x0c 181*4882a593Smuzhiyun #define SBAL_EFLAGS_MASK 0x6f 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun #define SBAL_SFLAGS0_PCI_REQ 0x40 184*4882a593Smuzhiyun #define SBAL_SFLAGS0_DATA_CONTINUATION 0x20 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* Awesome OpenFCP extensions */ 187*4882a593Smuzhiyun #define SBAL_SFLAGS0_TYPE_STATUS 0x00 188*4882a593Smuzhiyun #define SBAL_SFLAGS0_TYPE_WRITE 0x08 189*4882a593Smuzhiyun #define SBAL_SFLAGS0_TYPE_READ 0x10 190*4882a593Smuzhiyun #define SBAL_SFLAGS0_TYPE_WRITE_READ 0x18 191*4882a593Smuzhiyun #define SBAL_SFLAGS0_MORE_SBALS 0x04 192*4882a593Smuzhiyun #define SBAL_SFLAGS0_COMMAND 0x02 193*4882a593Smuzhiyun #define SBAL_SFLAGS0_LAST_SBAL 0x00 194*4882a593Smuzhiyun #define SBAL_SFLAGS0_ONLY_SBAL SBAL_SFLAGS0_COMMAND 195*4882a593Smuzhiyun #define SBAL_SFLAGS0_MIDDLE_SBAL SBAL_SFLAGS0_MORE_SBALS 196*4882a593Smuzhiyun #define SBAL_SFLAGS0_FIRST_SBAL (SBAL_SFLAGS0_MORE_SBALS | SBAL_SFLAGS0_COMMAND) 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /** 199*4882a593Smuzhiyun * struct qdio_buffer_element - SBAL entry 200*4882a593Smuzhiyun * @eflags: SBAL entry flags 201*4882a593Smuzhiyun * @scount: SBAL count 202*4882a593Smuzhiyun * @sflags: whole SBAL flags 203*4882a593Smuzhiyun * @length: length 204*4882a593Smuzhiyun * @addr: absolute data address 205*4882a593Smuzhiyun */ 206*4882a593Smuzhiyun struct qdio_buffer_element { 207*4882a593Smuzhiyun u8 eflags; 208*4882a593Smuzhiyun /* private: */ 209*4882a593Smuzhiyun u8 res1; 210*4882a593Smuzhiyun /* public: */ 211*4882a593Smuzhiyun u8 scount; 212*4882a593Smuzhiyun u8 sflags; 213*4882a593Smuzhiyun u32 length; 214*4882a593Smuzhiyun u64 addr; 215*4882a593Smuzhiyun } __attribute__ ((packed, aligned(16))); 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /** 218*4882a593Smuzhiyun * struct qdio_buffer - storage block address list (SBAL) 219*4882a593Smuzhiyun * @element: SBAL entries 220*4882a593Smuzhiyun */ 221*4882a593Smuzhiyun struct qdio_buffer { 222*4882a593Smuzhiyun struct qdio_buffer_element element[QDIO_MAX_ELEMENTS_PER_BUFFER]; 223*4882a593Smuzhiyun } __attribute__ ((packed, aligned(256))); 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /** 226*4882a593Smuzhiyun * struct sl_element - storage list entry 227*4882a593Smuzhiyun * @sbal: absolute SBAL address 228*4882a593Smuzhiyun */ 229*4882a593Smuzhiyun struct sl_element { 230*4882a593Smuzhiyun u64 sbal; 231*4882a593Smuzhiyun } __attribute__ ((packed)); 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /** 234*4882a593Smuzhiyun * struct sl - storage list (SL) 235*4882a593Smuzhiyun * @element: SL entries 236*4882a593Smuzhiyun */ 237*4882a593Smuzhiyun struct sl { 238*4882a593Smuzhiyun struct sl_element element[QDIO_MAX_BUFFERS_PER_Q]; 239*4882a593Smuzhiyun } __attribute__ ((packed, aligned(1024))); 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /** 242*4882a593Smuzhiyun * struct slsb - storage list state block (SLSB) 243*4882a593Smuzhiyun * @val: state per buffer 244*4882a593Smuzhiyun */ 245*4882a593Smuzhiyun struct slsb { 246*4882a593Smuzhiyun u8 val[QDIO_MAX_BUFFERS_PER_Q]; 247*4882a593Smuzhiyun } __attribute__ ((packed, aligned(256))); 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /** 250*4882a593Smuzhiyun * struct qdio_outbuf_state - SBAL related asynchronous operation information 251*4882a593Smuzhiyun * (for communication with upper layer programs) 252*4882a593Smuzhiyun * (only required for use with completion queues) 253*4882a593Smuzhiyun * @flags: flags indicating state of buffer 254*4882a593Smuzhiyun * @user: pointer to upper layer program's state information related to SBAL 255*4882a593Smuzhiyun * (stored in user1 data of QAOB) 256*4882a593Smuzhiyun */ 257*4882a593Smuzhiyun struct qdio_outbuf_state { 258*4882a593Smuzhiyun u8 flags; 259*4882a593Smuzhiyun void *user; 260*4882a593Smuzhiyun }; 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #define QDIO_OUTBUF_STATE_FLAG_PENDING 0x01 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #define CHSC_AC1_INITIATE_INPUTQ 0x80 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* qdio adapter-characteristics-1 flag */ 268*4882a593Smuzhiyun #define AC1_SIGA_INPUT_NEEDED 0x40 /* process input queues */ 269*4882a593Smuzhiyun #define AC1_SIGA_OUTPUT_NEEDED 0x20 /* process output queues */ 270*4882a593Smuzhiyun #define AC1_SIGA_SYNC_NEEDED 0x10 /* ask hypervisor to sync */ 271*4882a593Smuzhiyun #define AC1_AUTOMATIC_SYNC_ON_THININT 0x08 /* set by hypervisor */ 272*4882a593Smuzhiyun #define AC1_AUTOMATIC_SYNC_ON_OUT_PCI 0x04 /* set by hypervisor */ 273*4882a593Smuzhiyun #define AC1_SC_QEBSM_AVAILABLE 0x02 /* available for subchannel */ 274*4882a593Smuzhiyun #define AC1_SC_QEBSM_ENABLED 0x01 /* enabled for subchannel */ 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #define CHSC_AC2_MULTI_BUFFER_AVAILABLE 0x0080 277*4882a593Smuzhiyun #define CHSC_AC2_MULTI_BUFFER_ENABLED 0x0040 278*4882a593Smuzhiyun #define CHSC_AC2_DATA_DIV_AVAILABLE 0x0010 279*4882a593Smuzhiyun #define CHSC_AC2_SNIFFER_AVAILABLE 0x0008 280*4882a593Smuzhiyun #define CHSC_AC2_DATA_DIV_ENABLED 0x0002 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define CHSC_AC3_FORMAT2_CQ_AVAILABLE 0x8000 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun struct qdio_ssqd_desc { 285*4882a593Smuzhiyun u8 flags; 286*4882a593Smuzhiyun u8:8; 287*4882a593Smuzhiyun u16 sch; 288*4882a593Smuzhiyun u8 qfmt; 289*4882a593Smuzhiyun u8 parm; 290*4882a593Smuzhiyun u8 qdioac1; 291*4882a593Smuzhiyun u8 sch_class; 292*4882a593Smuzhiyun u8 pcnt; 293*4882a593Smuzhiyun u8 icnt; 294*4882a593Smuzhiyun u8:8; 295*4882a593Smuzhiyun u8 ocnt; 296*4882a593Smuzhiyun u8:8; 297*4882a593Smuzhiyun u8 mbccnt; 298*4882a593Smuzhiyun u16 qdioac2; 299*4882a593Smuzhiyun u64 sch_token; 300*4882a593Smuzhiyun u8 mro; 301*4882a593Smuzhiyun u8 mri; 302*4882a593Smuzhiyun u16 qdioac3; 303*4882a593Smuzhiyun u16:16; 304*4882a593Smuzhiyun u8:8; 305*4882a593Smuzhiyun u8 mmwc; 306*4882a593Smuzhiyun } __attribute__ ((packed)); 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun /* params are: ccw_device, qdio_error, queue_number, 309*4882a593Smuzhiyun first element processed, number of elements processed, int_parm */ 310*4882a593Smuzhiyun typedef void qdio_handler_t(struct ccw_device *, unsigned int, int, 311*4882a593Smuzhiyun int, int, unsigned long); 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun /* qdio errors reported to the upper-layer program */ 314*4882a593Smuzhiyun #define QDIO_ERROR_ACTIVATE 0x0001 315*4882a593Smuzhiyun #define QDIO_ERROR_GET_BUF_STATE 0x0002 316*4882a593Smuzhiyun #define QDIO_ERROR_SET_BUF_STATE 0x0004 317*4882a593Smuzhiyun #define QDIO_ERROR_SLSB_STATE 0x0100 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun #define QDIO_ERROR_FATAL 0x00ff 320*4882a593Smuzhiyun #define QDIO_ERROR_TEMPORARY 0xff00 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun /* for qdio_cleanup */ 323*4882a593Smuzhiyun #define QDIO_FLAG_CLEANUP_USING_CLEAR 0x01 324*4882a593Smuzhiyun #define QDIO_FLAG_CLEANUP_USING_HALT 0x02 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun /** 327*4882a593Smuzhiyun * struct qdio_initialize - qdio initialization data 328*4882a593Smuzhiyun * @q_format: queue format 329*4882a593Smuzhiyun * @qdr_ac: feature flags to set 330*4882a593Smuzhiyun * @qib_param_field_format: format for qib_parm_field 331*4882a593Smuzhiyun * @qib_param_field: pointer to 128 bytes or NULL, if no param field 332*4882a593Smuzhiyun * @qib_rflags: rflags to set 333*4882a593Smuzhiyun * @input_slib_elements: pointer to no_input_qs * 128 words of data or NULL 334*4882a593Smuzhiyun * @output_slib_elements: pointer to no_output_qs * 128 words of data or NULL 335*4882a593Smuzhiyun * @no_input_qs: number of input queues 336*4882a593Smuzhiyun * @no_output_qs: number of output queues 337*4882a593Smuzhiyun * @input_handler: handler to be called for input queues 338*4882a593Smuzhiyun * @output_handler: handler to be called for output queues 339*4882a593Smuzhiyun * @irq_poll: Data IRQ polling handler (NULL when not supported) 340*4882a593Smuzhiyun * @scan_threshold: # of in-use buffers that triggers scan on output queue 341*4882a593Smuzhiyun * @int_parm: interruption parameter 342*4882a593Smuzhiyun * @input_sbal_addr_array: per-queue array, each element points to 128 SBALs 343*4882a593Smuzhiyun * @output_sbal_addr_array: per-queue array, each element points to 128 SBALs 344*4882a593Smuzhiyun * @output_sbal_state_array: no_output_qs * 128 state info (for CQ or NULL) 345*4882a593Smuzhiyun */ 346*4882a593Smuzhiyun struct qdio_initialize { 347*4882a593Smuzhiyun unsigned char q_format; 348*4882a593Smuzhiyun unsigned char qdr_ac; 349*4882a593Smuzhiyun unsigned int qib_param_field_format; 350*4882a593Smuzhiyun unsigned char *qib_param_field; 351*4882a593Smuzhiyun unsigned char qib_rflags; 352*4882a593Smuzhiyun unsigned long *input_slib_elements; 353*4882a593Smuzhiyun unsigned long *output_slib_elements; 354*4882a593Smuzhiyun unsigned int no_input_qs; 355*4882a593Smuzhiyun unsigned int no_output_qs; 356*4882a593Smuzhiyun qdio_handler_t *input_handler; 357*4882a593Smuzhiyun qdio_handler_t *output_handler; 358*4882a593Smuzhiyun void (*irq_poll)(struct ccw_device *cdev, unsigned long data); 359*4882a593Smuzhiyun unsigned int scan_threshold; 360*4882a593Smuzhiyun unsigned long int_parm; 361*4882a593Smuzhiyun struct qdio_buffer ***input_sbal_addr_array; 362*4882a593Smuzhiyun struct qdio_buffer ***output_sbal_addr_array; 363*4882a593Smuzhiyun struct qdio_outbuf_state *output_sbal_state_array; 364*4882a593Smuzhiyun }; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun #define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */ 367*4882a593Smuzhiyun #define QDIO_STATE_ESTABLISHED 0x00000004 /* after qdio_establish */ 368*4882a593Smuzhiyun #define QDIO_STATE_ACTIVE 0x00000008 /* after qdio_activate */ 369*4882a593Smuzhiyun #define QDIO_STATE_STOPPED 0x00000010 /* after queues went down */ 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define QDIO_FLAG_SYNC_INPUT 0x01 372*4882a593Smuzhiyun #define QDIO_FLAG_SYNC_OUTPUT 0x02 373*4882a593Smuzhiyun #define QDIO_FLAG_PCI_OUT 0x10 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun int qdio_alloc_buffers(struct qdio_buffer **buf, unsigned int count); 376*4882a593Smuzhiyun void qdio_free_buffers(struct qdio_buffer **buf, unsigned int count); 377*4882a593Smuzhiyun void qdio_reset_buffers(struct qdio_buffer **buf, unsigned int count); 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun extern int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs, 380*4882a593Smuzhiyun unsigned int no_output_qs); 381*4882a593Smuzhiyun extern int qdio_establish(struct ccw_device *cdev, 382*4882a593Smuzhiyun struct qdio_initialize *init_data); 383*4882a593Smuzhiyun extern int qdio_activate(struct ccw_device *); 384*4882a593Smuzhiyun extern void qdio_release_aob(struct qaob *); 385*4882a593Smuzhiyun extern int do_QDIO(struct ccw_device *, unsigned int, int, unsigned int, 386*4882a593Smuzhiyun unsigned int); 387*4882a593Smuzhiyun extern int qdio_start_irq(struct ccw_device *cdev); 388*4882a593Smuzhiyun extern int qdio_stop_irq(struct ccw_device *cdev); 389*4882a593Smuzhiyun extern int qdio_get_next_buffers(struct ccw_device *, int, int *, int *); 390*4882a593Smuzhiyun extern int qdio_inspect_queue(struct ccw_device *cdev, unsigned int nr, 391*4882a593Smuzhiyun bool is_input, unsigned int *bufnr, 392*4882a593Smuzhiyun unsigned int *error); 393*4882a593Smuzhiyun extern int qdio_shutdown(struct ccw_device *, int); 394*4882a593Smuzhiyun extern int qdio_free(struct ccw_device *); 395*4882a593Smuzhiyun extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *); 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun #endif /* __QDIO_H__ */ 398