2 * File...........: linux/include/asm-s390/ccwcache.h
3 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
4 * Bugreports.to..: <Linux390@de.ibm.com>
5 * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
9 #include <linux/slab.h>
13 #define kmem_cache_t void
14 #endif /* __KERNEL__ */
16 typedef struct ccw_req_t {
17 /* eye catcher plus queueing information */
19 struct ccw_req_t *next; /* pointer to next ccw_req_t in queue */
20 struct ccw_req_t *int_next; /* for internal queueing */
21 struct ccw_req_t *int_prev; /* for internal queueing */
23 /* Where to execute what... */
24 void *device; /* index of the device the req is for */
25 void *req; /* pointer to originating request */
26 ccw1_t *cpaddr; /* address of channel program */
27 char status; /* reflecting the status of this request */
28 char flags; /* see below */
29 short retries; /* A retry counter to be set when filling */
32 int options; /* options for execution */
33 char lpm; /* logical path mask */
34 void *data; /* pointer to data area */
35 devstat_t *dstat; /* The device status in case of an error */
37 /* these are important for recovering erroneous requests */
38 struct ccw_req_t *refers; /* Does this request refer to another one? */
39 void *function; /* refers to the originating ERP action */ ;
41 unsigned long long expires; /* expiratioj period */
42 /* these are for profiling purposes */
43 unsigned long long buildclk; /* TOD-clock of request generation */
44 unsigned long long startclk; /* TOD-clock of request start */
45 unsigned long long stopclk; /* TOD-clock of request interrupt */
46 unsigned long long endclk; /* TOD-clock of request termination */
48 /* these are for internal use */
49 int cplength; /* length of the channel program in CCWs */
50 int datasize; /* amount of additional data in bytes */
51 kmem_cache_t *cache; /* the cache this data comes from */
53 } __attribute__ ((aligned(4))) ccw_req_t;
56 * ccw_req_t -> status can be:
58 #define CQR_STATUS_EMPTY 0x00 /* request is empty */
59 #define CQR_STATUS_FILLED 0x01 /* request is ready to be preocessed */
60 #define CQR_STATUS_QUEUED 0x02 /* request is queued to be processed */
61 #define CQR_STATUS_IN_IO 0x03 /* request is currently in IO */
62 #define CQR_STATUS_DONE 0x04 /* request is completed successfully */
63 #define CQR_STATUS_ERROR 0x05 /* request is completed with error */
64 #define CQR_STATUS_FAILED 0x06 /* request is finally failed */
65 #define CQR_STATUS_PENDING 0x07 /* request is waiting for interrupt - ERP only */
67 #define CQR_FLAGS_CHAINED 0x01 /* request is chained by another (last CCW is TIC) */
70 #define SMALLEST_SLAB (sizeof(struct ccw_req_t) <= 128 ? 128 :\
71 sizeof(struct ccw_req_t) <= 256 ? 256 : 512 )
73 /* SMALLEST_SLAB(1),... PAGE_SIZE(CCW_NUMBER_CACHES) */
74 #define CCW_NUMBER_CACHES (sizeof(struct ccw_req_t) <= 128 ? 6 :\
75 sizeof(struct ccw_req_t) <= 256 ? 5 : 4 )
77 int ccwcache_init (void);
79 ccw_req_t *ccw_alloc_request (char *magic, int cplength, int additional_data);
80 void ccw_free_request (ccw_req_t * request);
81 #endif /* __KERNEL__ */
82 #endif /* CCWCACHE_H */