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_device.h
Go to the documentation of this file.
1
#ifndef _SCSI_SCSI_DEVICE_H
2
#define _SCSI_SCSI_DEVICE_H
3
4
#include <linux/list.h>
5
#include <
linux/spinlock.h
>
6
#include <
linux/workqueue.h
>
7
#include <
linux/blkdev.h
>
8
#include <scsi/scsi.h>
9
#include <
linux/atomic.h
>
10
11
struct
device
;
12
struct
request_queue
;
13
struct
scsi_cmnd
;
14
struct
scsi_lun
;
15
struct
scsi_sense_hdr
;
16
17
struct
scsi_mode_data
{
18
__u32
length
;
19
__u16
block_descriptor_length
;
20
__u8
medium_type
;
21
__u8
device_specific
;
22
__u8
header_length
;
23
__u8
longlba
:1;
24
};
25
26
/*
27
* sdev state: If you alter this, you also need to alter scsi_sysfs.c
28
* (for the ascii descriptions) and the state model enforcer:
29
* scsi_lib:scsi_device_set_state().
30
*/
31
enum
scsi_device_state
{
32
SDEV_CREATED
= 1,
/* device created but not added to sysfs
33
* Only internal commands allowed (for inq) */
34
SDEV_RUNNING
,
/* device properly configured
35
* All commands allowed */
36
SDEV_CANCEL
,
/* beginning to delete device
37
* Only error handler commands allowed */
38
SDEV_DEL
,
/* device deleted
39
* no commands allowed */
40
SDEV_QUIESCE
,
/* Device quiescent. No block commands
41
* will be accepted, only specials (which
42
* originate in the mid-layer) */
43
SDEV_OFFLINE
,
/* Device offlined (by error handling or
44
* user request */
45
SDEV_TRANSPORT_OFFLINE
,
/* Offlined by transport class error handler */
46
SDEV_BLOCK
,
/* Device blocked by scsi lld. No
47
* scsi commands from user or midlayer
48
* should be issued to the scsi
49
* lld. */
50
SDEV_CREATED_BLOCK
,
/* same as above but for created devices */
51
};
52
53
enum
scsi_device_event
{
54
SDEV_EVT_MEDIA_CHANGE
= 1,
/* media has changed */
55
56
SDEV_EVT_LAST
=
SDEV_EVT_MEDIA_CHANGE
,
57
SDEV_EVT_MAXBITS
=
SDEV_EVT_LAST
+ 1
58
};
59
60
struct
scsi_event
{
61
enum
scsi_device_event
evt_type
;
62
struct
list_head
node
;
63
64
/* put union of data structures, for non-simple event types,
65
* here
66
*/
67
};
68
69
struct
scsi_device
{
70
struct
Scsi_Host
*
host
;
71
struct
request_queue
*
request_queue
;
72
73
/* the next two are protected by the host->host_lock */
74
struct
list_head
siblings
;
/* list of all devices on this host */
75
struct
list_head
same_target_siblings
;
/* just the devices sharing same target id */
76
77
/* this is now protected by the request_queue->queue_lock */
78
unsigned
int
device_busy
;
/* commands actually active on
79
* low-level. protected by queue_lock. */
80
spinlock_t
list_lock
;
81
struct
list_head
cmd_list
;
/* queue of in use SCSI Command structures */
82
struct
list_head
starved_entry
;
83
struct
scsi_cmnd
*
current_cmnd
;
/* currently active command */
84
unsigned
short
queue_depth
;
/* How deep of a queue we want */
85
unsigned
short
max_queue_depth
;
/* max queue depth */
86
unsigned
short
last_queue_full_depth
;
/* These two are used by */
87
unsigned
short
last_queue_full_count
;
/* scsi_track_queue_full() */
88
unsigned
long
last_queue_full_time
;
/* last queue full time */
89
unsigned
long
queue_ramp_up_period
;
/* ramp up period in jiffies */
90
#define SCSI_DEFAULT_RAMP_UP_PERIOD (120 * HZ)
91
92
unsigned
long
last_queue_ramp_up
;
/* last queue ramp up time */
93
94
unsigned
int
id
,
lun
,
channel
;
95
96
unsigned
int
manufacturer
;
/* Manufacturer of device, for using
97
* vendor-specific cmd's */
98
unsigned
sector_size
;
/* size in bytes */
99
100
void
*
hostdata
;
/* available to low-level driver */
101
char
type
;
102
char
scsi_level
;
103
char
inq_periph_qual
;
/* PQ from INQUIRY data */
104
unsigned
char
inquiry_len
;
/* valid bytes in 'inquiry' */
105
unsigned
char
*
inquiry
;
/* INQUIRY response data */
106
const
char
*
vendor
;
/* [back_compat] point into 'inquiry' ... */
107
const
char
*
model
;
/* ... after scan; point to static string */
108
const
char
*
rev
;
/* ... "nullnullnullnull" before scan */
109
unsigned
char
current_tag
;
/* current tag */
110
struct
scsi_target
*
sdev_target
;
/* used only for single_lun */
111
112
unsigned
int
sdev_bflags
;
/* black/white flags as also found in
113
* scsi_devinfo.[hc]. For now used only to
114
* pass settings from slave_alloc to scsi
115
* core. */
116
unsigned
writeable
:1;
117
unsigned
removable
:1;
118
unsigned
changed
:1;
/* Data invalid due to media change */
119
unsigned
busy
:1;
/* Used to prevent races */
120
unsigned
lockable
:1;
/* Able to prevent media removal */
121
unsigned
locked
:1;
/* Media removal disabled */
122
unsigned
borken
:1;
/* Tell the Seagate driver to be
123
* painfully slow on this device */
124
unsigned
disconnect
:1;
/* can disconnect */
125
unsigned
soft_reset
:1;
/* Uses soft reset option */
126
unsigned
sdtr
:1;
/* Device supports SDTR messages */
127
unsigned
wdtr
:1;
/* Device supports WDTR messages */
128
unsigned
ppr
:1;
/* Device supports PPR messages */
129
unsigned
tagged_supported
:1;
/* Supports SCSI-II tagged queuing */
130
unsigned
simple_tags
:1;
/* simple queue tag messages are enabled */
131
unsigned
ordered_tags
:1;
/* ordered queue tag messages are enabled */
132
unsigned
was_reset
:1;
/* There was a bus reset on the bus for
133
* this device */
134
unsigned
expecting_cc_ua
:1;
/* Expecting a CHECK_CONDITION/UNIT_ATTN
135
* because we did a bus reset. */
136
unsigned
use_10_for_rw
:1;
/* first try 10-byte read / write */
137
unsigned
use_10_for_ms
:1;
/* first try 10-byte mode sense/select */
138
unsigned
no_report_opcodes
:1;
/* no REPORT SUPPORTED OPERATION CODES */
139
unsigned
no_write_same
:1;
/* no WRITE SAME command */
140
unsigned
skip_ms_page_8
:1;
/* do not use MODE SENSE page 0x08 */
141
unsigned
skip_ms_page_3f
:1;
/* do not use MODE SENSE page 0x3f */
142
unsigned
skip_vpd_pages
:1;
/* do not read VPD pages */
143
unsigned
use_192_bytes_for_3f
:1;
/* ask for 192 bytes from page 0x3f */
144
unsigned
no_start_on_add
:1;
/* do not issue start on add */
145
unsigned
allow_restart
:1;
/* issue START_UNIT in error handler */
146
unsigned
manage_start_stop
:1;
/* Let HLD (sd) manage start/stop */
147
unsigned
start_stop_pwr_cond
:1;
/* Set power cond. in START_STOP_UNIT */
148
unsigned
no_uld_attach
:1;
/* disable connecting to upper level drivers */
149
unsigned
select_no_atn
:1;
150
unsigned
fix_capacity
:1;
/* READ_CAPACITY is too high by 1 */
151
unsigned
guess_capacity
:1;
/* READ_CAPACITY might be too high by 1 */
152
unsigned
retry_hwerror
:1;
/* Retry HARDWARE_ERROR */
153
unsigned
last_sector_bug
:1;
/* do not use multisector accesses on
154
SD_LAST_BUGGY_SECTORS */
155
unsigned
no_read_disc_info
:1;
/* Avoid READ_DISC_INFO cmds */
156
unsigned
no_read_capacity_16
:1;
/* Avoid READ_CAPACITY_16 cmds */
157
unsigned
try_rc_10_first
:1;
/* Try READ_CAPACACITY_10 first */
158
unsigned
is_visible
:1;
/* is the device visible in sysfs */
159
unsigned
can_power_off
:1;
/* Device supports runtime power off */
160
unsigned
wce_default_on
:1;
/* Cache is ON by default */
161
unsigned
no_dif
:1;
/* T10 PI (DIF) should be disabled */
162
163
DECLARE_BITMAP
(supported_events,
SDEV_EVT_MAXBITS
);
/* supported events */
164
struct
list_head
event_list
;
/* asserted events */
165
struct
work_struct
event_work
;
166
167
unsigned
int
device_blocked
;
/* Device returned QUEUE_FULL. */
168
169
unsigned
int
max_device_blocked
;
/* what device_blocked counts down from */
170
#define SCSI_DEFAULT_DEVICE_BLOCKED 3
171
172
atomic_t
iorequest_cnt
;
173
atomic_t
iodone_cnt
;
174
atomic_t
ioerr_cnt
;
175
176
struct
device
sdev_gendev,
177
sdev_dev
;
178
179
struct
execute_work
ew
;
/* used to get process context on put */
180
struct
work_struct
requeue_work
;
181
182
struct
scsi_dh_data
*
scsi_dh_data
;
183
enum
scsi_device_state
sdev_state
;
184
unsigned
long
sdev_data
[0];
185
}
__attribute__
((
aligned
(
sizeof
(
unsigned
long
))));
186
187
struct
scsi_dh_devlist
{
188
char
*
vendor
;
189
char
*
model
;
190
};
191
192
typedef
void
(*
activate_complete
)(
void
*,
int
);
193
struct
scsi_device_handler
{
194
/* Used by the infrastructure */
195
struct
list_head
list
;
/* list of scsi_device_handlers */
196
197
/* Filled by the hardware handler */
198
struct
module
*
module
;
199
const
char
*
name
;
200
const
struct
scsi_dh_devlist
*
devlist
;
201
int
(*
check_sense
)(
struct
scsi_device
*,
struct
scsi_sense_hdr
*);
202
int
(*
attach
)(
struct
scsi_device
*);
203
void
(*
detach
)(
struct
scsi_device
*);
204
int
(*
activate
)(
struct
scsi_device
*,
activate_complete
,
void
*);
205
int
(*
prep_fn
)(
struct
scsi_device
*,
struct
request
*);
206
int
(*
set_params
)(
struct
scsi_device
*,
const
char
*);
207
bool
(*
match
)(
struct
scsi_device
*);
208
};
209
210
struct
scsi_dh_data
{
211
struct
scsi_device_handler
*
scsi_dh
;
212
struct
scsi_device
*
sdev
;
213
struct
kref
kref
;
214
char
buf
[0];
215
};
216
217
#define to_scsi_device(d) \
218
container_of(d, struct scsi_device, sdev_gendev)
219
#define class_to_sdev(d) \
220
container_of(d, struct scsi_device, sdev_dev)
221
#define transport_class_to_sdev(class_dev) \
222
to_scsi_device(class_dev->parent)
223
224
#define sdev_printk(prefix, sdev, fmt, a...) \
225
dev_printk(prefix, &(sdev)->sdev_gendev, fmt, ##a)
226
227
#define scmd_printk(prefix, scmd, fmt, a...) \
228
(scmd)->request->rq_disk ? \
229
sdev_printk(prefix, (scmd)->device, "[%s] " fmt, \
230
(scmd)->request->rq_disk->disk_name, ##a) : \
231
sdev_printk(prefix, (scmd)->device, fmt, ##a)
232
233
enum
scsi_target_state
{
234
STARGET_CREATED
= 1,
235
STARGET_RUNNING
,
236
STARGET_DEL
,
237
};
238
239
/*
240
* scsi_target: representation of a scsi target, for now, this is only
241
* used for single_lun devices. If no one has active IO to the target,
242
* starget_sdev_user is NULL, else it points to the active sdev.
243
*/
244
struct
scsi_target
{
245
struct
scsi_device
*
starget_sdev_user
;
246
struct
list_head
siblings
;
247
struct
list_head
devices
;
248
struct
device
dev
;
249
unsigned
int
reap_ref
;
/* protected by the host lock */
250
unsigned
int
channel
;
251
unsigned
int
id
;
/* target id ... replace
252
* scsi_device.id eventually */
253
unsigned
int
create
:1;
/* signal that it needs to be added */
254
unsigned
int
single_lun
:1;
/* Indicates we should only
255
* allow I/O to one of the luns
256
* for the device at a time. */
257
unsigned
int
pdt_1f_for_no_lun
:1;
/* PDT = 0x1f
258
* means no lun present. */
259
unsigned
int
no_report_luns
:1;
/* Don't use
260
* REPORT LUNS for scanning. */
261
/* commands actually active on LLD. protected by host lock. */
262
unsigned
int
target_busy
;
263
/*
264
* LLDs should set this in the slave_alloc host template callout.
265
* If set to zero then there is not limit.
266
*/
267
unsigned
int
can_queue
;
268
unsigned
int
target_blocked
;
269
unsigned
int
max_target_blocked
;
270
#define SCSI_DEFAULT_TARGET_BLOCKED 3
271
272
char
scsi_level
;
273
struct
execute_work
ew
;
274
enum
scsi_target_state
state
;
275
void
*
hostdata
;
/* available to low-level driver */
276
unsigned
long
starget_data
[0];
/* for the transport */
277
/* starget_data must be the last element!!!! */
278
}
__attribute__
((
aligned
(
sizeof
(
unsigned
long
))));
279
280
#define to_scsi_target(d) container_of(d, struct scsi_target, dev)
281
static
inline
struct
scsi_target
*
scsi_target
(
struct
scsi_device
*sdev)
282
{
283
return
to_scsi_target
(sdev->sdev_gendev.parent);
284
}
285
#define transport_class_to_starget(class_dev) \
286
to_scsi_target(class_dev->parent)
287
288
#define starget_printk(prefix, starget, fmt, a...) \
289
dev_printk(prefix, &(starget)->dev, fmt, ##a)
290
291
extern
struct
scsi_device
*
__scsi_add_device
(
struct
Scsi_Host
*,
292
uint
,
uint
,
uint
,
void
*
hostdata
);
293
extern
int
scsi_add_device
(
struct
Scsi_Host
*
host
,
uint
channel
,
294
uint
target
,
uint
lun
);
295
extern
int
scsi_register_device_handler
(
struct
scsi_device_handler
*scsi_dh);
296
extern
void
scsi_remove_device
(
struct
scsi_device
*);
297
extern
int
scsi_unregister_device_handler
(
struct
scsi_device_handler
*scsi_dh);
298
299
extern
int
scsi_device_get
(
struct
scsi_device
*);
300
extern
void
scsi_device_put
(
struct
scsi_device
*);
301
extern
struct
scsi_device
*
scsi_device_lookup
(
struct
Scsi_Host
*,
302
uint
,
uint
,
uint
);
303
extern
struct
scsi_device
*
__scsi_device_lookup
(
struct
Scsi_Host
*,
304
uint
,
uint
,
uint
);
305
extern
struct
scsi_device
*
scsi_device_lookup_by_target
(
struct
scsi_target
*,
306
uint
);
307
extern
struct
scsi_device
*
__scsi_device_lookup_by_target
(
struct
scsi_target
*,
308
uint
);
309
extern
void
starget_for_each_device
(
struct
scsi_target
*,
void
*,
310
void
(*
fn
)(
struct
scsi_device
*,
void
*));
311
extern
void
__starget_for_each_device
(
struct
scsi_target
*,
void
*,
312
void
(*
fn
)(
struct
scsi_device
*,
313
void
*));
314
315
/* only exposed to implement shost_for_each_device */
316
extern
struct
scsi_device
*
__scsi_iterate_devices
(
struct
Scsi_Host
*,
317
struct
scsi_device
*);
318
328
#define shost_for_each_device(sdev, shost) \
329
for ((sdev) = __scsi_iterate_devices((shost), NULL); \
330
(sdev); \
331
(sdev) = __scsi_iterate_devices((shost), (sdev)))
332
346
#define __shost_for_each_device(sdev, shost) \
347
list_for_each_entry((sdev), &((shost)->__devices), siblings)
348
349
extern
void
scsi_adjust_queue_depth
(
struct
scsi_device
*,
int
,
int
);
350
extern
int
scsi_track_queue_full
(
struct
scsi_device
*,
int
);
351
352
extern
int
scsi_set_medium_removal
(
struct
scsi_device
*,
char
);
353
354
extern
int
scsi_mode_sense
(
struct
scsi_device
*sdev,
int
dbd,
int
modepage,
355
unsigned
char
*
buffer
,
int
len,
int
timeout,
356
int
retries
,
struct
scsi_mode_data
*
data
,
357
struct
scsi_sense_hdr
*);
358
extern
int
scsi_mode_select
(
struct
scsi_device
*sdev,
int
pf
,
int
sp
,
359
int
modepage,
unsigned
char
*
buffer
,
int
len,
360
int
timeout,
int
retries
,
361
struct
scsi_mode_data
*
data
,
362
struct
scsi_sense_hdr
*);
363
extern
int
scsi_test_unit_ready
(
struct
scsi_device
*sdev,
int
timeout,
364
int
retries
,
struct
scsi_sense_hdr
*sshdr);
365
extern
int
scsi_get_vpd_page
(
struct
scsi_device
*,
u8
page
,
unsigned
char
*
buf
,
366
int
buf_len);
367
extern
int
scsi_report_opcode
(
struct
scsi_device
*sdev,
unsigned
char
*
buffer
,
368
unsigned
int
len,
unsigned
char
opcode
);
369
extern
int
scsi_device_set_state
(
struct
scsi_device
*sdev,
370
enum
scsi_device_state
state
);
371
extern
struct
scsi_event
*
sdev_evt_alloc
(
enum
scsi_device_event
evt_type
,
372
gfp_t
gfpflags);
373
extern
void
sdev_evt_send
(
struct
scsi_device
*sdev,
struct
scsi_event
*
evt
);
374
extern
void
sdev_evt_send_simple
(
struct
scsi_device
*sdev,
375
enum
scsi_device_event
evt_type
,
gfp_t
gfpflags);
376
extern
int
scsi_device_quiesce
(
struct
scsi_device
*sdev);
377
extern
void
scsi_device_resume
(
struct
scsi_device
*sdev);
378
extern
void
scsi_target_quiesce
(
struct
scsi_target
*);
379
extern
void
scsi_target_resume
(
struct
scsi_target
*);
380
extern
void
scsi_scan_target
(
struct
device
*parent,
unsigned
int
channel
,
381
unsigned
int
id
,
unsigned
int
lun
,
int
rescan);
382
extern
void
scsi_target_reap
(
struct
scsi_target
*);
383
extern
void
scsi_target_block
(
struct
device
*);
384
extern
void
scsi_target_unblock
(
struct
device
*,
enum
scsi_device_state
);
385
extern
void
scsi_remove_target
(
struct
device
*);
386
extern
void
int_to_scsilun
(
unsigned
int
,
struct
scsi_lun
*);
387
extern
int
scsilun_to_int
(
struct
scsi_lun
*);
388
extern
const
char
*
scsi_device_state_name
(
enum
scsi_device_state
);
389
extern
int
scsi_is_sdev_device
(
const
struct
device
*);
390
extern
int
scsi_is_target_device
(
const
struct
device
*);
391
extern
int
scsi_execute
(
struct
scsi_device
*sdev,
const
unsigned
char
*
cmd
,
392
int
data_direction
,
void
*
buffer
,
unsigned
bufflen
,
393
unsigned
char
*
sense
,
int
timeout,
int
retries
,
394
int
flag
,
int
*resid);
395
extern
int
scsi_execute_req
(
struct
scsi_device
*sdev,
const
unsigned
char
*
cmd
,
396
int
data_direction
,
void
*
buffer
,
unsigned
bufflen
,
397
struct
scsi_sense_hdr
*,
int
timeout,
int
retries
,
398
int
*resid);
399
400
#ifdef CONFIG_PM_RUNTIME
401
extern
int
scsi_autopm_get_device(
struct
scsi_device
*);
402
extern
void
scsi_autopm_put_device(
struct
scsi_device
*);
403
#else
404
static
inline
int
scsi_autopm_get_device(
struct
scsi_device
*
d
) {
return
0; }
405
static
inline
void
scsi_autopm_put_device(
struct
scsi_device
*
d
) {}
406
#endif
/* CONFIG_PM_RUNTIME */
407
408
static
inline
int
__must_check
scsi_device_reprobe(
struct
scsi_device
*sdev)
409
{
410
return
device_reprobe
(&sdev->sdev_gendev);
411
}
412
413
static
inline
unsigned
int
sdev_channel(
struct
scsi_device
*sdev)
414
{
415
return
sdev->
channel
;
416
}
417
418
static
inline
unsigned
int
sdev_id(
struct
scsi_device
*sdev)
419
{
420
return
sdev->
id
;
421
}
422
423
#define scmd_id(scmd) sdev_id((scmd)->device)
424
#define scmd_channel(scmd) sdev_channel((scmd)->device)
425
426
/*
427
* checks for positions of the SCSI state machine
428
*/
429
static
inline
int
scsi_device_online(
struct
scsi_device
*sdev)
430
{
431
return
(sdev->
sdev_state
!=
SDEV_OFFLINE
&&
432
sdev->
sdev_state
!=
SDEV_TRANSPORT_OFFLINE
&&
433
sdev->
sdev_state
!=
SDEV_DEL
);
434
}
435
static
inline
int
scsi_device_blocked(
struct
scsi_device
*sdev)
436
{
437
return
sdev->
sdev_state
==
SDEV_BLOCK
||
438
sdev->
sdev_state
==
SDEV_CREATED_BLOCK
;
439
}
440
static
inline
int
scsi_device_created(
struct
scsi_device
*sdev)
441
{
442
return
sdev->
sdev_state
==
SDEV_CREATED
||
443
sdev->
sdev_state
==
SDEV_CREATED_BLOCK
;
444
}
445
446
/* accessor functions for the SCSI parameters */
447
static
inline
int
scsi_device_sync(
struct
scsi_device
*sdev)
448
{
449
return
sdev->
sdtr
;
450
}
451
static
inline
int
scsi_device_wide(
struct
scsi_device
*sdev)
452
{
453
return
sdev->
wdtr
;
454
}
455
static
inline
int
scsi_device_dt(
struct
scsi_device
*sdev)
456
{
457
return
sdev->
ppr
;
458
}
459
static
inline
int
scsi_device_dt_only(
struct
scsi_device
*sdev)
460
{
461
if
(sdev->
inquiry_len
< 57)
462
return
0;
463
return
(sdev->
inquiry
[56] & 0x0c) == 0x04;
464
}
465
static
inline
int
scsi_device_ius(
struct
scsi_device
*sdev)
466
{
467
if
(sdev->
inquiry_len
< 57)
468
return
0;
469
return
sdev->
inquiry
[56] & 0x01;
470
}
471
static
inline
int
scsi_device_qas(
struct
scsi_device
*sdev)
472
{
473
if
(sdev->
inquiry_len
< 57)
474
return
0;
475
return
sdev->
inquiry
[56] & 0x02;
476
}
477
static
inline
int
scsi_device_enclosure(
struct
scsi_device
*sdev)
478
{
479
return
sdev->
inquiry
? (sdev->
inquiry
[6] & (1<<6)) : 1;
480
}
481
482
static
inline
int
scsi_device_protection(
struct
scsi_device
*sdev)
483
{
484
if
(sdev->
no_dif
)
485
return
0;
486
487
return
sdev->
scsi_level
>
SCSI_2
&& sdev->
inquiry
[5] & (1<<0);
488
}
489
490
static
inline
int
scsi_device_tpgs(
struct
scsi_device
*sdev)
491
{
492
return
sdev->
inquiry
? (sdev->
inquiry
[5] >> 4) & 0x3 : 0;
493
}
494
495
#define MODULE_ALIAS_SCSI_DEVICE(type) \
496
MODULE_ALIAS("scsi:t-" __stringify(type) "*")
497
#define SCSI_DEVICE_MODALIAS_FMT "scsi:t-0x%02x"
498
499
#endif
/* _SCSI_SCSI_DEVICE_H */
Generated on Thu Jan 10 2013 14:53:28 for Linux Kernel by
1.8.2