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
scsi
libsas
sas_internal.h
Go to the documentation of this file.
1
/*
2
* Serial Attached SCSI (SAS) class internal header file
3
*
4
* Copyright (C) 2005 Adaptec, Inc. All rights reserved.
5
* Copyright (C) 2005 Luben Tuikov <
[email protected]
>
6
*
7
* This file is licensed under GPLv2.
8
*
9
* This program is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU General Public License as
11
* published by the Free Software Foundation; either version 2 of the
12
* License, or (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful, but
15
* WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22
* USA
23
*
24
*/
25
26
#ifndef _SAS_INTERNAL_H_
27
#define _SAS_INTERNAL_H_
28
29
#include <scsi/scsi.h>
30
#include <
scsi/scsi_host.h
>
31
#include <
scsi/scsi_transport_sas.h
>
32
#include <
scsi/libsas.h
>
33
#include <
scsi/sas_ata.h
>
34
35
#define sas_printk(fmt, ...) printk(KERN_NOTICE "sas: " fmt, ## __VA_ARGS__)
36
37
#define SAS_DPRINTK(fmt, ...) printk(KERN_DEBUG "sas: " fmt, ## __VA_ARGS__)
38
39
#define TO_SAS_TASK(_scsi_cmd) ((void *)(_scsi_cmd)->host_scribble)
40
#define ASSIGN_SAS_TASK(_sc, _t) do { (_sc)->host_scribble = (void *) _t; } while (0)
41
42
struct
sas_phy_data
{
43
/* let reset be performed in sas_queue_work() context */
44
struct
sas_phy
*
phy
;
45
struct
mutex
event_lock
;
46
int
hard_reset
;
47
int
reset_result
;
48
struct
sas_work
reset_work
;
49
int
enable
;
50
int
enable_result
;
51
struct
sas_work
enable_work
;
52
};
53
54
void
sas_scsi_recover_host
(
struct
Scsi_Host
*
shost
);
55
56
int
sas_show_class
(
enum
sas_class
class
,
char
*
buf
);
57
int
sas_show_proto
(
enum
sas_protocol
proto
,
char
*
buf
);
58
int
sas_show_linkrate
(
enum
sas_linkrate
linkrate,
char
*
buf
);
59
int
sas_show_oob_mode
(
enum
sas_oob_mode
oob_mode,
char
*
buf
);
60
61
int
sas_register_phys
(
struct
sas_ha_struct
*sas_ha);
62
void
sas_unregister_phys
(
struct
sas_ha_struct
*sas_ha);
63
64
int
sas_register_ports
(
struct
sas_ha_struct
*sas_ha);
65
void
sas_unregister_ports
(
struct
sas_ha_struct
*sas_ha);
66
67
enum
blk_eh_timer_return
sas_scsi_timed_out
(
struct
scsi_cmnd
*);
68
69
int
sas_init_queue
(
struct
sas_ha_struct
*sas_ha);
70
int
sas_init_events
(
struct
sas_ha_struct
*sas_ha);
71
void
sas_shutdown_queue
(
struct
sas_ha_struct
*sas_ha);
72
void
sas_disable_revalidation
(
struct
sas_ha_struct
*ha);
73
void
sas_enable_revalidation
(
struct
sas_ha_struct
*ha);
74
void
__sas_drain_work
(
struct
sas_ha_struct
*ha);
75
76
void
sas_deform_port
(
struct
asd_sas_phy
*
phy
,
int
gone);
77
78
void
sas_porte_bytes_dmaed
(
struct
work_struct
*
work
);
79
void
sas_porte_broadcast_rcvd
(
struct
work_struct
*
work
);
80
void
sas_porte_link_reset_err
(
struct
work_struct
*
work
);
81
void
sas_porte_timer_event
(
struct
work_struct
*
work
);
82
void
sas_porte_hard_reset
(
struct
work_struct
*
work
);
83
void
sas_queue_work
(
struct
sas_ha_struct
*ha,
struct
sas_work
*
sw
);
84
85
int
sas_notify_lldd_dev_found
(
struct
domain_device
*);
86
void
sas_notify_lldd_dev_gone
(
struct
domain_device
*);
87
88
int
sas_smp_phy_control
(
struct
domain_device
*
dev
,
int
phy_id
,
89
enum
phy_func
phy_func
,
struct
sas_phy_linkrates
*);
90
int
sas_smp_get_phy_events
(
struct
sas_phy
*
phy
);
91
92
void
sas_notify_phy_event
(
struct
asd_sas_phy
*
phy
,
enum
phy_event
event
);
93
void
sas_device_set_phy
(
struct
domain_device
*
dev
,
struct
sas_port
*
port
);
94
struct
domain_device
*
sas_find_dev_by_rphy
(
struct
sas_rphy
*
rphy
);
95
struct
domain_device
*
sas_ex_to_ata
(
struct
domain_device
*
ex_dev
,
int
phy_id
);
96
int
sas_ex_phy_discover
(
struct
domain_device
*
dev
,
int
single);
97
int
sas_get_report_phy_sata
(
struct
domain_device
*
dev
,
int
phy_id
,
98
struct
smp_resp
*rps_resp);
99
int
sas_try_ata_reset
(
struct
asd_sas_phy
*
phy
);
100
void
sas_hae_reset
(
struct
work_struct
*
work
);
101
102
void
sas_free_device
(
struct
kref
*
kref
);
103
104
#ifdef CONFIG_SCSI_SAS_HOST_SMP
105
extern
int
sas_smp_host_handler
(
struct
Scsi_Host
*
shost
,
struct
request
*
req
,
106
struct
request
*
rsp
);
107
#else
108
static
inline
int
sas_smp_host_handler
(
struct
Scsi_Host
*
shost
,
109
struct
request
*
req
,
110
struct
request
*
rsp
)
111
{
112
shost_printk
(
KERN_ERR
, shost,
113
"Cannot send SMP to a sas host (not enabled in CONFIG)\n"
);
114
return
-
EINVAL
;
115
}
116
#endif
117
118
static
inline
void
sas_fail_probe(
struct
domain_device
*
dev
,
const
char
*
func
,
int
err
)
119
{
120
SAS_DPRINTK
(
"%s: for %s device %16llx returned %d\n"
,
121
func, dev->
parent
?
"exp-attached"
:
122
"direct-attached"
,
123
SAS_ADDR
(dev->
sas_addr
), err);
124
sas_unregister_dev
(dev->
port
, dev);
125
}
126
127
static
inline
void
sas_fill_in_rphy(
struct
domain_device
*dev,
128
struct
sas_rphy
*
rphy
)
129
{
130
rphy->
identify
.sas_address =
SAS_ADDR
(dev->
sas_addr
);
131
rphy->
identify
.initiator_port_protocols = dev->
iproto
;
132
rphy->
identify
.target_port_protocols = dev->
tproto
;
133
switch
(dev->
dev_type
) {
134
case
SATA_DEV
:
135
/* FIXME: need sata device type */
136
case
SAS_END_DEV
:
137
case
SATA_PENDING
:
138
rphy->
identify
.device_type =
SAS_END_DEVICE
;
139
break
;
140
case
EDGE_DEV
:
141
rphy->
identify
.device_type =
SAS_EDGE_EXPANDER_DEVICE
;
142
break
;
143
case
FANOUT_DEV
:
144
rphy->
identify
.device_type =
SAS_FANOUT_EXPANDER_DEVICE
;
145
break
;
146
default
:
147
rphy->
identify
.device_type =
SAS_PHY_UNUSED
;
148
break
;
149
}
150
}
151
152
static
inline
void
sas_phy_set_target(
struct
asd_sas_phy
*
p
,
struct
domain_device
*dev)
153
{
154
struct
sas_phy
*
phy
= p->
phy
;
155
156
if
(dev) {
157
if
(dev_is_sata(dev))
158
phy->
identify
.device_type =
SAS_END_DEVICE
;
159
else
160
phy->
identify
.device_type = dev->
dev_type
;
161
phy->
identify
.target_port_protocols = dev->
tproto
;
162
}
else
{
163
phy->
identify
.device_type =
SAS_PHY_UNUSED
;
164
phy->
identify
.target_port_protocols = 0;
165
}
166
}
167
168
static
inline
void
sas_add_parent_port(
struct
domain_device
*dev,
int
phy_id
)
169
{
170
struct
expander_device
*ex = &dev->
ex_dev
;
171
struct
ex_phy
*
ex_phy
= &ex->
ex_phy
[
phy_id
];
172
173
if
(!ex->
parent_port
) {
174
ex->
parent_port
=
sas_port_alloc
(&dev->
rphy
->dev, phy_id);
175
/* FIXME: error handling */
176
BUG_ON
(!ex->
parent_port
);
177
BUG_ON
(
sas_port_add
(ex->
parent_port
));
178
sas_port_mark_backlink
(ex->
parent_port
);
179
}
180
sas_port_add_phy
(ex->
parent_port
, ex_phy->
phy
);
181
}
182
183
static
inline
struct
domain_device
*sas_alloc_device(
void
)
184
{
185
struct
domain_device
*dev = kzalloc(
sizeof
(*dev),
GFP_KERNEL
);
186
187
if
(dev) {
188
INIT_LIST_HEAD(&dev->
siblings
);
189
INIT_LIST_HEAD(&dev->
dev_list_node
);
190
INIT_LIST_HEAD(&dev->
disco_list_node
);
191
kref_init(&dev->
kref
);
192
spin_lock_init
(&dev->
done_lock
);
193
}
194
return
dev
;
195
}
196
197
static
inline
void
sas_put_device(
struct
domain_device
*dev)
198
{
199
kref_put(&dev->
kref
,
sas_free_device
);
200
}
201
202
#endif
/* _SAS_INTERNAL_H_ */
Generated on Thu Jan 10 2013 14:21:36 for Linux Kernel by
1.8.2