1 |
1275 |
phoenix |
/*
|
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.1.1.1 $
|
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 |
|
|
|