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
include
scsi
scsi_transport_sas.h
Go to the documentation of this file.
1
#ifndef SCSI_TRANSPORT_SAS_H
2
#define SCSI_TRANSPORT_SAS_H
3
4
#include <
linux/transport_class.h
>
5
#include <linux/types.h>
6
#include <
linux/mutex.h
>
7
#include <
scsi/sas.h
>
8
9
struct
scsi_transport_template
;
10
struct
sas_rphy
;
11
struct
request
;
12
13
enum
sas_device_type
{
14
SAS_PHY_UNUSED
= 0,
15
SAS_END_DEVICE
= 1,
16
SAS_EDGE_EXPANDER_DEVICE
= 2,
17
SAS_FANOUT_EXPANDER_DEVICE
= 3,
18
};
19
20
static
inline
int
sas_protocol_ata(
enum
sas_protocol
proto
)
21
{
22
return
((proto &
SAS_PROTOCOL_SATA
) ||
23
(proto &
SAS_PROTOCOL_STP
))? 1 : 0;
24
}
25
26
enum
sas_linkrate
{
27
/* These Values are defined in the SAS standard */
28
SAS_LINK_RATE_UNKNOWN
= 0,
29
SAS_PHY_DISABLED
= 1,
30
SAS_PHY_RESET_PROBLEM
= 2,
31
SAS_SATA_SPINUP_HOLD
= 3,
32
SAS_SATA_PORT_SELECTOR
= 4,
33
SAS_PHY_RESET_IN_PROGRESS
= 5,
34
SAS_LINK_RATE_1_5_GBPS
= 8,
35
SAS_LINK_RATE_G1
=
SAS_LINK_RATE_1_5_GBPS
,
36
SAS_LINK_RATE_3_0_GBPS
= 9,
37
SAS_LINK_RATE_G2
=
SAS_LINK_RATE_3_0_GBPS
,
38
SAS_LINK_RATE_6_0_GBPS
= 10,
39
/* These are virtual to the transport class and may never
40
* be signalled normally since the standard defined field
41
* is only 4 bits */
42
SAS_LINK_RATE_FAILED
= 0x10,
43
SAS_PHY_VIRTUAL
= 0x11,
44
};
45
46
struct
sas_identify
{
47
enum
sas_device_type
device_type
;
48
enum
sas_protocol
initiator_port_protocols
;
49
enum
sas_protocol
target_port_protocols
;
50
u64
sas_address
;
51
u8
phy_identifier
;
52
};
53
54
struct
sas_phy
{
55
struct
device
dev
;
56
int
number
;
57
int
enabled
;
58
59
/* phy identification */
60
struct
sas_identify
identify
;
61
62
/* phy attributes */
63
enum
sas_linkrate
negotiated_linkrate
;
64
enum
sas_linkrate
minimum_linkrate_hw
;
65
enum
sas_linkrate
minimum_linkrate
;
66
enum
sas_linkrate
maximum_linkrate_hw
;
67
enum
sas_linkrate
maximum_linkrate
;
68
69
/* link error statistics */
70
u32
invalid_dword_count
;
71
u32
running_disparity_error_count
;
72
u32
loss_of_dword_sync_count
;
73
u32
phy_reset_problem_count
;
74
75
/* for the list of phys belonging to a port */
76
struct
list_head
port_siblings
;
77
78
/* available to the lldd */
79
void
*
hostdata
;
80
};
81
82
#define dev_to_phy(d) \
83
container_of((d), struct sas_phy, dev)
84
#define transport_class_to_phy(dev) \
85
dev_to_phy((dev)->parent)
86
#define phy_to_shost(phy) \
87
dev_to_shost((phy)->dev.parent)
88
89
struct
request_queue
;
90
struct
sas_rphy
{
91
struct
device
dev
;
92
struct
sas_identify
identify
;
93
struct
list_head
list
;
94
struct
request_queue
*
q
;
95
u32
scsi_target_id
;
96
};
97
98
#define dev_to_rphy(d) \
99
container_of((d), struct sas_rphy, dev)
100
#define transport_class_to_rphy(dev) \
101
dev_to_rphy((dev)->parent)
102
#define rphy_to_shost(rphy) \
103
dev_to_shost((rphy)->dev.parent)
104
#define target_to_rphy(targ) \
105
dev_to_rphy((targ)->dev.parent)
106
107
struct
sas_end_device
{
108
struct
sas_rphy
rphy
;
109
/* flags */
110
unsigned
ready_led_meaning
:1;
111
unsigned
tlr_supported
:1;
112
unsigned
tlr_enabled
:1;
113
/* parameters */
114
u16
I_T_nexus_loss_timeout
;
115
u16
initiator_response_timeout
;
116
};
117
#define rphy_to_end_device(r) \
118
container_of((r), struct sas_end_device, rphy)
119
120
struct
sas_expander_device
{
121
int
level
;
122
int
next_port_id
;
123
124
#define SAS_EXPANDER_VENDOR_ID_LEN 8
125
char
vendor_id
[
SAS_EXPANDER_VENDOR_ID_LEN
+1];
126
#define SAS_EXPANDER_PRODUCT_ID_LEN 16
127
char
product_id
[
SAS_EXPANDER_PRODUCT_ID_LEN
+1];
128
#define SAS_EXPANDER_PRODUCT_REV_LEN 4
129
char
product_rev
[
SAS_EXPANDER_PRODUCT_REV_LEN
+1];
130
#define SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN 8
131
char
component_vendor_id
[
SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN
+1];
132
u16
component_id
;
133
u8
component_revision_id
;
134
135
struct
sas_rphy
rphy
;
136
137
};
138
#define rphy_to_expander_device(r) \
139
container_of((r), struct sas_expander_device, rphy)
140
141
struct
sas_port
{
142
struct
device
dev
;
143
144
int
port_identifier
;
145
int
num_phys
;
146
/* port flags */
147
unsigned
int
is_backlink
:1;
148
149
/* the other end of the link */
150
struct
sas_rphy
*
rphy
;
151
152
struct
mutex
phy_list_mutex
;
153
struct
list_head
phy_list
;
154
};
155
156
#define dev_to_sas_port(d) \
157
container_of((d), struct sas_port, dev)
158
#define transport_class_to_sas_port(dev) \
159
dev_to_sas_port((dev)->parent)
160
161
struct
sas_phy_linkrates
{
162
enum
sas_linkrate
maximum_linkrate
;
163
enum
sas_linkrate
minimum_linkrate
;
164
};
165
166
/* The functions by which the transport class and the driver communicate */
167
struct
sas_function_template
{
168
int
(*
get_linkerrors
)(
struct
sas_phy
*);
169
int
(*
get_enclosure_identifier
)(
struct
sas_rphy
*,
u64
*);
170
int
(*
get_bay_identifier
)(
struct
sas_rphy
*);
171
int
(*
phy_reset
)(
struct
sas_phy
*,
int
);
172
int
(*
phy_enable
)(
struct
sas_phy
*,
int
);
173
int
(*
phy_setup
)(
struct
sas_phy
*);
174
void
(*
phy_release
)(
struct
sas_phy
*);
175
int
(*
set_phy_speed
)(
struct
sas_phy
*,
struct
sas_phy_linkrates
*);
176
int
(*
smp_handler
)(
struct
Scsi_Host
*,
struct
sas_rphy
*,
struct
request
*);
177
};
178
179
180
void
sas_remove_children
(
struct
device
*);
181
extern
void
sas_remove_host
(
struct
Scsi_Host
*);
182
183
extern
struct
sas_phy
*
sas_phy_alloc
(
struct
device
*,
int
);
184
extern
void
sas_phy_free
(
struct
sas_phy
*);
185
extern
int
sas_phy_add
(
struct
sas_phy
*);
186
extern
void
sas_phy_delete
(
struct
sas_phy
*);
187
extern
int
scsi_is_sas_phy
(
const
struct
device
*);
188
189
unsigned
int
sas_tlr_supported
(
struct
scsi_device
*);
190
unsigned
int
sas_is_tlr_enabled
(
struct
scsi_device
*);
191
void
sas_disable_tlr
(
struct
scsi_device
*);
192
void
sas_enable_tlr
(
struct
scsi_device
*);
193
194
extern
struct
sas_rphy
*
sas_end_device_alloc
(
struct
sas_port
*);
195
extern
struct
sas_rphy
*
sas_expander_alloc
(
struct
sas_port
*,
enum
sas_device_type
);
196
void
sas_rphy_free
(
struct
sas_rphy
*);
197
extern
int
sas_rphy_add
(
struct
sas_rphy
*);
198
extern
void
sas_rphy_remove
(
struct
sas_rphy
*);
199
extern
void
sas_rphy_delete
(
struct
sas_rphy
*);
200
extern
void
sas_rphy_unlink
(
struct
sas_rphy
*);
201
extern
int
scsi_is_sas_rphy
(
const
struct
device
*);
202
203
struct
sas_port
*
sas_port_alloc
(
struct
device
*,
int
);
204
struct
sas_port
*
sas_port_alloc_num
(
struct
device
*);
205
int
sas_port_add
(
struct
sas_port
*);
206
void
sas_port_free
(
struct
sas_port
*);
207
void
sas_port_delete
(
struct
sas_port
*);
208
void
sas_port_add_phy
(
struct
sas_port
*,
struct
sas_phy
*);
209
void
sas_port_delete_phy
(
struct
sas_port
*,
struct
sas_phy
*);
210
void
sas_port_mark_backlink
(
struct
sas_port
*);
211
int
scsi_is_sas_port
(
const
struct
device
*);
212
struct
sas_phy
*
sas_port_get_phy
(
struct
sas_port
*
port
);
213
static
inline
void
sas_port_put_phy(
struct
sas_phy
*
phy
)
214
{
215
if
(phy)
216
put_device
(&phy->
dev
);
217
}
218
219
extern
struct
scsi_transport_template
*
220
sas_attach_transport
(
struct
sas_function_template
*);
221
extern
void
sas_release_transport
(
struct
scsi_transport_template
*);
222
int
sas_read_port_mode_page
(
struct
scsi_device
*);
223
224
static
inline
int
225
scsi_is_sas_expander_device(
struct
device
*
dev
)
226
{
227
struct
sas_rphy
*rphy;
228
if
(!
scsi_is_sas_rphy
(dev))
229
return
0;
230
rphy =
dev_to_rphy
(dev);
231
return
rphy->
identify
.device_type ==
SAS_FANOUT_EXPANDER_DEVICE
||
232
rphy->
identify
.device_type ==
SAS_EDGE_EXPANDER_DEVICE
;
233
}
234
235
#define scsi_is_sas_phy_local(phy) scsi_is_host_device((phy)->dev.parent)
236
237
#endif
/* SCSI_TRANSPORT_SAS_H */
Generated on Thu Jan 10 2013 14:53:29 for Linux Kernel by
1.8.2