Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
s390
cio
device.h
Go to the documentation of this file.
1
#ifndef S390_DEVICE_H
2
#define S390_DEVICE_H
3
4
#include <
asm/ccwdev.h
>
5
#include <
linux/atomic.h
>
6
#include <linux/wait.h>
7
#include <
linux/notifier.h
>
8
#include <
linux/kernel_stat.h
>
9
#include "
io_sch.h
"
10
11
/*
12
* states of the device statemachine
13
*/
14
enum
dev_state
{
15
DEV_STATE_NOT_OPER
,
16
DEV_STATE_SENSE_PGID
,
17
DEV_STATE_SENSE_ID
,
18
DEV_STATE_OFFLINE
,
19
DEV_STATE_VERIFY
,
20
DEV_STATE_ONLINE
,
21
DEV_STATE_W4SENSE
,
22
DEV_STATE_DISBAND_PGID
,
23
DEV_STATE_BOXED
,
24
/* states to wait for i/o completion before doing something */
25
DEV_STATE_TIMEOUT_KILL
,
26
DEV_STATE_QUIESCE
,
27
/* special states for devices gone not operational */
28
DEV_STATE_DISCONNECTED
,
29
DEV_STATE_DISCONNECTED_SENSE_ID
,
30
DEV_STATE_CMFCHANGE
,
31
DEV_STATE_CMFUPDATE
,
32
DEV_STATE_STEAL_LOCK
,
33
/* last element! */
34
NR_DEV_STATES
35
};
36
37
/*
38
* asynchronous events of the device statemachine
39
*/
40
enum
dev_event
{
41
DEV_EVENT_NOTOPER
,
42
DEV_EVENT_INTERRUPT
,
43
DEV_EVENT_TIMEOUT
,
44
DEV_EVENT_VERIFY
,
45
/* last element! */
46
NR_DEV_EVENTS
47
};
48
49
struct
ccw_device
;
50
51
/*
52
* action called through jumptable
53
*/
54
typedef
void
(
fsm_func_t
)(
struct
ccw_device
*,
enum
dev_event
);
55
extern
fsm_func_t
*
dev_jumptable
[
NR_DEV_STATES
][
NR_DEV_EVENTS
];
56
57
static
inline
void
58
dev_fsm_event(
struct
ccw_device
*
cdev
,
enum
dev_event
dev_event
)
59
{
60
int
state
= cdev->
private
->state;
61
62
if
(dev_event ==
DEV_EVENT_INTERRUPT
) {
63
if
(state ==
DEV_STATE_ONLINE
)
64
kstat_cpu
(
smp_processor_id
()).
65
irqs[cdev->
private
->int_class]++;
66
else
if
(state !=
DEV_STATE_CMFCHANGE
&&
67
state !=
DEV_STATE_CMFUPDATE
)
68
kstat_cpu
(
smp_processor_id
()).irqs[
IOINT_CIO
]++;
69
}
70
dev_jumptable
[
state
][
dev_event
](
cdev
,
dev_event
);
71
}
72
73
/*
74
* Delivers 1 if the device state is final.
75
*/
76
static
inline
int
77
dev_fsm_final_state(
struct
ccw_device
*
cdev
)
78
{
79
return
(cdev->
private
->state ==
DEV_STATE_NOT_OPER
||
80
cdev->
private
->state ==
DEV_STATE_OFFLINE
||
81
cdev->
private
->state ==
DEV_STATE_ONLINE
||
82
cdev->
private
->state ==
DEV_STATE_BOXED
);
83
}
84
85
extern
wait_queue_head_t
ccw_device_init_wq
;
86
extern
atomic_t
ccw_device_init_count
;
87
int
__init
io_subchannel_init
(
void
);
88
89
void
io_subchannel_recog_done
(
struct
ccw_device
*cdev);
90
void
io_subchannel_init_config
(
struct
subchannel
*
sch
);
91
92
int
ccw_device_cancel_halt_clear
(
struct
ccw_device
*);
93
94
int
ccw_device_is_orphan
(
struct
ccw_device
*);
95
96
void
ccw_device_recognition
(
struct
ccw_device
*);
97
int
ccw_device_online
(
struct
ccw_device
*);
98
int
ccw_device_offline
(
struct
ccw_device
*);
99
void
ccw_device_update_sense_data
(
struct
ccw_device
*);
100
int
ccw_device_test_sense_data
(
struct
ccw_device
*);
101
void
ccw_device_schedule_sch_unregister
(
struct
ccw_device
*);
102
int
ccw_purge_blacklisted
(
void
);
103
void
ccw_device_sched_todo
(
struct
ccw_device
*cdev,
enum
cdev_todo
todo
);
104
struct
ccw_device
*
get_ccwdev_by_dev_id
(
struct
ccw_dev_id
*
dev_id
);
105
106
/* Function prototypes for device status and basic sense stuff. */
107
void
ccw_device_accumulate_irb
(
struct
ccw_device
*,
struct
irb
*);
108
void
ccw_device_accumulate_basic_sense
(
struct
ccw_device
*,
struct
irb
*);
109
int
ccw_device_accumulate_and_sense
(
struct
ccw_device
*,
struct
irb
*);
110
int
ccw_device_do_sense
(
struct
ccw_device
*,
struct
irb
*);
111
112
/* Function prototype for internal request handling. */
113
int
lpm_adjust
(
int
lpm
,
int
mask
);
114
void
ccw_request_start
(
struct
ccw_device
*);
115
int
ccw_request_cancel
(
struct
ccw_device
*cdev);
116
void
ccw_request_handler
(
struct
ccw_device
*cdev);
117
void
ccw_request_timeout
(
struct
ccw_device
*cdev);
118
void
ccw_request_notoper
(
struct
ccw_device
*cdev);
119
120
/* Function prototypes for sense id stuff. */
121
void
ccw_device_sense_id_start
(
struct
ccw_device
*);
122
void
ccw_device_sense_id_done
(
struct
ccw_device
*,
int
);
123
124
/* Function prototypes for path grouping stuff. */
125
void
ccw_device_verify_start
(
struct
ccw_device
*);
126
void
ccw_device_verify_done
(
struct
ccw_device
*,
int
);
127
128
void
ccw_device_disband_start
(
struct
ccw_device
*);
129
void
ccw_device_disband_done
(
struct
ccw_device
*,
int
);
130
131
void
ccw_device_stlck_start
(
struct
ccw_device
*,
void
*,
void
*,
void
*);
132
void
ccw_device_stlck_done
(
struct
ccw_device
*,
void
*,
int
);
133
134
int
ccw_device_call_handler
(
struct
ccw_device
*);
135
136
int
ccw_device_stlck
(
struct
ccw_device
*);
137
138
/* Helper function for machine check handling. */
139
void
ccw_device_trigger_reprobe
(
struct
ccw_device
*);
140
void
ccw_device_kill_io
(
struct
ccw_device
*);
141
int
ccw_device_notify
(
struct
ccw_device
*,
int
);
142
void
ccw_device_set_disconnected
(
struct
ccw_device
*cdev);
143
void
ccw_device_set_notoper
(
struct
ccw_device
*cdev);
144
145
/* qdio needs this. */
146
void
ccw_device_set_timeout
(
struct
ccw_device
*,
int
);
147
extern
struct
subchannel_id
ccw_device_get_subchannel_id
(
struct
ccw_device
*);
148
149
/* Channel measurement facility related */
150
void
retry_set_schib
(
struct
ccw_device
*cdev);
151
void
cmf_retry_copy_block
(
struct
ccw_device
*);
152
int
cmf_reenable
(
struct
ccw_device
*);
153
int
ccw_set_cmf
(
struct
ccw_device
*cdev,
int
enable
);
154
extern
struct
device_attribute
dev_attr_cmb_enable
;
155
#endif
Generated on Thu Jan 10 2013 12:49:21 for Linux Kernel by
1.8.2