Blame view

include/scsi/scsi_device.h 17.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  #ifndef _SCSI_SCSI_DEVICE_H
  #define _SCSI_SCSI_DEVICE_H
  
  #include <linux/device.h>
  #include <linux/list.h>
  #include <linux/spinlock.h>
ffedb4522   James Bottomley   [SCSI] fix scsi p...
7
  #include <linux/workqueue.h>
a4d04a4cd   Martin K. Petersen   [SCSI] Make error...
8
  #include <linux/blkdev.h>
d211f052f   Hugh Dickins   [SCSI] sd: fix US...
9
  #include <scsi/scsi.h>
60063497a   Arun Sharma   atomic: use <linu...
10
  #include <linux/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
  
  struct request_queue;
  struct scsi_cmnd;
e10fb91c4   James Bottomley   [SCSI] fix functi...
14
  struct scsi_lun;
ea73a9f23   James Bottomley   [SCSI] convert sd...
15
  struct scsi_sense_hdr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16

1cf72699c   James Bottomley   [SCSI] convert th...
17
18
19
20
21
22
23
24
  struct scsi_mode_data {
  	__u32	length;
  	__u16	block_descriptor_length;
  	__u8	medium_type;
  	__u8	device_specific;
  	__u8	header_length;
  	__u8	longlba:1;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  /*
   * sdev state: If you alter this, you also need to alter scsi_sysfs.c
   * (for the ascii descriptions) and the state model enforcer:
   * scsi_lib:scsi_device_set_state().
   */
  enum scsi_device_state {
  	SDEV_CREATED = 1,	/* device created but not added to sysfs
  				 * Only internal commands allowed (for inq) */
  	SDEV_RUNNING,		/* device properly configured
  				 * All commands allowed */
  	SDEV_CANCEL,		/* beginning to delete device
  				 * Only error handler commands allowed */
  	SDEV_DEL,		/* device deleted 
  				 * no commands allowed */
  	SDEV_QUIESCE,		/* Device quiescent.  No block commands
  				 * will be accepted, only specials (which
  				 * originate in the mid-layer) */
  	SDEV_OFFLINE,		/* Device offlined (by error handling or
  				 * user request */
6f4267e3b   James Bottomley   [SCSI] Update the...
44
45
46
47
48
  	SDEV_BLOCK,		/* Device blocked by scsi lld.  No
  				 * scsi commands from user or midlayer
  				 * should be issued to the scsi
  				 * lld. */
  	SDEV_CREATED_BLOCK,	/* same as above but for created devices */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  };
a341cd0f6   Jeff Garzik   SCSI: add asynchr...
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  enum scsi_device_event {
  	SDEV_EVT_MEDIA_CHANGE	= 1,	/* media has changed */
  
  	SDEV_EVT_LAST		= SDEV_EVT_MEDIA_CHANGE,
  	SDEV_EVT_MAXBITS	= SDEV_EVT_LAST + 1
  };
  
  struct scsi_event {
  	enum scsi_device_event	evt_type;
  	struct list_head	node;
  
  	/* put union of data structures, for non-simple event types,
  	 * here
  	 */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
68
69
70
71
  struct scsi_device {
  	struct Scsi_Host *host;
  	struct request_queue *request_queue;
  
  	/* the next two are protected by the host->host_lock */
  	struct list_head    siblings;   /* list of all devices on this host */
  	struct list_head    same_target_siblings; /* just the devices sharing same target id */
c2a9331c6   James Bottomley   updates for CFQ o...
72
  	/* this is now protected by the request_queue->queue_lock */
06f81ea8c   Tejun Heo   [PATCH] scsi: rem...
73
74
  	unsigned int device_busy;	/* commands actually active on
  					 * low-level. protected by queue_lock. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
76
77
78
79
  	spinlock_t list_lock;
  	struct list_head cmd_list;	/* queue of in use SCSI Command structures */
  	struct list_head starved_entry;
  	struct scsi_cmnd *current_cmnd;	/* currently active command */
  	unsigned short queue_depth;	/* How deep of a queue we want */
4a84067db   Vasu Dev   [SCSI] add queue_...
80
  	unsigned short max_queue_depth;	/* max queue depth */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
  	unsigned short last_queue_full_depth; /* These two are used by */
  	unsigned short last_queue_full_count; /* scsi_track_queue_full() */
4a84067db   Vasu Dev   [SCSI] add queue_...
83
84
85
86
87
  	unsigned long last_queue_full_time;	/* last queue full time */
  	unsigned long queue_ramp_up_period;	/* ramp up period in jiffies */
  #define SCSI_DEFAULT_RAMP_UP_PERIOD	(120 * HZ)
  
  	unsigned long last_queue_ramp_up;	/* last queue ramp up time */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
91
92
93
94
95
  
  	unsigned int id, lun, channel;
  
  	unsigned int manufacturer;	/* Manufacturer of device, for using 
  					 * vendor-specific cmd's */
  	unsigned sector_size;	/* size in bytes */
  
  	void *hostdata;		/* available to low-level driver */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
99
100
  	char type;
  	char scsi_level;
  	char inq_periph_qual;	/* PQ from INQUIRY data */	
  	unsigned char inquiry_len;	/* valid bytes in 'inquiry' */
  	unsigned char * inquiry;	/* INQUIRY response data */
7f23e146a   James Bottomley   [SCSI] correct so...
101
102
103
  	const char * vendor;		/* [back_compat] point into 'inquiry' ... */
  	const char * model;		/* ... after scan; point to static string */
  	const char * rev;		/* ... "nullnullnullnull" before scan */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  	unsigned char current_tag;	/* current tag */
  	struct scsi_target      *sdev_target;   /* used only for single_lun */
  
  	unsigned int	sdev_bflags; /* black/white flags as also found in
  				 * scsi_devinfo.[hc]. For now used only to
  				 * pass settings from slave_alloc to scsi
  				 * core. */
  	unsigned writeable:1;
  	unsigned removable:1;
  	unsigned changed:1;	/* Data invalid due to media change */
  	unsigned busy:1;	/* Used to prevent races */
  	unsigned lockable:1;	/* Able to prevent media removal */
  	unsigned locked:1;      /* Media removal disabled */
  	unsigned borken:1;	/* Tell the Seagate driver to be 
  				 * painfully slow on this device */
  	unsigned disconnect:1;	/* can disconnect */
  	unsigned soft_reset:1;	/* Uses soft reset option */
  	unsigned sdtr:1;	/* Device supports SDTR messages */
  	unsigned wdtr:1;	/* Device supports WDTR messages */
  	unsigned ppr:1;		/* Device supports PPR messages */
  	unsigned tagged_supported:1;	/* Supports SCSI-II tagged queuing */
  	unsigned simple_tags:1;	/* simple queue tag messages are enabled */
  	unsigned ordered_tags:1;/* ordered queue tag messages are enabled */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
129
130
131
132
133
134
135
136
137
  	unsigned was_reset:1;	/* There was a bus reset on the bus for 
  				 * this device */
  	unsigned expecting_cc_ua:1; /* Expecting a CHECK_CONDITION/UNIT_ATTN
  				     * because we did a bus reset. */
  	unsigned use_10_for_rw:1; /* first try 10-byte read / write */
  	unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */
  	unsigned skip_ms_page_8:1;	/* do not use MODE SENSE page 0x08 */
  	unsigned skip_ms_page_3f:1;	/* do not use MODE SENSE page 0x3f */
  	unsigned use_192_bytes_for_3f:1; /* ask for 192 bytes from page 0x3f */
  	unsigned no_start_on_add:1;	/* do not issue start on add */
  	unsigned allow_restart:1; /* issue START_UNIT in error handler */
c3c94c5a2   Tejun Heo   [SCSI] sd: implem...
138
  	unsigned manage_start_stop:1;	/* Let HLD (sd) manage start/stop */
d2886ea36   Stefan Richter   scsi: sd: optiona...
139
  	unsigned start_stop_pwr_cond:1;	/* Set power cond. in START_STOP_UNIT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
142
  	unsigned no_uld_attach:1; /* disable connecting to upper level drivers */
  	unsigned select_no_atn:1;
  	unsigned fix_capacity:1;	/* READ_CAPACITY is too high by 1 */
61bf54b71   Oliver Neukum   USB Storage: indi...
143
  	unsigned guess_capacity:1;	/* READ_CAPACITY might be too high by 1 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
  	unsigned retry_hwerror:1;	/* Retry HARDWARE_ERROR */
18351070b   Linus Torvalds   Re-introduce "[SC...
145
146
  	unsigned last_sector_bug:1;	/* do not use multisector accesses on
  					   SD_LAST_BUGGY_SECTORS */
8e04d8056   Hans de Goede   scsi/sr: add no_r...
147
  	unsigned no_read_disc_info:1;	/* Avoid READ_DISC_INFO cmds */
5ce524bdf   Hans de Goede   scsi/sd: add a no...
148
  	unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */
860dc7360   James Bottomley   [SCSI] fix async ...
149
  	unsigned is_visible:1;	/* is the device visible in sysfs */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150

a341cd0f6   Jeff Garzik   SCSI: add asynchr...
151
152
153
  	DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
  	struct list_head event_list;	/* asserted events */
  	struct work_struct event_work;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
156
157
158
159
160
161
  	unsigned int device_blocked;	/* Device returned QUEUE_FULL. */
  
  	unsigned int max_device_blocked; /* what device_blocked counts down from  */
  #define SCSI_DEFAULT_DEVICE_BLOCKED	3
  
  	atomic_t iorequest_cnt;
  	atomic_t iodone_cnt;
  	atomic_t ioerr_cnt;
ee959b00c   Tony Jones   SCSI: convert str...
162
163
  	struct device		sdev_gendev,
  				sdev_dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164

ffedb4522   James Bottomley   [SCSI] fix scsi p...
165
  	struct execute_work	ew; /* used to get process context on put */
9937a5e2f   Jens Axboe   scsi: remove perf...
166
  	struct work_struct	requeue_work;
ffedb4522   James Bottomley   [SCSI] fix scsi p...
167

a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
168
  	struct scsi_dh_data	*scsi_dh_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
171
  	enum scsi_device_state sdev_state;
  	unsigned long		sdev_data[0];
  } __attribute__((aligned(sizeof(unsigned long))));
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
172

765cbc6da   Hannes Reinecke   [SCSI] scsi_dh: I...
173
174
175
176
  struct scsi_dh_devlist {
  	char *vendor;
  	char *model;
  };
3ae31f6a7   Chandra Seetharaman   [SCSI] scsi_dh: C...
177
  typedef void (*activate_complete)(void *, int);
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
178
179
180
  struct scsi_device_handler {
  	/* Used by the infrastructure */
  	struct list_head list; /* list of scsi_device_handlers */
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
181
182
183
184
  
  	/* Filled by the hardware handler */
  	struct module *module;
  	const char *name;
765cbc6da   Hannes Reinecke   [SCSI] scsi_dh: I...
185
  	const struct scsi_dh_devlist *devlist;
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
186
  	int (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *);
765cbc6da   Hannes Reinecke   [SCSI] scsi_dh: I...
187
188
  	int (*attach)(struct scsi_device *);
  	void (*detach)(struct scsi_device *);
3ae31f6a7   Chandra Seetharaman   [SCSI] scsi_dh: C...
189
  	int (*activate)(struct scsi_device *, activate_complete, void *);
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
190
  	int (*prep_fn)(struct scsi_device *, struct request *);
18ee70c9d   Chandra Seetharaman   [SCSI] scsi_dh: a...
191
  	int (*set_params)(struct scsi_device *, const char *);
6c3633d08   Hannes Reinecke   [SCSI] scsi_dh: I...
192
  	bool (*match)(struct scsi_device *);
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
193
194
195
196
  };
  
  struct scsi_dh_data {
  	struct scsi_device_handler *scsi_dh;
6c10db72c   Chandra Seetharaman   [SCSI] scsi_dh: R...
197
198
  	struct scsi_device *sdev;
  	struct kref kref;
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
199
200
  	char buf[0];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
203
  #define	to_scsi_device(d)	\
  	container_of(d, struct scsi_device, sdev_gendev)
  #define	class_to_sdev(d)	\
ee959b00c   Tony Jones   SCSI: convert str...
204
  	container_of(d, struct scsi_device, sdev_dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  #define transport_class_to_sdev(class_dev) \
ee959b00c   Tony Jones   SCSI: convert str...
206
  	to_scsi_device(class_dev->parent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207

9ccfc756a   James Bottomley   [SCSI] move the m...
208
209
  #define sdev_printk(prefix, sdev, fmt, a...)	\
  	dev_printk(prefix, &(sdev)->sdev_gendev, fmt, ##a)
a4d04a4cd   Martin K. Petersen   [SCSI] Make error...
210
211
212
213
214
  #define scmd_printk(prefix, scmd, fmt, a...)				\
          (scmd)->request->rq_disk ?					\
  	sdev_printk(prefix, (scmd)->device, "[%s] " fmt,		\
  		    (scmd)->request->rq_disk->disk_name, ##a) :		\
  	sdev_printk(prefix, (scmd)->device, fmt, ##a)
01d7b3b8d   Jeff Garzik   [SCSI] introduce ...
215

ffedb4522   James Bottomley   [SCSI] fix scsi p...
216
  enum scsi_target_state {
643eb2d93   James Bottomley   [SCSI] rework scs...
217
218
  	STARGET_CREATED = 1,
  	STARGET_RUNNING,
ffedb4522   James Bottomley   [SCSI] fix scsi p...
219
220
  	STARGET_DEL,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
222
223
224
225
226
227
228
229
230
231
232
233
234
  /*
   * scsi_target: representation of a scsi target, for now, this is only
   * used for single_lun devices. If no one has active IO to the target,
   * starget_sdev_user is NULL, else it points to the active sdev.
   */
  struct scsi_target {
  	struct scsi_device	*starget_sdev_user;
  	struct list_head	siblings;
  	struct list_head	devices;
  	struct device		dev;
  	unsigned int		reap_ref; /* protected by the host lock */
  	unsigned int		channel;
  	unsigned int		id; /* target id ... replace
  				     * scsi_device.id eventually */
1bfc5d9d5   Alan Stern   [SCSI] Recognize ...
235
  	unsigned int		create:1; /* signal that it needs to be added */
25d7c363f   Tony Battersby   [SCSI] move singl...
236
237
238
  	unsigned int		single_lun:1;	/* Indicates we should only
  						 * allow I/O to one of the luns
  						 * for the device at a time. */
1bfc5d9d5   Alan Stern   [SCSI] Recognize ...
239
240
  	unsigned int		pdt_1f_for_no_lun;	/* PDT = 0x1f */
  						/* means no lun present */
f0c0a376d   Mike Christie   [SCSI] Add helper...
241
242
243
244
245
246
247
248
249
250
  	/* commands actually active on LLD. protected by host lock. */
  	unsigned int		target_busy;
  	/*
  	 * LLDs should set this in the slave_alloc host template callout.
  	 * If set to zero then there is not limit.
  	 */
  	unsigned int		can_queue;
  	unsigned int		target_blocked;
  	unsigned int		max_target_blocked;
  #define SCSI_DEFAULT_TARGET_BLOCKED	3
1bfc5d9d5   Alan Stern   [SCSI] Recognize ...
251

6f3a20242   James Bottomley   [SCSI] allow REPO...
252
  	char			scsi_level;
ffedb4522   James Bottomley   [SCSI] fix scsi p...
253
254
  	struct execute_work	ew;
  	enum scsi_target_state	state;
a283bd37d   James Bottomley   [SCSI] Add target...
255
256
257
  	void 			*hostdata; /* available to low-level driver */
  	unsigned long		starget_data[0]; /* for the transport */
  	/* starget_data must be the last element!!!! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
259
260
261
262
263
264
265
  } __attribute__((aligned(sizeof(unsigned long))));
  
  #define to_scsi_target(d)	container_of(d, struct scsi_target, dev)
  static inline struct scsi_target *scsi_target(struct scsi_device *sdev)
  {
  	return to_scsi_target(sdev->sdev_gendev.parent);
  }
  #define transport_class_to_starget(class_dev) \
ee959b00c   Tony Jones   SCSI: convert str...
266
  	to_scsi_target(class_dev->parent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267

9ccfc756a   James Bottomley   [SCSI] move the m...
268
269
  #define starget_printk(prefix, starget, fmt, a...)	\
  	dev_printk(prefix, &(starget)->dev, fmt, ##a)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
271
  extern struct scsi_device *__scsi_add_device(struct Scsi_Host *,
  		uint, uint, uint, void *hostdata);
146f7262e   James Bottomley   [SCSI] Alter the ...
272
273
  extern int scsi_add_device(struct Scsi_Host *host, uint channel,
  			   uint target, uint lun);
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
274
  extern int scsi_register_device_handler(struct scsi_device_handler *scsi_dh);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  extern void scsi_remove_device(struct scsi_device *);
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
276
  extern int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
279
280
281
282
283
284
285
286
287
288
289
  
  extern int scsi_device_get(struct scsi_device *);
  extern void scsi_device_put(struct scsi_device *);
  extern struct scsi_device *scsi_device_lookup(struct Scsi_Host *,
  					      uint, uint, uint);
  extern struct scsi_device *__scsi_device_lookup(struct Scsi_Host *,
  						uint, uint, uint);
  extern struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *,
  							uint);
  extern struct scsi_device *__scsi_device_lookup_by_target(struct scsi_target *,
  							  uint);
  extern void starget_for_each_device(struct scsi_target *, void *,
  		     void (*fn)(struct scsi_device *, void *));
522939d45   Maciej W. Rozycki   esp_scsi: fix res...
290
291
292
  extern void __starget_for_each_device(struct scsi_target *, void *,
  				      void (*fn)(struct scsi_device *,
  						 void *));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
298
  
  /* only exposed to implement shost_for_each_device */
  extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *,
  						  struct scsi_device *);
  
  /**
3e082a910   Matthew Wilcox   [SCSI] Add abilit...
299
300
301
   * shost_for_each_device - iterate over all devices of a host
   * @sdev: the &struct scsi_device to use as a cursor
   * @shost: the &struct scsi_host to iterate over
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
   *
3e082a910   Matthew Wilcox   [SCSI] Add abilit...
303
304
305
   * Iterator that returns each device attached to @shost.  This loop
   * takes a reference on each device and releases it at the end.  If
   * you break out of the loop, you must call scsi_device_put(sdev).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
307
308
309
310
311
312
   */
  #define shost_for_each_device(sdev, shost) \
  	for ((sdev) = __scsi_iterate_devices((shost), NULL); \
  	     (sdev); \
  	     (sdev) = __scsi_iterate_devices((shost), (sdev)))
  
  /**
3e082a910   Matthew Wilcox   [SCSI] Add abilit...
313
314
315
   * __shost_for_each_device - iterate over all devices of a host (UNLOCKED)
   * @sdev: the &struct scsi_device to use as a cursor
   * @shost: the &struct scsi_host to iterate over
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
   *
3e082a910   Matthew Wilcox   [SCSI] Add abilit...
317
318
319
   * Iterator that returns each device attached to @shost.  It does _not_
   * take a reference on the scsi_device, so the whole loop must be
   * protected by shost->host_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
   *
3e082a910   Matthew Wilcox   [SCSI] Add abilit...
321
322
323
   * Note: The only reason to use this is because you need to access the
   * device list in interrupt context.  Otherwise you really want to use
   * shost_for_each_device instead.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
325
326
327
328
329
330
331
332
333
334
   */
  #define __shost_for_each_device(sdev, shost) \
  	list_for_each_entry((sdev), &((shost)->__devices), siblings)
  
  extern void scsi_adjust_queue_depth(struct scsi_device *, int, int);
  extern int scsi_track_queue_full(struct scsi_device *, int);
  
  extern int scsi_set_medium_removal(struct scsi_device *, char);
  
  extern int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
  			   unsigned char *buffer, int len, int timeout,
1cf72699c   James Bottomley   [SCSI] convert th...
335
  			   int retries, struct scsi_mode_data *data,
ea73a9f23   James Bottomley   [SCSI] convert sd...
336
  			   struct scsi_sense_hdr *);
5baba830e   James Bottomley   [SCSI] add scsi_m...
337
338
339
340
341
  extern int scsi_mode_select(struct scsi_device *sdev, int pf, int sp,
  			    int modepage, unsigned char *buffer, int len,
  			    int timeout, int retries,
  			    struct scsi_mode_data *data,
  			    struct scsi_sense_hdr *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
  extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,
001aac257   James Bottomley   [SCSI] sd,sr: add...
343
  				int retries, struct scsi_sense_hdr *sshdr);
e3deec090   James Bottomley   [SCSI] eliminate ...
344
345
  extern int scsi_get_vpd_page(struct scsi_device *, u8 page, unsigned char *buf,
  			     int buf_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
346
347
  extern int scsi_device_set_state(struct scsi_device *sdev,
  				 enum scsi_device_state state);
a341cd0f6   Jeff Garzik   SCSI: add asynchr...
348
349
350
351
352
  extern struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type,
  					  gfp_t gfpflags);
  extern void sdev_evt_send(struct scsi_device *sdev, struct scsi_event *evt);
  extern void sdev_evt_send_simple(struct scsi_device *sdev,
  			  enum scsi_device_event evt_type, gfp_t gfpflags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
354
355
356
357
358
359
360
361
362
  extern int scsi_device_quiesce(struct scsi_device *sdev);
  extern void scsi_device_resume(struct scsi_device *sdev);
  extern void scsi_target_quiesce(struct scsi_target *);
  extern void scsi_target_resume(struct scsi_target *);
  extern void scsi_scan_target(struct device *parent, unsigned int channel,
  			     unsigned int id, unsigned int lun, int rescan);
  extern void scsi_target_reap(struct scsi_target *);
  extern void scsi_target_block(struct device *);
  extern void scsi_target_unblock(struct device *);
  extern void scsi_remove_target(struct device *);
2f4701d82   James.Smart@Emulex.Com   [SCSI] add int_to...
363
  extern void int_to_scsilun(unsigned int, struct scsi_lun *);
462b7859a   Christof Schmitt   [SCSI] zfcp: Repo...
364
  extern int scsilun_to_int(struct scsi_lun *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
366
367
  extern const char *scsi_device_state_name(enum scsi_device_state);
  extern int scsi_is_sdev_device(const struct device *);
  extern int scsi_is_target_device(const struct device *);
33aa687db   James Bottomley   [SCSI] convert SP...
368
369
370
  extern int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
  			int data_direction, void *buffer, unsigned bufflen,
  			unsigned char *sense, int timeout, int retries,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
371
  			int flag, int *resid);
ea73a9f23   James Bottomley   [SCSI] convert sd...
372
373
  extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd,
  			    int data_direction, void *buffer, unsigned bufflen,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
374
375
  			    struct scsi_sense_hdr *, int timeout, int retries,
  			    int *resid);
33aa687db   James Bottomley   [SCSI] convert SP...
376

bc4f24014   Alan Stern   [SCSI] implement ...
377
378
379
380
381
382
383
  #ifdef CONFIG_PM_RUNTIME
  extern int scsi_autopm_get_device(struct scsi_device *);
  extern void scsi_autopm_put_device(struct scsi_device *);
  #else
  static inline int scsi_autopm_get_device(struct scsi_device *d) { return 0; }
  static inline void scsi_autopm_put_device(struct scsi_device *d) {}
  #endif /* CONFIG_PM_RUNTIME */
cb5d9e094   Andrew Morton   [PATCH] scsi: dev...
384
  static inline int __must_check scsi_device_reprobe(struct scsi_device *sdev)
e28482c5b   James Bottomley   [SCSI] add scsi_r...
385
  {
cb5d9e094   Andrew Morton   [PATCH] scsi: dev...
386
  	return device_reprobe(&sdev->sdev_gendev);
e28482c5b   James Bottomley   [SCSI] add scsi_r...
387
  }
01d7b3b8d   Jeff Garzik   [SCSI] introduce ...
388
389
390
391
392
393
394
395
396
397
398
399
  static inline unsigned int sdev_channel(struct scsi_device *sdev)
  {
  	return sdev->channel;
  }
  
  static inline unsigned int sdev_id(struct scsi_device *sdev)
  {
  	return sdev->id;
  }
  
  #define scmd_id(scmd) sdev_id((scmd)->device)
  #define scmd_channel(scmd) sdev_channel((scmd)->device)
0f1d87a2a   James Bottomley   [SCSI] add inline...
400
401
402
  /*
   * checks for positions of the SCSI state machine
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
404
  static inline int scsi_device_online(struct scsi_device *sdev)
  {
0762a4824   Hannes Reinecke   [SCSI] Check for ...
405
406
  	return (sdev->sdev_state != SDEV_OFFLINE &&
  		sdev->sdev_state != SDEV_DEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
  }
0f1d87a2a   James Bottomley   [SCSI] add inline...
408
409
  static inline int scsi_device_blocked(struct scsi_device *sdev)
  {
6f4267e3b   James Bottomley   [SCSI] Update the...
410
411
  	return sdev->sdev_state == SDEV_BLOCK ||
  		sdev->sdev_state == SDEV_CREATED_BLOCK;
0f1d87a2a   James Bottomley   [SCSI] add inline...
412
413
414
  }
  static inline int scsi_device_created(struct scsi_device *sdev)
  {
6f4267e3b   James Bottomley   [SCSI] Update the...
415
416
  	return sdev->sdev_state == SDEV_CREATED ||
  		sdev->sdev_state == SDEV_CREATED_BLOCK;
0f1d87a2a   James Bottomley   [SCSI] add inline...
417
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
  
  /* accessor functions for the SCSI parameters */
  static inline int scsi_device_sync(struct scsi_device *sdev)
  {
  	return sdev->sdtr;
  }
  static inline int scsi_device_wide(struct scsi_device *sdev)
  {
  	return sdev->wdtr;
  }
  static inline int scsi_device_dt(struct scsi_device *sdev)
  {
  	return sdev->ppr;
  }
  static inline int scsi_device_dt_only(struct scsi_device *sdev)
  {
  	if (sdev->inquiry_len < 57)
  		return 0;
  	return (sdev->inquiry[56] & 0x0c) == 0x04;
  }
  static inline int scsi_device_ius(struct scsi_device *sdev)
  {
  	if (sdev->inquiry_len < 57)
  		return 0;
  	return sdev->inquiry[56] & 0x01;
  }
  static inline int scsi_device_qas(struct scsi_device *sdev)
  {
  	if (sdev->inquiry_len < 57)
  		return 0;
  	return sdev->inquiry[56] & 0x02;
  }
b30c2fc11   James Bottomley   [SCSI] scsi.h: ad...
450
451
  static inline int scsi_device_enclosure(struct scsi_device *sdev)
  {
d1e12de80   Krishnasamy, Somasundaram   [SCSI] ses: Avoid...
452
  	return sdev->inquiry ? (sdev->inquiry[6] & (1<<6)) : 1;
b30c2fc11   James Bottomley   [SCSI] scsi.h: ad...
453
  }
d7b8bcb0a   Michael Tokarev   [SCSI] modalias f...
454

7027ad72a   Martin K. Petersen   [SCSI] Support de...
455
456
  static inline int scsi_device_protection(struct scsi_device *sdev)
  {
d211f052f   Hugh Dickins   [SCSI] sd: fix US...
457
  	return sdev->scsi_level > SCSI_2 && sdev->inquiry[5] & (1<<0);
7027ad72a   Martin K. Petersen   [SCSI] Support de...
458
  }
d7c48feb3   Hannes Reinecke   [SCSI] scsi_dh_al...
459
460
461
462
  static inline int scsi_device_tpgs(struct scsi_device *sdev)
  {
  	return sdev->inquiry ? (sdev->inquiry[5] >> 4) & 0x3 : 0;
  }
d7b8bcb0a   Michael Tokarev   [SCSI] modalias f...
463
464
465
  #define MODULE_ALIAS_SCSI_DEVICE(type) \
  	MODULE_ALIAS("scsi:t-" __stringify(type) "*")
  #define SCSI_DEVICE_MODALIAS_FMT "scsi:t-0x%02x"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
  #endif /* _SCSI_SCSI_DEVICE_H */