1 /* 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 6 * 7 * $Revision: 1.9 $ 8 * 9 */ 10 #ifndef CCWCACHE_H 11 #define CCWCACHE_H 12 #include <linux/slab.h> 13 #include <asm/irq.h> 14 15 #ifndef __KERNEL__ 16 #define kmem_cache_t void 17 #endif /* __KERNEL__ */ 18 19 typedef struct ccw_req_t { 20 /* eye catcher plus queueing information */ 21 unsigned int magic; 22 struct ccw_req_t *next; /* pointer to next ccw_req_t in queue */ 23 struct ccw_req_t *int_next; /* for internal queueing */ 24 struct ccw_req_t *int_prev; /* for internal queueing */ 25 26 /* Where to execute what... */ 27 void *device; /* index of the device the req is for */ 28 void *req; /* pointer to originating request */ 29 ccw1_t *cpaddr; /* address of channel program */ 30 char status; /* reflecting the status of this request */ 31 char flags; /* see below */ 32 short retries; /* A retry counter to be set when filling */ 33 34 /* ... and how */ 35 int options; /* options for execution */ 36 char lpm; /* logical path mask */ 37 void *data; /* pointer to data area */ 38 devstat_t *dstat; /* The device status in case of an error */ 39 40 /* these are important for recovering erroneous requests */ 41 struct ccw_req_t *refers; /* Does this request refer to another one? */ 42 void *function; /* refers to the originating ERP action */ ; 43 44 unsigned long long expires; /* expiration period */ 45 /* these are for profiling purposes */ 46 unsigned long long buildclk; /* TOD-clock of request generation */ 47 unsigned long long startclk; /* TOD-clock of request start */ 48 unsigned long long stopclk; /* TOD-clock of request interrupt */ 49 unsigned long long endclk; /* TOD-clock of request termination */ 50 51 /* these are for internal use */ 52 int cplength; /* length of the channel program in CCWs */ 53 int datasize; /* amount of additional data in bytes */ 54 void *lowmem_idal; /* lowmem page for idals (if in use) */ 55 void *lowmem_idal_ptr; /* ptr to the actual idal word in the idals page */ 56 kmem_cache_t *cache; /* the cache this data comes from */ 57 58 } __attribute__ ((aligned(4))) ccw_req_t; 59 60 /* 61 * ccw_req_t -> status can be: 62 */ 63 #define CQR_STATUS_EMPTY 0x00 /* cqr is empty */ 64 #define CQR_STATUS_FILLED 0x01 /* cqr is ready to be preocessed */ 65 #define CQR_STATUS_QUEUED 0x02 /* cqr is queued to be processed */ 66 #define CQR_STATUS_IN_IO 0x03 /* cqr is currently in IO */ 67 #define CQR_STATUS_DONE 0x04 /* cqr is completed successfully */ 68 #define CQR_STATUS_ERROR 0x05 /* cqr is completed with error */ 69 #define CQR_STATUS_FAILED 0x06 /* cqr is finally failed */ 70 71 #define CQR_FLAGS_CHAINED 0x01 /* cqr is chained by another (last CCW is TIC) */ 72 #define CQR_FLAGS_FINALIZED 0x02 73 #define CQR_FLAGS_LM_CQR 0x04 /* cqr uses page from lowmem_pool */ 74 #define CQR_FLAGS_LM_IDAL 0x08 /* IDALs uses page from lowmem_pool */ 75 76 #ifdef __KERNEL__ 77 #define SMALLEST_SLAB (sizeof(struct ccw_req_t) <= 128 ? 128 :\ 78 sizeof(struct ccw_req_t) <= 256 ? 256 : 512 ) 79 80 /* SMALLEST_SLAB(1),... PAGE_SIZE(CCW_NUMBER_CACHES) */ 81 #define CCW_NUMBER_CACHES (sizeof(struct ccw_req_t) <= 128 ? 6 :\ 82 sizeof(struct ccw_req_t) <= 256 ? 5 : 4 ) 83 84 int ccwcache_init (void); 85 86 ccw_req_t *ccw_alloc_request (char *magic, int cplength, int additional_data); 87 void ccw_free_request (ccw_req_t * request); 88 #endif /* __KERNEL__ */ 89 #endif /* CCWCACHE_H */ 90 91 92 93