Blame view

drivers/ata/libata-scsi.c 98.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
af36d7f0d   Jeff Garzik   [libata] license ...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   *  libata-scsi.c - helper library for ATA
   *
   *  Maintained by:  Jeff Garzik <jgarzik@pobox.com>
   *    		    Please ALWAYS copy linux-ide@vger.kernel.org
   *		    on emails.
   *
   *  Copyright 2003-2004 Red Hat, Inc.  All rights reserved.
   *  Copyright 2003-2004 Jeff Garzik
   *
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2, or (at your option)
   *  any later version.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; see the file COPYING.  If not, write to
   *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
   *
   *
   *  libata documentation is available via 'make {ps|pdf}docs',
   *  as Documentation/DocBook/libata.*
   *
   *  Hardware documentation available from
   *  - http://www.t10.org/
   *  - http://www.t13.org/
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
   */
5a0e3ad6a   Tejun Heo   include cleanup: ...
35
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
  #include <linux/kernel.h>
  #include <linux/blkdev.h>
  #include <linux/spinlock.h>
38789fda2   Paul Gortmaker   ide/ata: Add expo...
39
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  #include <scsi/scsi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  #include <scsi/scsi_host.h>
beb404875   Christoph Hellwig   [SCSI] remove scs...
42
  #include <scsi/scsi_cmnd.h>
85837ebdd   Mike Christie   [PATCH] kill liba...
43
  #include <scsi/scsi_eh.h>
005a5a06a   Jeff Garzik   [libata] locking ...
44
  #include <scsi/scsi_device.h>
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
45
  #include <scsi/scsi_tcq.h>
30afc84cf   Tejun Heo   [SCSI] libata: im...
46
  #include <scsi/scsi_transport.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  #include <linux/libata.h>
b095518ef   Jeff Garzik   [libata] ATA pass...
48
  #include <linux/hdreg.h>
2dcb407e6   Jeff Garzik   [libata] checkpat...
49
  #include <linux/uaccess.h>
2a6e58d27   Rafael J. Wysocki   SATA: Blacklistin...
50
  #include <linux/suspend.h>
18f0f9785   Christoph Hellwig   libata: add trans...
51
  #include <asm/unaligned.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
  
  #include "libata.h"
d9027470b   Gwendal Grignou   [libata] Add ATA ...
54
  #include "libata-transport.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55

87340e983   Tejun Heo   libata-scsi: impr...
56
57
58
59
  #define ATA_SCSI_RBUF_SIZE	4096
  
  static DEFINE_SPINLOCK(ata_scsi_rbuf_lock);
  static u8 ata_scsi_rbuf[ATA_SCSI_RBUF_SIZE];
b095518ef   Jeff Garzik   [libata] ATA pass...
60

ad706991f   Tejun Heo   [PATCH] libata: k...
61
  typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc);
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
62

2dcb407e6   Jeff Garzik   [libata] checkpat...
63
  static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
64
  					const struct scsi_device *scsidev);
2dcb407e6   Jeff Garzik   [libata] checkpat...
65
  static struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
66
  					    const struct scsi_device *scsidev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67

00ac37f50   Douglas Gilbert   [libata scsi] MOD...
68
69
70
71
72
73
74
75
  #define RW_RECOVERY_MPAGE 0x1
  #define RW_RECOVERY_MPAGE_LEN 12
  #define CACHE_MPAGE 0x8
  #define CACHE_MPAGE_LEN 20
  #define CONTROL_MPAGE 0xa
  #define CONTROL_MPAGE_LEN 12
  #define ALL_MPAGES 0x3f
  #define ALL_SUB_MPAGES 0xff
24f756866   Jeff Garzik   [libata] SCSI: cl...
76
  static const u8 def_rw_recovery_mpage[RW_RECOVERY_MPAGE_LEN] = {
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
77
78
  	RW_RECOVERY_MPAGE,
  	RW_RECOVERY_MPAGE_LEN - 2,
24f756866   Jeff Garzik   [libata] SCSI: cl...
79
  	(1 << 7),	/* AWRE */
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  	0,		/* read retry count */
  	0, 0, 0, 0,
  	0,		/* write retry count */
  	0, 0, 0
  };
  
  static const u8 def_cache_mpage[CACHE_MPAGE_LEN] = {
  	CACHE_MPAGE,
  	CACHE_MPAGE_LEN - 2,
  	0,		/* contains WCE, needs to be 0 for logic */
  	0, 0, 0, 0, 0, 0, 0, 0, 0,
  	0,		/* contains DRA, needs to be 0 for logic */
  	0, 0, 0, 0, 0, 0, 0
  };
  
  static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = {
  	CONTROL_MPAGE,
  	CONTROL_MPAGE_LEN - 2,
  	2,	/* DSENSE=0, GLTSD=1 */
  	0,	/* [QAM+QERR may be 1, see 05-359r1] */
  	0, 0, 0, 0, 0xff, 0xff,
  	0, 30	/* extended self test time, see 05-359r1 */
  };
c93b263e0   Tejun Heo   libata: clean up ...
103
104
105
106
107
  static const char *ata_lpm_policy_names[] = {
  	[ATA_LPM_UNKNOWN]	= "max_performance",
  	[ATA_LPM_MAX_POWER]	= "max_performance",
  	[ATA_LPM_MED_POWER]	= "medium_power",
  	[ATA_LPM_MIN_POWER]	= "min_power",
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
108
  };
c93b263e0   Tejun Heo   libata: clean up ...
109
110
111
  static ssize_t ata_scsi_lpm_store(struct device *dev,
  				  struct device_attribute *attr,
  				  const char *buf, size_t count)
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
112
  {
ee959b00c   Tony Jones   SCSI: convert str...
113
  	struct Scsi_Host *shost = class_to_shost(dev);
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
114
  	struct ata_port *ap = ata_shost_to_port(shost);
c93b263e0   Tejun Heo   libata: clean up ...
115
  	enum ata_lpm_policy policy;
6b7ae9545   Tejun Heo   libata: reimpleme...
116
  	unsigned long flags;
c93b263e0   Tejun Heo   libata: clean up ...
117
118
119
120
121
122
123
  
  	/* UNKNOWN is internal state, iterate from MAX_POWER */
  	for (policy = ATA_LPM_MAX_POWER;
  	     policy < ARRAY_SIZE(ata_lpm_policy_names); policy++) {
  		const char *name = ata_lpm_policy_names[policy];
  
  		if (strncmp(name, buf, strlen(name)) == 0)
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
124
  			break;
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
125
  	}
c93b263e0   Tejun Heo   libata: clean up ...
126
  	if (policy == ARRAY_SIZE(ata_lpm_policy_names))
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
127
  		return -EINVAL;
6b7ae9545   Tejun Heo   libata: reimpleme...
128
129
130
131
  	spin_lock_irqsave(ap->lock, flags);
  	ap->target_lpm_policy = policy;
  	ata_port_schedule_eh(ap);
  	spin_unlock_irqrestore(ap->lock, flags);
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
132
133
  	return count;
  }
c93b263e0   Tejun Heo   libata: clean up ...
134
135
  static ssize_t ata_scsi_lpm_show(struct device *dev,
  				 struct device_attribute *attr, char *buf)
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
136
  {
ee959b00c   Tony Jones   SCSI: convert str...
137
  	struct Scsi_Host *shost = class_to_shost(dev);
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
138
  	struct ata_port *ap = ata_shost_to_port(shost);
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
139

6b7ae9545   Tejun Heo   libata: reimpleme...
140
  	if (ap->target_lpm_policy >= ARRAY_SIZE(ata_lpm_policy_names))
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
141
  		return -EINVAL;
c93b263e0   Tejun Heo   libata: clean up ...
142
143
  	return snprintf(buf, PAGE_SIZE, "%s
  ",
6b7ae9545   Tejun Heo   libata: reimpleme...
144
  			ata_lpm_policy_names[ap->target_lpm_policy]);
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
145
  }
ee959b00c   Tony Jones   SCSI: convert str...
146
  DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR,
c93b263e0   Tejun Heo   libata: clean up ...
147
  	    ata_scsi_lpm_show, ata_scsi_lpm_store);
ee959b00c   Tony Jones   SCSI: convert str...
148
  EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy);
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
149

45fabbb77   Elias Oltmanns   libata: Implement...
150
151
152
153
154
155
156
  static ssize_t ata_scsi_park_show(struct device *device,
  				  struct device_attribute *attr, char *buf)
  {
  	struct scsi_device *sdev = to_scsi_device(device);
  	struct ata_port *ap;
  	struct ata_link *link;
  	struct ata_device *dev;
a464189de   Elias Oltmanns   libata: Fix a pot...
157
  	unsigned long flags, now;
45fabbb77   Elias Oltmanns   libata: Implement...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  	unsigned int uninitialized_var(msecs);
  	int rc = 0;
  
  	ap = ata_shost_to_port(sdev->host);
  
  	spin_lock_irqsave(ap->lock, flags);
  	dev = ata_scsi_find_dev(ap, sdev);
  	if (!dev) {
  		rc = -ENODEV;
  		goto unlock;
  	}
  	if (dev->flags & ATA_DFLAG_NO_UNLOAD) {
  		rc = -EOPNOTSUPP;
  		goto unlock;
  	}
  
  	link = dev->link;
a464189de   Elias Oltmanns   libata: Fix a pot...
175
  	now = jiffies;
45fabbb77   Elias Oltmanns   libata: Implement...
176
177
  	if (ap->pflags & ATA_PFLAG_EH_IN_PROGRESS &&
  	    link->eh_context.unloaded_mask & (1 << dev->devno) &&
a464189de   Elias Oltmanns   libata: Fix a pot...
178
179
  	    time_after(dev->unpark_deadline, now))
  		msecs = jiffies_to_msecs(dev->unpark_deadline - now);
45fabbb77   Elias Oltmanns   libata: Implement...
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  	else
  		msecs = 0;
  
  unlock:
  	spin_unlock_irq(ap->lock);
  
  	return rc ? rc : snprintf(buf, 20, "%u
  ", msecs);
  }
  
  static ssize_t ata_scsi_park_store(struct device *device,
  				   struct device_attribute *attr,
  				   const char *buf, size_t len)
  {
  	struct scsi_device *sdev = to_scsi_device(device);
  	struct ata_port *ap;
  	struct ata_device *dev;
  	long int input;
  	unsigned long flags;
  	int rc;
  
  	rc = strict_strtol(buf, 10, &input);
  	if (rc || input < -2)
  		return -EINVAL;
  	if (input > ATA_TMOUT_MAX_PARK) {
  		rc = -EOVERFLOW;
  		input = ATA_TMOUT_MAX_PARK;
  	}
  
  	ap = ata_shost_to_port(sdev->host);
  
  	spin_lock_irqsave(ap->lock, flags);
  	dev = ata_scsi_find_dev(ap, sdev);
  	if (unlikely(!dev)) {
  		rc = -ENODEV;
  		goto unlock;
  	}
  	if (dev->class != ATA_DEV_ATA) {
  		rc = -EOPNOTSUPP;
  		goto unlock;
  	}
  
  	if (input >= 0) {
  		if (dev->flags & ATA_DFLAG_NO_UNLOAD) {
  			rc = -EOPNOTSUPP;
  			goto unlock;
  		}
  
  		dev->unpark_deadline = ata_deadline(jiffies, input);
  		dev->link->eh_info.dev_action[dev->devno] |= ATA_EH_PARK;
  		ata_port_schedule_eh(ap);
  		complete(&ap->park_req_pending);
  	} else {
  		switch (input) {
  		case -1:
  			dev->flags &= ~ATA_DFLAG_NO_UNLOAD;
  			break;
  		case -2:
  			dev->flags |= ATA_DFLAG_NO_UNLOAD;
  			break;
  		}
  	}
  unlock:
  	spin_unlock_irqrestore(ap->lock, flags);
  
  	return rc ? rc : len;
  }
  DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
  	    ata_scsi_park_show, ata_scsi_park_store);
  EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
f0761be34   Tejun Heo   libata-scsi: clea...
250
251
252
253
254
255
  static void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
  {
  	cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
  
  	scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq);
  }
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
  static ssize_t
  ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr,
  			  const char *buf, size_t count)
  {
  	struct Scsi_Host *shost = class_to_shost(dev);
  	struct ata_port *ap = ata_shost_to_port(shost);
  	if (ap->ops->em_store && (ap->flags & ATA_FLAG_EM))
  		return ap->ops->em_store(ap, buf, count);
  	return -EINVAL;
  }
  
  static ssize_t
  ata_scsi_em_message_show(struct device *dev, struct device_attribute *attr,
  			 char *buf)
  {
  	struct Scsi_Host *shost = class_to_shost(dev);
  	struct ata_port *ap = ata_shost_to_port(shost);
  
  	if (ap->ops->em_show && (ap->flags & ATA_FLAG_EM))
  		return ap->ops->em_show(ap, buf);
  	return -EINVAL;
  }
ea7a5ed58   Vitaly Mayatskikh   Avoid world-writa...
278
  DEVICE_ATTR(em_message, S_IRUGO | S_IWUSR,
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
  		ata_scsi_em_message_show, ata_scsi_em_message_store);
  EXPORT_SYMBOL_GPL(dev_attr_em_message);
  
  static ssize_t
  ata_scsi_em_message_type_show(struct device *dev, struct device_attribute *attr,
  			      char *buf)
  {
  	struct Scsi_Host *shost = class_to_shost(dev);
  	struct ata_port *ap = ata_shost_to_port(shost);
  
  	return snprintf(buf, 23, "%d
  ", ap->em_message_type);
  }
  DEVICE_ATTR(em_message_type, S_IRUGO,
  		  ata_scsi_em_message_type_show, NULL);
  EXPORT_SYMBOL_GPL(dev_attr_em_message_type);
  
  static ssize_t
  ata_scsi_activity_show(struct device *dev, struct device_attribute *attr,
  		char *buf)
  {
  	struct scsi_device *sdev = to_scsi_device(dev);
  	struct ata_port *ap = ata_shost_to_port(sdev->host);
  	struct ata_device *atadev = ata_scsi_find_dev(ap, sdev);
  
  	if (ap->ops->sw_activity_show && (ap->flags & ATA_FLAG_SW_ACTIVITY))
  		return ap->ops->sw_activity_show(atadev, buf);
  	return -EINVAL;
  }
  
  static ssize_t
  ata_scsi_activity_store(struct device *dev, struct device_attribute *attr,
  	const char *buf, size_t count)
  {
  	struct scsi_device *sdev = to_scsi_device(dev);
  	struct ata_port *ap = ata_shost_to_port(sdev->host);
  	struct ata_device *atadev = ata_scsi_find_dev(ap, sdev);
  	enum sw_activity val;
  	int rc;
  
  	if (ap->ops->sw_activity_store && (ap->flags & ATA_FLAG_SW_ACTIVITY)) {
  		val = simple_strtoul(buf, NULL, 0);
  		switch (val) {
  		case OFF: case BLINK_ON: case BLINK_OFF:
  			rc = ap->ops->sw_activity_store(atadev, val);
  			if (!rc)
  				return count;
  			else
  				return rc;
  		}
  	}
  	return -EINVAL;
  }
ea7a5ed58   Vitaly Mayatskikh   Avoid world-writa...
332
  DEVICE_ATTR(sw_activity, S_IWUSR | S_IRUGO, ata_scsi_activity_show,
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
333
334
  			ata_scsi_activity_store);
  EXPORT_SYMBOL_GPL(dev_attr_sw_activity);
45fabbb77   Elias Oltmanns   libata: Implement...
335
336
337
338
339
  struct device_attribute *ata_common_sdev_attrs[] = {
  	&dev_attr_unload_heads,
  	NULL
  };
  EXPORT_SYMBOL_GPL(ata_common_sdev_attrs);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
340
  static void ata_scsi_invalid_field(struct scsi_cmnd *cmd)
ae0065102   Douglas Gilbert   [libata scsi] imp...
341
342
343
  {
  	ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x24, 0x0);
  	/* "Invalid field in cbd" */
b27dcfb06   Jeff Garzik   [libata] avoid ne...
344
  	cmd->scsi_done(cmd);
ae0065102   Douglas Gilbert   [libata scsi] imp...
345
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
  /**
   *	ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd.
   *	@sdev: SCSI device for which BIOS geometry is to be determined
   *	@bdev: block device associated with @sdev
   *	@capacity: capacity of SCSI device
   *	@geom: location to which geometry will be output
   *
   *	Generic bios head/sector/cylinder calculator
   *	used by sd. Most BIOSes nowadays expect a XXX/255/16  (CHS)
   *	mapping. Some situations may arise where the disk is not
   *	bootable if this is not used.
   *
   *	LOCKING:
   *	Defined by the SCSI layer.  We don't really care.
   *
   *	RETURNS:
   *	Zero.
   */
  int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
  		       sector_t capacity, int geom[])
  {
  	geom[0] = 255;
  	geom[1] = 63;
  	sector_div(capacity, 255*63);
  	geom[2] = capacity;
  
  	return 0;
  }
b095518ef   Jeff Garzik   [libata] ATA pass...
374
  /**
d8d9129ea   Tejun Heo   libata: implement...
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
   *	ata_scsi_unlock_native_capacity - unlock native capacity
   *	@sdev: SCSI device to adjust device capacity for
   *
   *	This function is called if a partition on @sdev extends beyond
   *	the end of the device.  It requests EH to unlock HPA.
   *
   *	LOCKING:
   *	Defined by the SCSI layer.  Might sleep.
   */
  void ata_scsi_unlock_native_capacity(struct scsi_device *sdev)
  {
  	struct ata_port *ap = ata_shost_to_port(sdev->host);
  	struct ata_device *dev;
  	unsigned long flags;
  
  	spin_lock_irqsave(ap->lock, flags);
  
  	dev = ata_scsi_find_dev(ap, sdev);
  	if (dev && dev->n_sectors < dev->n_native_sectors) {
  		dev->flags |= ATA_DFLAG_UNLOCK_HPA;
  		dev->link->eh_info.action |= ATA_EH_RESET;
  		ata_port_schedule_eh(ap);
  	}
  
  	spin_unlock_irqrestore(ap->lock, flags);
  	ata_port_wait_eh(ap);
  }
  
  /**
5924b74c1   Tejun Heo   libata: implement...
404
   *	ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
5eb66fe05   Randy Dunlap   libata: fix kerne...
405
   *	@ap: target port
5924b74c1   Tejun Heo   libata: implement...
406
407
408
409
410
411
412
413
414
   *	@sdev: SCSI device to get identify data for
   *	@arg: User buffer area for identify data
   *
   *	LOCKING:
   *	Defined by the SCSI layer.  We don't really care.
   *
   *	RETURNS:
   *	Zero on success, negative errno on error.
   */
94be9a58d   Jeff Garzik   [libata] get-iden...
415
416
  static int ata_get_identity(struct ata_port *ap, struct scsi_device *sdev,
  			    void __user *arg)
5924b74c1   Tejun Heo   libata: implement...
417
  {
5924b74c1   Tejun Heo   libata: implement...
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
  	struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
  	u16 __user *dst = arg;
  	char buf[40];
  
  	if (!dev)
  		return -ENOMSG;
  
  	if (copy_to_user(dst, dev->id, ATA_ID_WORDS * sizeof(u16)))
  		return -EFAULT;
  
  	ata_id_string(dev->id, buf, ATA_ID_PROD, ATA_ID_PROD_LEN);
  	if (copy_to_user(dst + ATA_ID_PROD, buf, ATA_ID_PROD_LEN))
  		return -EFAULT;
  
  	ata_id_string(dev->id, buf, ATA_ID_FW_REV, ATA_ID_FW_REV_LEN);
  	if (copy_to_user(dst + ATA_ID_FW_REV, buf, ATA_ID_FW_REV_LEN))
  		return -EFAULT;
  
  	ata_id_string(dev->id, buf, ATA_ID_SERNO, ATA_ID_SERNO_LEN);
  	if (copy_to_user(dst + ATA_ID_SERNO, buf, ATA_ID_SERNO_LEN))
  		return -EFAULT;
  
  	return 0;
  }
  
  /**
b095518ef   Jeff Garzik   [libata] ATA pass...
444
   *	ata_cmd_ioctl - Handler for HDIO_DRIVE_CMD ioctl
8e8b77dd4   Randy Dunlap   [PATCH] libata ke...
445
   *	@scsidev: Device to which we are issuing command
b095518ef   Jeff Garzik   [libata] ATA pass...
446
447
448
449
450
451
452
453
   *	@arg: User provided data for issuing command
   *
   *	LOCKING:
   *	Defined by the SCSI layer.  We don't really care.
   *
   *	RETURNS:
   *	Zero on success, negative errno on error.
   */
b095518ef   Jeff Garzik   [libata] ATA pass...
454
455
456
457
  int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
  {
  	int rc = 0;
  	u8 scsi_cmd[MAX_COMMAND_SIZE];
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
458
  	u8 args[4], *argbuf = NULL, *sensebuf = NULL;
b095518ef   Jeff Garzik   [libata] ATA pass...
459
  	int argsize = 0;
85837ebdd   Mike Christie   [PATCH] kill liba...
460
  	enum dma_data_direction data_dir;
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
461
  	int cmd_result;
b095518ef   Jeff Garzik   [libata] ATA pass...
462

c893a3ae4   Randy Dunlap   Various libata do...
463
  	if (arg == NULL)
b095518ef   Jeff Garzik   [libata] ATA pass...
464
465
466
467
  		return -EINVAL;
  
  	if (copy_from_user(args, arg, sizeof(args)))
  		return -EFAULT;
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
468
469
470
  	sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
  	if (!sensebuf)
  		return -ENOMEM;
b095518ef   Jeff Garzik   [libata] ATA pass...
471
472
473
  	memset(scsi_cmd, 0, sizeof(scsi_cmd));
  
  	if (args[3]) {
295124dce   Grant Grundler   [libata] support ...
474
  		argsize = ATA_SECT_SIZE * args[3];
b095518ef   Jeff Garzik   [libata] ATA pass...
475
  		argbuf = kmalloc(argsize, GFP_KERNEL);
54dac83c4   Jeff Raubitschek   [libata passthru]...
476
477
478
479
  		if (argbuf == NULL) {
  			rc = -ENOMEM;
  			goto error;
  		}
b095518ef   Jeff Garzik   [libata] ATA pass...
480
481
482
  
  		scsi_cmd[1]  = (4 << 1); /* PIO Data-in */
  		scsi_cmd[2]  = 0x0e;     /* no off.line or cc, read from dev,
2dcb407e6   Jeff Garzik   [libata] checkpat...
483
  					    block count in sector count field */
85837ebdd   Mike Christie   [PATCH] kill liba...
484
  		data_dir = DMA_FROM_DEVICE;
b095518ef   Jeff Garzik   [libata] ATA pass...
485
486
  	} else {
  		scsi_cmd[1]  = (3 << 1); /* Non-data */
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
487
  		scsi_cmd[2]  = 0x20;     /* cc but no off.line or data xfer */
85837ebdd   Mike Christie   [PATCH] kill liba...
488
  		data_dir = DMA_NONE;
b095518ef   Jeff Garzik   [libata] ATA pass...
489
490
491
492
493
  	}
  
  	scsi_cmd[0] = ATA_16;
  
  	scsi_cmd[4] = args[2];
a4f19040a   Bartlomiej Zolnierkiewicz   libata: WIN_* -> ...
494
  	if (args[0] == ATA_CMD_SMART) { /* hack -- ide driver does this too */
b095518ef   Jeff Garzik   [libata] ATA pass...
495
496
497
498
499
500
501
502
503
504
505
  		scsi_cmd[6]  = args[3];
  		scsi_cmd[8]  = args[1];
  		scsi_cmd[10] = 0x4f;
  		scsi_cmd[12] = 0xc2;
  	} else {
  		scsi_cmd[6]  = args[1];
  	}
  	scsi_cmd[14] = args[0];
  
  	/* Good values for timeout and retries?  Values below
  	   from scsi_ioctl_send_command() for default case... */
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
506
  	cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
507
  				  sensebuf, (10*HZ), 5, 0, NULL);
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
508
509
510
511
512
513
514
515
516
517
  
  	if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
  		u8 *desc = sensebuf + 8;
  		cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
  
  		/* If we set cc then ATA pass-through will cause a
  		 * check condition even if no error. Filter that. */
  		if (cmd_result & SAM_STAT_CHECK_CONDITION) {
  			struct scsi_sense_hdr sshdr;
  			scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
2dcb407e6   Jeff Garzik   [libata] checkpat...
518
519
520
  					     &sshdr);
  			if (sshdr.sense_key == 0 &&
  			    sshdr.asc == 0 && sshdr.ascq == 0)
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
521
522
523
524
  				cmd_result &= ~SAM_STAT_CHECK_CONDITION;
  		}
  
  		/* Send userspace a few ATA registers (same as drivers/ide) */
2dcb407e6   Jeff Garzik   [libata] checkpat...
525
526
527
528
529
  		if (sensebuf[0] == 0x72 &&	/* format is "descriptor" */
  		    desc[0] == 0x09) {		/* code is "ATA Descriptor" */
  			args[0] = desc[13];	/* status */
  			args[1] = desc[3];	/* error */
  			args[2] = desc[5];	/* sector count (0:7) */
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
530
531
532
533
534
535
536
  			if (copy_to_user(arg, args, sizeof(args)))
  				rc = -EFAULT;
  		}
  	}
  
  
  	if (cmd_result) {
b095518ef   Jeff Garzik   [libata] ATA pass...
537
538
539
  		rc = -EIO;
  		goto error;
  	}
b095518ef   Jeff Garzik   [libata] ATA pass...
540
  	if ((argbuf)
c893a3ae4   Randy Dunlap   Various libata do...
541
  	 && copy_to_user(arg + sizeof(args), argbuf, argsize))
b095518ef   Jeff Garzik   [libata] ATA pass...
542
543
  		rc = -EFAULT;
  error:
bbe1fe7ea   Eran Tromer   [PATCH] libata: r...
544
  	kfree(sensebuf);
8f7607803   Jesper Juhl   [PATCH] Remove re...
545
  	kfree(argbuf);
b095518ef   Jeff Garzik   [libata] ATA pass...
546
547
548
549
550
  	return rc;
  }
  
  /**
   *	ata_task_ioctl - Handler for HDIO_DRIVE_TASK ioctl
8e8b77dd4   Randy Dunlap   [PATCH] libata ke...
551
   *	@scsidev: Device to which we are issuing command
b095518ef   Jeff Garzik   [libata] ATA pass...
552
553
554
555
556
557
558
559
560
561
562
563
   *	@arg: User provided data for issuing command
   *
   *	LOCKING:
   *	Defined by the SCSI layer.  We don't really care.
   *
   *	RETURNS:
   *	Zero on success, negative errno on error.
   */
  int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
  {
  	int rc = 0;
  	u8 scsi_cmd[MAX_COMMAND_SIZE];
af068bd1d   David Milburn   libata-scsi: ata_...
564
565
  	u8 args[7], *sensebuf = NULL;
  	int cmd_result;
b095518ef   Jeff Garzik   [libata] ATA pass...
566

c893a3ae4   Randy Dunlap   Various libata do...
567
  	if (arg == NULL)
b095518ef   Jeff Garzik   [libata] ATA pass...
568
569
570
571
  		return -EINVAL;
  
  	if (copy_from_user(args, arg, sizeof(args)))
  		return -EFAULT;
af068bd1d   David Milburn   libata-scsi: ata_...
572
573
574
  	sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
  	if (!sensebuf)
  		return -ENOMEM;
b095518ef   Jeff Garzik   [libata] ATA pass...
575
576
577
  	memset(scsi_cmd, 0, sizeof(scsi_cmd));
  	scsi_cmd[0]  = ATA_16;
  	scsi_cmd[1]  = (3 << 1); /* Non-data */
af068bd1d   David Milburn   libata-scsi: ata_...
578
  	scsi_cmd[2]  = 0x20;     /* cc but no off.line or data xfer */
b095518ef   Jeff Garzik   [libata] ATA pass...
579
580
581
582
583
  	scsi_cmd[4]  = args[1];
  	scsi_cmd[6]  = args[2];
  	scsi_cmd[8]  = args[3];
  	scsi_cmd[10] = args[4];
  	scsi_cmd[12] = args[5];
277239f22   Mark Lord   libata bugfix: pr...
584
  	scsi_cmd[13] = args[6] & 0x4f;
b095518ef   Jeff Garzik   [libata] ATA pass...
585
  	scsi_cmd[14] = args[0];
b095518ef   Jeff Garzik   [libata] ATA pass...
586
  	/* Good values for timeout and retries?  Values below
2e9edbf81   Jeff Garzik   [libata] export a...
587
  	   from scsi_ioctl_send_command() for default case... */
af068bd1d   David Milburn   libata-scsi: ata_...
588
  	cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
589
  				sensebuf, (10*HZ), 5, 0, NULL);
af068bd1d   David Milburn   libata-scsi: ata_...
590
591
592
593
594
595
596
597
598
599
600
  
  	if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
  		u8 *desc = sensebuf + 8;
  		cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
  
  		/* If we set cc then ATA pass-through will cause a
  		 * check condition even if no error. Filter that. */
  		if (cmd_result & SAM_STAT_CHECK_CONDITION) {
  			struct scsi_sense_hdr sshdr;
  			scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
  						&sshdr);
2dcb407e6   Jeff Garzik   [libata] checkpat...
601
602
  			if (sshdr.sense_key == 0 &&
  				sshdr.asc == 0 && sshdr.ascq == 0)
af068bd1d   David Milburn   libata-scsi: ata_...
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
  				cmd_result &= ~SAM_STAT_CHECK_CONDITION;
  		}
  
  		/* Send userspace ATA registers */
  		if (sensebuf[0] == 0x72 &&	/* format is "descriptor" */
  				desc[0] == 0x09) {/* code is "ATA Descriptor" */
  			args[0] = desc[13];	/* status */
  			args[1] = desc[3];	/* error */
  			args[2] = desc[5];	/* sector count (0:7) */
  			args[3] = desc[7];	/* lbal */
  			args[4] = desc[9];	/* lbam */
  			args[5] = desc[11];	/* lbah */
  			args[6] = desc[12];	/* select */
  			if (copy_to_user(arg, args, sizeof(args)))
  				rc = -EFAULT;
  		}
  	}
  
  	if (cmd_result) {
b095518ef   Jeff Garzik   [libata] ATA pass...
622
  		rc = -EIO;
af068bd1d   David Milburn   libata-scsi: ata_...
623
624
  		goto error;
  	}
b095518ef   Jeff Garzik   [libata] ATA pass...
625

af068bd1d   David Milburn   libata-scsi: ata_...
626
627
   error:
  	kfree(sensebuf);
b095518ef   Jeff Garzik   [libata] ATA pass...
628
629
  	return rc;
  }
e3cf95dd6   Alan Cox   ata: Report 16/32...
630
631
632
633
634
635
636
637
  static int ata_ioc32(struct ata_port *ap)
  {
  	if (ap->flags & ATA_FLAG_PIO_DMA)
  		return 1;
  	if (ap->pflags & ATA_PFLAG_PIO32)
  		return 1;
  	return 0;
  }
94be9a58d   Jeff Garzik   [libata] get-iden...
638
639
  int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *scsidev,
  		     int cmd, void __user *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
640
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
  	int val = -EINVAL, rc = -EINVAL;
e3cf95dd6   Alan Cox   ata: Report 16/32...
642
  	unsigned long flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
644
645
  	switch (cmd) {
  	case ATA_IOC_GET_IO32:
e3cf95dd6   Alan Cox   ata: Report 16/32...
646
647
648
  		spin_lock_irqsave(ap->lock, flags);
  		val = ata_ioc32(ap);
  		spin_unlock_irqrestore(ap->lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
650
651
652
653
654
  		if (copy_to_user(arg, &val, 1))
  			return -EFAULT;
  		return 0;
  
  	case ATA_IOC_SET_IO32:
  		val = (unsigned long) arg;
e3cf95dd6   Alan Cox   ata: Report 16/32...
655
656
657
658
659
660
661
662
663
664
665
666
667
  		rc = 0;
  		spin_lock_irqsave(ap->lock, flags);
  		if (ap->pflags & ATA_PFLAG_PIO32CHANGE) {
  			if (val)
  				ap->pflags |= ATA_PFLAG_PIO32;
  			else
  				ap->pflags &= ~ATA_PFLAG_PIO32;
  		} else {
  			if (val != ata_ioc32(ap))
  				rc = -EINVAL;
  		}
  		spin_unlock_irqrestore(ap->lock, flags);
  		return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668

5924b74c1   Tejun Heo   libata: implement...
669
  	case HDIO_GET_IDENTITY:
94be9a58d   Jeff Garzik   [libata] get-iden...
670
  		return ata_get_identity(ap, scsidev, arg);
5924b74c1   Tejun Heo   libata: implement...
671

b095518ef   Jeff Garzik   [libata] ATA pass...
672
673
674
675
676
677
678
679
680
  	case HDIO_DRIVE_CMD:
  		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
  			return -EACCES;
  		return ata_cmd_ioctl(scsidev, arg);
  
  	case HDIO_DRIVE_TASK:
  		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
  			return -EACCES;
  		return ata_task_ioctl(scsidev, arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
682
683
684
  	default:
  		rc = -ENOTTY;
  		break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
686
  	return rc;
  }
94be9a58d   Jeff Garzik   [libata] get-iden...
687
688
689
690
691
692
693
694
  EXPORT_SYMBOL_GPL(ata_sas_scsi_ioctl);
  
  int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
  {
  	return ata_sas_scsi_ioctl(ata_shost_to_port(scsidev->host),
  				scsidev, cmd, arg);
  }
  EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
695
696
697
  
  /**
   *	ata_scsi_qc_new - acquire new ata_queued_cmd reference
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
699
   *	@dev: ATA device to which the new command is attached
   *	@cmd: SCSI command that originated this ATA command
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
701
702
703
704
705
706
707
708
709
   *
   *	Obtain a reference to an unused ata_queued_cmd structure,
   *	which is the basic libata structure representing a single
   *	ATA command sent to the hardware.
   *
   *	If a command was available, fill in the SCSI-specific
   *	portions of the structure with information on the
   *	current command.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
710
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
712
713
714
   *
   *	RETURNS:
   *	Command allocated, or %NULL if none available.
   */
7102d230d   Adrian Bunk   drivers/ata/: mak...
715
  static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
b27dcfb06   Jeff Garzik   [libata] avoid ne...
716
  					      struct scsi_cmnd *cmd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
718
  {
  	struct ata_queued_cmd *qc;
8a8bc2233   Tejun Heo   libata: revert co...
719
  	qc = ata_qc_new_init(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720
721
  	if (qc) {
  		qc->scsicmd = cmd;
b27dcfb06   Jeff Garzik   [libata] avoid ne...
722
  		qc->scsidone = cmd->scsi_done;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
723

ff2aeb1eb   Tejun Heo   libata: convert t...
724
  		qc->sg = scsi_sglist(cmd);
7120165cf   Boaz Harrosh   libata-scsi: conv...
725
  		qc->n_elem = scsi_sg_count(cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
726
727
  	} else {
  		cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
728
  		cmd->scsi_done(cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
730
731
732
  	}
  
  	return qc;
  }
aacda3753   Tejun Heo   libata: implement...
733
734
735
736
737
738
739
  static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc)
  {
  	struct scsi_cmnd *scmd = qc->scsicmd;
  
  	qc->extrabytes = scmd->request->extra_len;
  	qc->nbytes = scsi_bufflen(scmd) + qc->extrabytes;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
740
  /**
b095518ef   Jeff Garzik   [libata] ATA pass...
741
742
743
744
745
746
747
748
749
750
751
   *	ata_dump_status - user friendly display of error info
   *	@id: id of the port in question
   *	@tf: ptr to filled out taskfile
   *
   *	Decode and dump the ATA error/status registers for the user so
   *	that they have some idea what really happened at the non
   *	make-believe layer.
   *
   *	LOCKING:
   *	inherited from caller
   */
7102d230d   Adrian Bunk   drivers/ata/: mak...
752
  static void ata_dump_status(unsigned id, struct ata_taskfile *tf)
b095518ef   Jeff Garzik   [libata] ATA pass...
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
  {
  	u8 stat = tf->command, err = tf->feature;
  
  	printk(KERN_WARNING "ata%u: status=0x%02x { ", id, stat);
  	if (stat & ATA_BUSY) {
  		printk("Busy }
  ");	/* Data is not valid in this case */
  	} else {
  		if (stat & 0x40)	printk("DriveReady ");
  		if (stat & 0x20)	printk("DeviceFault ");
  		if (stat & 0x10)	printk("SeekComplete ");
  		if (stat & 0x08)	printk("DataRequest ");
  		if (stat & 0x04)	printk("CorrectedError ");
  		if (stat & 0x02)	printk("Index ");
  		if (stat & 0x01)	printk("Error ");
  		printk("}
  ");
  
  		if (err) {
  			printk(KERN_WARNING "ata%u: error=0x%02x { ", id, err);
  			if (err & 0x04)		printk("DriveStatusError ");
  			if (err & 0x80) {
  				if (err & 0x04)	printk("BadCRC ");
  				else		printk("Sector ");
  			}
  			if (err & 0x40)		printk("UncorrectableError ");
  			if (err & 0x10)		printk("SectorIdNotFound ");
  			if (err & 0x02)		printk("TrackZeroNotFound ");
  			if (err & 0x01)		printk("AddrMarkNotFound ");
  			printk("}
  ");
  		}
  	}
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789
   *	ata_to_sense_error - convert ATA error to SCSI error
8e8b77dd4   Randy Dunlap   [PATCH] libata ke...
790
   *	@id: ATA device number
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
791
   *	@drv_stat: value contained in ATA status register
b095518ef   Jeff Garzik   [libata] ATA pass...
792
793
794
795
   *	@drv_err: value contained in ATA error register
   *	@sk: the sense key we'll fill out
   *	@asc: the additional sense code we'll fill out
   *	@ascq: the additional sense code qualifier we'll fill out
246619da3   Tejun Heo   [PATCH] libata-eh...
796
   *	@verbose: be verbose
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
   *
b095518ef   Jeff Garzik   [libata] ATA pass...
798
799
800
   *	Converts an ATA error into a SCSI error.  Fill out pointers to
   *	SK, ASC, and ASCQ bytes for later use in fixed or descriptor
   *	format sense blocks.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
802
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
803
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
804
   */
7102d230d   Adrian Bunk   drivers/ata/: mak...
805
806
  static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
  			       u8 *asc, u8 *ascq, int verbose)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807
  {
b095518ef   Jeff Garzik   [libata] ATA pass...
808
  	int i;
ffe75ef65   Jeff Garzik   Merge branch 'ups...
809

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
810
  	/* Based on the 3ware driver translation table */
98ac62def   Arjan van de Ven   [PATCH] mark seve...
811
  	static const unsigned char sense_table[][4] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
  		/* BBD|ECC|ID|MAR */
  		{0xd1, 		ABORTED_COMMAND, 0x00, 0x00}, 	// Device busy                  Aborted command
  		/* BBD|ECC|ID */
  		{0xd0,  	ABORTED_COMMAND, 0x00, 0x00}, 	// Device busy                  Aborted command
  		/* ECC|MC|MARK */
  		{0x61, 		HARDWARE_ERROR, 0x00, 0x00}, 	// Device fault                 Hardware error
  		/* ICRC|ABRT */		/* NB: ICRC & !ABRT is BBD */
  		{0x84, 		ABORTED_COMMAND, 0x47, 0x00}, 	// Data CRC error               SCSI parity error
  		/* MC|ID|ABRT|TRK0|MARK */
  		{0x37, 		NOT_READY, 0x04, 0x00}, 	// Unit offline                 Not ready
  		/* MCR|MARK */
  		{0x09, 		NOT_READY, 0x04, 0x00}, 	// Unrecovered disk error       Not ready
  		/*  Bad address mark */
  		{0x01, 		MEDIUM_ERROR, 0x13, 0x00}, 	// Address mark not found       Address mark not found for data field
  		/* TRK0 */
  		{0x02, 		HARDWARE_ERROR, 0x00, 0x00}, 	// Track 0 not found		  Hardware error
  		/* Abort & !ICRC */
  		{0x04, 		ABORTED_COMMAND, 0x00, 0x00}, 	// Aborted command              Aborted command
  		/* Media change request */
  		{0x08, 		NOT_READY, 0x04, 0x00}, 	// Media change request	  FIXME: faking offline
  		/* SRV */
  		{0x10, 		ABORTED_COMMAND, 0x14, 0x00}, 	// ID not found                 Recorded entity not found
  		/* Media change */
  		{0x08,  	NOT_READY, 0x04, 0x00}, 	// Media change		  FIXME: faking offline
  		/* ECC */
  		{0x40, 		MEDIUM_ERROR, 0x11, 0x04}, 	// Uncorrectable ECC error      Unrecovered read error
  		/* BBD - block marked bad */
  		{0x80, 		MEDIUM_ERROR, 0x11, 0x04}, 	// Block marked bad		  Medium error, unrecovered read error
  		{0xFF, 0xFF, 0xFF, 0xFF}, // END mark
  	};
98ac62def   Arjan van de Ven   [PATCH] mark seve...
842
  	static const unsigned char stat_table[][4] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
844
845
846
847
848
849
  		/* Must be first because BUSY means no other bits valid */
  		{0x80, 		ABORTED_COMMAND, 0x47, 0x00},	// Busy, fake parity for now
  		{0x20, 		HARDWARE_ERROR,  0x00, 0x00}, 	// Device fault
  		{0x08, 		ABORTED_COMMAND, 0x47, 0x00},	// Timed out in xfer, fake parity for now
  		{0x04, 		RECOVERED_ERROR, 0x11, 0x00},	// Recovered ECC error	  Medium error, recovered
  		{0xFF, 0xFF, 0xFF, 0xFF}, // END mark
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
850

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
851
852
853
  	/*
  	 *	Is this an error we can process/parse
  	 */
b095518ef   Jeff Garzik   [libata] ATA pass...
854
855
  	if (drv_stat & ATA_BUSY) {
  		drv_err = 0;	/* Ignore the err bits, they're invalid */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
856
  	}
b095518ef   Jeff Garzik   [libata] ATA pass...
857
858
859
860
861
  
  	if (drv_err) {
  		/* Look for drv_err */
  		for (i = 0; sense_table[i][0] != 0xFF; i++) {
  			/* Look for best matches first */
2e9edbf81   Jeff Garzik   [libata] export a...
862
  			if ((sense_table[i][0] & drv_err) ==
b095518ef   Jeff Garzik   [libata] ATA pass...
863
864
865
866
867
868
869
870
  			    sense_table[i][0]) {
  				*sk = sense_table[i][1];
  				*asc = sense_table[i][2];
  				*ascq = sense_table[i][3];
  				goto translate_done;
  			}
  		}
  		/* No immediate match */
246619da3   Tejun Heo   [PATCH] libata-eh...
871
872
873
874
  		if (verbose)
  			printk(KERN_WARNING "ata%u: no sense translation for "
  			       "error 0x%02x
  ", id, drv_err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875
  	}
b095518ef   Jeff Garzik   [libata] ATA pass...
876
877
878
879
880
881
882
883
  
  	/* Fall back to interpreting status bits */
  	for (i = 0; stat_table[i][0] != 0xFF; i++) {
  		if (stat_table[i][0] & drv_stat) {
  			*sk = stat_table[i][1];
  			*asc = stat_table[i][2];
  			*ascq = stat_table[i][3];
  			goto translate_done;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
884
  		}
b095518ef   Jeff Garzik   [libata] ATA pass...
885
886
  	}
  	/* No error?  Undecoded? */
246619da3   Tejun Heo   [PATCH] libata-eh...
887
888
889
890
  	if (verbose)
  		printk(KERN_WARNING "ata%u: no sense translation for "
  		       "status: 0x%02x
  ", id, drv_stat);
b095518ef   Jeff Garzik   [libata] ATA pass...
891

2d2020242   Alan Cox   [PATCH] libata: p...
892
893
894
895
896
  	/* We need a sensible error return here, which is tricky, and one
  	   that won't cause people to do things like return a disk wrongly */
  	*sk = ABORTED_COMMAND;
  	*asc = 0x00;
  	*ascq = 0x00;
b095518ef   Jeff Garzik   [libata] ATA pass...
897
898
  
   translate_done:
246619da3   Tejun Heo   [PATCH] libata-eh...
899
900
901
902
903
  	if (verbose)
  		printk(KERN_ERR "ata%u: translated ATA stat/err 0x%02x/%02x "
  		       "to SCSI SK/ASC/ASCQ 0x%x/%02x/%02x
  ",
  		       id, drv_stat, drv_err, *sk, *asc, *ascq);
b095518ef   Jeff Garzik   [libata] ATA pass...
904
905
906
907
  	return;
  }
  
  /*
750426aa1   Tejun Heo   [PATCH] libata: c...
908
   *	ata_gen_passthru_sense - Generate check condition sense block.
b095518ef   Jeff Garzik   [libata] ATA pass...
909
910
911
912
913
914
915
916
917
   *	@qc: Command that completed.
   *
   *	This function is specific to the ATA descriptor format sense
   *	block specified for the ATA pass through commands.  Regardless
   *	of whether the command errored or not, return a sense
   *	block. Copy all controller registers into the sense
   *	block. Clear sense key, ASC & ASCQ if there is no error.
   *
   *	LOCKING:
750426aa1   Tejun Heo   [PATCH] libata: c...
918
   *	None.
b095518ef   Jeff Garzik   [libata] ATA pass...
919
   */
750426aa1   Tejun Heo   [PATCH] libata: c...
920
  static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
b095518ef   Jeff Garzik   [libata] ATA pass...
921
922
  {
  	struct scsi_cmnd *cmd = qc->scsicmd;
e61e06722   Tejun Heo   [PATCH] libata: i...
923
  	struct ata_taskfile *tf = &qc->result_tf;
b095518ef   Jeff Garzik   [libata] ATA pass...
924
925
  	unsigned char *sb = cmd->sense_buffer;
  	unsigned char *desc = sb + 8;
246619da3   Tejun Heo   [PATCH] libata-eh...
926
  	int verbose = qc->ap->ops->error_handler == NULL;
b095518ef   Jeff Garzik   [libata] ATA pass...
927
928
  
  	memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
0e5dec478   Jeff Garzik   [libata passthru]...
929
  	cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
b095518ef   Jeff Garzik   [libata] ATA pass...
930
931
  
  	/*
b095518ef   Jeff Garzik   [libata] ATA pass...
932
933
934
  	 * Use ata_to_sense_error() to map status register bits
  	 * onto sense key, asc & ascq.
  	 */
058e55e12   Tejun Heo   [PATCH] libata: a...
935
936
  	if (qc->err_mask ||
  	    tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
44877b4e2   Tejun Heo   libata: s/ap->id/...
937
  		ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature,
246619da3   Tejun Heo   [PATCH] libata-eh...
938
  				   &sb[1], &sb[2], &sb[3], verbose);
b095518ef   Jeff Garzik   [libata] ATA pass...
939
  		sb[1] &= 0x0f;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
  	}
b095518ef   Jeff Garzik   [libata] ATA pass...
941
942
943
944
  	/*
  	 * Sense data is current and format is descriptor.
  	 */
  	sb[0] = 0x72;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
945

b095518ef   Jeff Garzik   [libata] ATA pass...
946
  	desc[0] = 0x09;
f38621b31   Tejun Heo   [PATCH] libata: f...
947
948
949
  	/* set length of additional sense data */
  	sb[7] = 14;
  	desc[1] = 12;
b095518ef   Jeff Garzik   [libata] ATA pass...
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
  
  	/*
  	 * Copy registers into sense buffer.
  	 */
  	desc[2] = 0x00;
  	desc[3] = tf->feature;	/* == error reg */
  	desc[5] = tf->nsect;
  	desc[7] = tf->lbal;
  	desc[9] = tf->lbam;
  	desc[11] = tf->lbah;
  	desc[12] = tf->device;
  	desc[13] = tf->command; /* == status reg */
  
  	/*
  	 * Fill in Extend bit, and the high order bytes
  	 * if applicable.
  	 */
  	if (tf->flags & ATA_TFLAG_LBA48) {
  		desc[2] |= 0x01;
  		desc[4] = tf->hob_nsect;
  		desc[6] = tf->hob_lbal;
  		desc[8] = tf->hob_lbam;
  		desc[10] = tf->hob_lbah;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
  	}
b095518ef   Jeff Garzik   [libata] ATA pass...
974
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975

b095518ef   Jeff Garzik   [libata] ATA pass...
976
  /**
750426aa1   Tejun Heo   [PATCH] libata: c...
977
   *	ata_gen_ata_sense - generate a SCSI fixed sense block
b095518ef   Jeff Garzik   [libata] ATA pass...
978
979
   *	@qc: Command that we are erroring out
   *
d25614bad   Tejun Heo   [PATCH] libata: i...
980
   *	Generate sense block for a failed ATA command @qc.  Descriptor
25985edce   Lucas De Marchi   Fix common misspe...
981
   *	format is used to accommodate LBA48 block address.
b095518ef   Jeff Garzik   [libata] ATA pass...
982
983
   *
   *	LOCKING:
750426aa1   Tejun Heo   [PATCH] libata: c...
984
   *	None.
b095518ef   Jeff Garzik   [libata] ATA pass...
985
   */
750426aa1   Tejun Heo   [PATCH] libata: c...
986
  static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
b095518ef   Jeff Garzik   [libata] ATA pass...
987
  {
d25614bad   Tejun Heo   [PATCH] libata: i...
988
  	struct ata_device *dev = qc->dev;
b095518ef   Jeff Garzik   [libata] ATA pass...
989
  	struct scsi_cmnd *cmd = qc->scsicmd;
e61e06722   Tejun Heo   [PATCH] libata: i...
990
  	struct ata_taskfile *tf = &qc->result_tf;
b095518ef   Jeff Garzik   [libata] ATA pass...
991
  	unsigned char *sb = cmd->sense_buffer;
d25614bad   Tejun Heo   [PATCH] libata: i...
992
  	unsigned char *desc = sb + 8;
246619da3   Tejun Heo   [PATCH] libata-eh...
993
  	int verbose = qc->ap->ops->error_handler == NULL;
d25614bad   Tejun Heo   [PATCH] libata: i...
994
  	u64 block;
b095518ef   Jeff Garzik   [libata] ATA pass...
995
996
  
  	memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
0e5dec478   Jeff Garzik   [libata passthru]...
997
  	cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
b095518ef   Jeff Garzik   [libata] ATA pass...
998

d25614bad   Tejun Heo   [PATCH] libata: i...
999
1000
1001
1002
  	/* sense data is current and format is descriptor */
  	sb[0] = 0x72;
  
  	/* Use ata_to_sense_error() to map status register bits
b095518ef   Jeff Garzik   [libata] ATA pass...
1003
1004
  	 * onto sense key, asc & ascq.
  	 */
058e55e12   Tejun Heo   [PATCH] libata: a...
1005
1006
  	if (qc->err_mask ||
  	    tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
44877b4e2   Tejun Heo   libata: s/ap->id/...
1007
  		ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature,
d25614bad   Tejun Heo   [PATCH] libata: i...
1008
1009
  				   &sb[1], &sb[2], &sb[3], verbose);
  		sb[1] &= 0x0f;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011

d25614bad   Tejun Heo   [PATCH] libata: i...
1012
  	block = ata_tf_read_block(&qc->result_tf, dev);
a7dac447b   Jeff Garzik   [libata] change a...
1013

d25614bad   Tejun Heo   [PATCH] libata: i...
1014
1015
1016
1017
  	/* information sense data descriptor */
  	sb[7] = 12;
  	desc[0] = 0x00;
  	desc[1] = 10;
a7dac447b   Jeff Garzik   [libata] change a...
1018

d25614bad   Tejun Heo   [PATCH] libata: i...
1019
1020
1021
1022
1023
1024
1025
  	desc[2] |= 0x80;	/* valid */
  	desc[6] = block >> 40;
  	desc[7] = block >> 32;
  	desc[8] = block >> 24;
  	desc[9] = block >> 16;
  	desc[10] = block >> 8;
  	desc[11] = block;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
  }
a6cce2a79   Brian King   [PATCH] libata: a...
1027
1028
1029
1030
  static void ata_scsi_sdev_config(struct scsi_device *sdev)
  {
  	sdev->use_10_for_rw = 1;
  	sdev->use_10_for_ms = 1;
31cc23b34   Tejun Heo   libata-pmp-prep: ...
1031
1032
1033
1034
1035
1036
1037
  
  	/* Schedule policy is determined by ->qc_defer() callback and
  	 * it needs to see every deferred qc.  Set dev_blocked to 1 to
  	 * prevent SCSI midlayer from automatically deferring
  	 * requests.
  	 */
  	sdev->max_device_blocked = 1;
a6cce2a79   Brian King   [PATCH] libata: a...
1038
  }
fa2fc7f48   James Bottomley   libata: implement...
1039
1040
  /**
   *	atapi_drain_needed - Check whether data transfer may overflow
73fd8b6d3   Randy Dunlap   libata: fix kerne...
1041
   *	@rq: request to be checked
fa2fc7f48   James Bottomley   libata: implement...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
   *
   *	ATAPI commands which transfer variable length data to host
   *	might overflow due to application error or hardare bug.  This
   *	function checks whether overflow should be drained and ignored
   *	for @request.
   *
   *	LOCKING:
   *	None.
   *
   *	RETURNS:
   *	1 if ; otherwise, 0.
   */
  static int atapi_drain_needed(struct request *rq)
  {
33659ebba   Christoph Hellwig   block: remove wra...
1056
  	if (likely(rq->cmd_type != REQ_TYPE_BLOCK_PC))
fa2fc7f48   James Bottomley   libata: implement...
1057
  		return 0;
7b6d91dae   Christoph Hellwig   block: unify flag...
1058
  	if (!blk_rq_bytes(rq) || (rq->cmd_flags & REQ_WRITE))
fa2fc7f48   James Bottomley   libata: implement...
1059
1060
1061
1062
1063
1064
1065
  		return 0;
  
  	return atapi_cmd_type(rq->cmd[0]) == ATAPI_MISC;
  }
  
  static int ata_scsi_dev_config(struct scsi_device *sdev,
  			       struct ata_device *dev)
a6cce2a79   Brian King   [PATCH] libata: a...
1066
  {
900e599eb   shaohua.li@intel.com   SATA: enable non-...
1067
  	struct request_queue *q = sdev->request_queue;
45fabbb77   Elias Oltmanns   libata: Implement...
1068
1069
  	if (!ata_id_has_unload(dev->id))
  		dev->flags |= ATA_DFLAG_NO_UNLOAD;
914ed354b   Tejun Heo   [PATCH] libata: m...
1070
  	/* configure max sectors */
900e599eb   shaohua.li@intel.com   SATA: enable non-...
1071
  	blk_queue_max_hw_sectors(q, dev->max_sectors);
a6cce2a79   Brian King   [PATCH] libata: a...
1072

fa2fc7f48   James Bottomley   libata: implement...
1073
  	if (dev->class == ATA_DEV_ATAPI) {
fa2fc7f48   James Bottomley   libata: implement...
1074
  		void *buf;
729a6a300   Tejun Heo   libata: set queue...
1075
1076
1077
  		sdev->sector_size = ATA_SECT_SIZE;
  
  		/* set DMA padding */
900e599eb   shaohua.li@intel.com   SATA: enable non-...
1078
  		blk_queue_update_dma_pad(q, ATA_DMA_PAD_SZ - 1);
fa2fc7f48   James Bottomley   libata: implement...
1079
1080
1081
1082
  
  		/* configure draining */
  		buf = kmalloc(ATAPI_MAX_DRAIN, q->bounce_gfp | GFP_KERNEL);
  		if (!buf) {
a9a79dfec   Joe Perches   ata: Convert ata_...
1083
1084
  			ata_dev_err(dev, "drain buffer allocation failed
  ");
fa2fc7f48   James Bottomley   libata: implement...
1085
1086
1087
1088
1089
  			return -ENOMEM;
  		}
  
  		blk_queue_dma_drain(q, atapi_drain_needed, buf, ATAPI_MAX_DRAIN);
  	} else {
295124dce   Grant Grundler   [libata] support ...
1090
  		sdev->sector_size = ata_id_logical_sector_size(dev->id);
d8cf5389b   Tejun Heo   libata: relocate ...
1091
  		sdev->manage_start_stop = 1;
dde202075   James Bottomley   libata: eliminate...
1092
  	}
d8cf5389b   Tejun Heo   libata: relocate ...
1093

729a6a300   Tejun Heo   libata: set queue...
1094
1095
1096
1097
1098
1099
1100
1101
  	/*
  	 * ata_pio_sectors() expects buffer for each sector to not cross
  	 * page boundary.  Enforce it by requiring buffers to be sector
  	 * aligned, which works iff sector_size is not larger than
  	 * PAGE_SIZE.  ATAPI devices also need the alignment as
  	 * IDENTIFY_PACKET is executed as ATA_PROT_PIO.
  	 */
  	if (sdev->sector_size > PAGE_SIZE)
a9a79dfec   Joe Perches   ata: Convert ata_...
1102
  		ata_dev_warn(dev,
729a6a300   Tejun Heo   libata: set queue...
1103
1104
1105
  			"sector_size=%u > PAGE_SIZE, PIO may malfunction
  ",
  			sdev->sector_size);
900e599eb   shaohua.li@intel.com   SATA: enable non-...
1106
  	blk_queue_update_dma_alignment(q, sdev->sector_size - 1);
729a6a300   Tejun Heo   libata: set queue...
1107

f26792d5c   Jeff Garzik   [libata] Utilize ...
1108
1109
  	if (dev->flags & ATA_DFLAG_AN)
  		set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1110
1111
1112
1113
1114
  	if (dev->flags & ATA_DFLAG_NCQ) {
  		int depth;
  
  		depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id));
  		depth = min(ATA_MAX_QUEUE - 1, depth);
8a8bc2233   Tejun Heo   libata: revert co...
1115
  		scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth);
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1116
  	}
fa2fc7f48   James Bottomley   libata: implement...
1117

900e599eb   shaohua.li@intel.com   SATA: enable non-...
1118
  	blk_queue_flush_queueable(q, false);
295124dce   Grant Grundler   [libata] support ...
1119
  	dev->sdev = sdev;
fa2fc7f48   James Bottomley   libata: implement...
1120
  	return 0;
a6cce2a79   Brian King   [PATCH] libata: a...
1121
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
  /**
   *	ata_scsi_slave_config - Set SCSI device attributes
   *	@sdev: SCSI device to examine
   *
   *	This is called before we actually start reading
   *	and writing to the device, to configure certain
   *	SCSI mid-layer behaviors.
   *
   *	LOCKING:
   *	Defined by SCSI layer.  We don't really care.
   */
  
  int ata_scsi_slave_config(struct scsi_device *sdev)
  {
315343637   Tejun Heo   [PATCH] libata-hp...
1136
1137
  	struct ata_port *ap = ata_shost_to_port(sdev->host);
  	struct ata_device *dev = __ata_scsi_find_dev(ap, sdev);
fa2fc7f48   James Bottomley   libata: implement...
1138
  	int rc = 0;
315343637   Tejun Heo   [PATCH] libata-hp...
1139

a6cce2a79   Brian King   [PATCH] libata: a...
1140
  	ata_scsi_sdev_config(sdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141

315343637   Tejun Heo   [PATCH] libata-hp...
1142
  	if (dev)
fa2fc7f48   James Bottomley   libata: implement...
1143
  		rc = ata_scsi_dev_config(sdev, dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1144

fa2fc7f48   James Bottomley   libata: implement...
1145
  	return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1146
1147
1148
  }
  
  /**
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
   *	ata_scsi_slave_destroy - SCSI device is about to be destroyed
   *	@sdev: SCSI device to be destroyed
   *
   *	@sdev is about to be destroyed for hot/warm unplugging.  If
   *	this unplugging was initiated by libata as indicated by NULL
   *	dev->sdev, this function doesn't have to do anything.
   *	Otherwise, SCSI layer initiated warm-unplug is in progress.
   *	Clear dev->sdev, schedule the device for ATA detach and invoke
   *	EH.
   *
   *	LOCKING:
   *	Defined by SCSI layer.  We don't really care.
   */
  void ata_scsi_slave_destroy(struct scsi_device *sdev)
  {
  	struct ata_port *ap = ata_shost_to_port(sdev->host);
fa2fc7f48   James Bottomley   libata: implement...
1165
  	struct request_queue *q = sdev->request_queue;
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
1166
1167
1168
1169
1170
  	unsigned long flags;
  	struct ata_device *dev;
  
  	if (!ap->ops->error_handler)
  		return;
ba6a13083   Jeff Garzik   [libata] Add host...
1171
  	spin_lock_irqsave(ap->lock, flags);
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
1172
1173
1174
1175
1176
1177
1178
  	dev = __ata_scsi_find_dev(ap, sdev);
  	if (dev && dev->sdev) {
  		/* SCSI device already in CANCEL state, no need to offline it */
  		dev->sdev = NULL;
  		dev->flags |= ATA_DFLAG_DETACH;
  		ata_port_schedule_eh(ap);
  	}
ba6a13083   Jeff Garzik   [libata] Add host...
1179
  	spin_unlock_irqrestore(ap->lock, flags);
fa2fc7f48   James Bottomley   libata: implement...
1180
1181
1182
1183
  
  	kfree(q->dma_drain_buffer);
  	q->dma_drain_buffer = NULL;
  	q->dma_drain_size = 0;
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
1184
1185
1186
  }
  
  /**
f6e67035a   Dan Williams   [SCSI] libsas,lib...
1187
   *	__ata_change_queue_depth - helper for ata_scsi_change_queue_depth
6d2dd0542   Marcos Paulo de Souza   [libata] libata-s...
1188
1189
1190
1191
   *	@ap: ATA port to which the device change the queue depth
   *	@sdev: SCSI device to configure queue depth for
   *	@queue_depth: new queue depth
   *	@reason: calling context
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1192
   *
f6e67035a   Dan Williams   [SCSI] libsas,lib...
1193
1194
   *	libsas and libata have different approaches for associating a sdev to
   *	its ata_port.
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1195
   *
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1196
   */
f6e67035a   Dan Williams   [SCSI] libsas,lib...
1197
1198
  int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
  			     int queue_depth, int reason)
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1199
  {
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1200
  	struct ata_device *dev;
360f654e7   Tejun Heo   [PATCH] libata: t...
1201
  	unsigned long flags;
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1202

e881a172d   Mike Christie   [SCSI] modify cha...
1203
1204
  	if (reason != SCSI_QDEPTH_DEFAULT)
  		return -EOPNOTSUPP;
c3c70c443   Tejun Heo   libata: fix ata_s...
1205
  	if (queue_depth < 1 || queue_depth == sdev->queue_depth)
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1206
1207
1208
1209
1210
  		return sdev->queue_depth;
  
  	dev = ata_scsi_find_dev(ap, sdev);
  	if (!dev || !ata_dev_enabled(dev))
  		return sdev->queue_depth;
c3c70c443   Tejun Heo   libata: fix ata_s...
1211
  	/* NCQ enabled? */
360f654e7   Tejun Heo   [PATCH] libata: t...
1212
  	spin_lock_irqsave(ap->lock, flags);
c3c70c443   Tejun Heo   libata: fix ata_s...
1213
1214
  	dev->flags &= ~ATA_DFLAG_NCQ_OFF;
  	if (queue_depth == 1 || !ata_ncq_enabled(dev)) {
360f654e7   Tejun Heo   [PATCH] libata: t...
1215
  		dev->flags |= ATA_DFLAG_NCQ_OFF;
c3c70c443   Tejun Heo   libata: fix ata_s...
1216
1217
  		queue_depth = 1;
  	}
360f654e7   Tejun Heo   [PATCH] libata: t...
1218
  	spin_unlock_irqrestore(ap->lock, flags);
c3c70c443   Tejun Heo   libata: fix ata_s...
1219
1220
1221
1222
1223
1224
1225
1226
1227
  	/* limit and apply queue depth */
  	queue_depth = min(queue_depth, sdev->host->can_queue);
  	queue_depth = min(queue_depth, ata_id_queue_depth(dev->id));
  	queue_depth = min(queue_depth, ATA_MAX_QUEUE - 1);
  
  	if (sdev->queue_depth == queue_depth)
  		return -EINVAL;
  
  	scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth);
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1228
1229
1230
1231
  	return queue_depth;
  }
  
  /**
f6e67035a   Dan Williams   [SCSI] libsas,lib...
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
   *	ata_scsi_change_queue_depth - SCSI callback for queue depth config
   *	@sdev: SCSI device to configure queue depth for
   *	@queue_depth: new queue depth
   *	@reason: calling context
   *
   *	This is libata standard hostt->change_queue_depth callback.
   *	SCSI will call into this callback when user tries to set queue
   *	depth via sysfs.
   *
   *	LOCKING:
   *	SCSI layer (we don't care)
   *
   *	RETURNS:
   *	Newly configured queue depth.
   */
  int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth,
  				int reason)
  {
  	struct ata_port *ap = ata_shost_to_port(sdev->host);
  
  	return __ata_change_queue_depth(ap, sdev, queue_depth, reason);
  }
  
  /**
972dcafb6   Douglas Gilbert   [libata scsi] add...
1256
1257
   *	ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
   *	@qc: Storage for translated ATA taskfile
972dcafb6   Douglas Gilbert   [libata scsi] add...
1258
1259
1260
1261
1262
1263
1264
   *
   *	Sets up an ATA taskfile to issue STANDBY (to stop) or READ VERIFY
   *	(to start). Perhaps these commands should be preceded by
   *	CHECK POWER MODE to see what power mode the device is already in.
   *	[See SAT revision 5 at www.t10.org]
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1265
   *	spin_lock_irqsave(host lock)
972dcafb6   Douglas Gilbert   [libata scsi] add...
1266
1267
1268
1269
   *
   *	RETURNS:
   *	Zero on success, non-zero on error.
   */
ad706991f   Tejun Heo   [PATCH] libata: k...
1270
  static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
972dcafb6   Douglas Gilbert   [libata scsi] add...
1271
  {
542b1444c   Tejun Heo   [PATCH] libata: c...
1272
  	struct scsi_cmnd *scmd = qc->scsicmd;
972dcafb6   Douglas Gilbert   [libata scsi] add...
1273
  	struct ata_taskfile *tf = &qc->tf;
ad706991f   Tejun Heo   [PATCH] libata: k...
1274
  	const u8 *cdb = scmd->cmnd;
972dcafb6   Douglas Gilbert   [libata scsi] add...
1275

2e5704f63   Tejun Heo   [PATCH] libata: t...
1276
1277
  	if (scmd->cmd_len < 5)
  		goto invalid_fld;
972dcafb6   Douglas Gilbert   [libata scsi] add...
1278
1279
  	tf->flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
  	tf->protocol = ATA_PROT_NODATA;
542b1444c   Tejun Heo   [PATCH] libata: c...
1280
  	if (cdb[1] & 0x1) {
972dcafb6   Douglas Gilbert   [libata scsi] add...
1281
1282
  		;	/* ignore IMMED bit, violates sat-r05 */
  	}
542b1444c   Tejun Heo   [PATCH] libata: c...
1283
  	if (cdb[4] & 0x2)
ae0065102   Douglas Gilbert   [libata scsi] imp...
1284
  		goto invalid_fld;       /* LOEJ bit set not supported */
542b1444c   Tejun Heo   [PATCH] libata: c...
1285
  	if (((cdb[4] >> 4) & 0xf) != 0)
ae0065102   Douglas Gilbert   [libata scsi] imp...
1286
  		goto invalid_fld;       /* power conditions not supported */
e31e8531d   Tejun Heo   libata-pmp-prep: ...
1287

542b1444c   Tejun Heo   [PATCH] libata: c...
1288
  	if (cdb[4] & 0x1) {
972dcafb6   Douglas Gilbert   [libata scsi] add...
1289
  		tf->nsect = 1;	/* 1 sector, lba=0 */
9d5b13021   Albert Lee   [libata scsi] add...
1290
1291
  
  		if (qc->dev->flags & ATA_DFLAG_LBA) {
c44078c03   Tejun Heo   [PATCH] libata: s...
1292
  			tf->flags |= ATA_TFLAG_LBA;
9d5b13021   Albert Lee   [libata scsi] add...
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
  
  			tf->lbah = 0x0;
  			tf->lbam = 0x0;
  			tf->lbal = 0x0;
  			tf->device |= ATA_LBA;
  		} else {
  			/* CHS */
  			tf->lbal = 0x1; /* sect */
  			tf->lbam = 0x0; /* cyl low */
  			tf->lbah = 0x0; /* cyl high */
  		}
972dcafb6   Douglas Gilbert   [libata scsi] add...
1304
  		tf->command = ATA_CMD_VERIFY;	/* READ VERIFY */
920a4b103   Tejun Heo   libata: implement...
1305
  	} else {
2a6e58d27   Rafael J. Wysocki   SATA: Blacklistin...
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
  		/* Some odd clown BIOSen issue spindown on power off (ACPI S4
  		 * or S5) causing some drives to spin up and down again.
  		 */
  		if ((qc->ap->flags & ATA_FLAG_NO_POWEROFF_SPINDOWN) &&
  		    system_state == SYSTEM_POWER_OFF)
  			goto skip;
  
  		if ((qc->ap->flags & ATA_FLAG_NO_HIBERNATE_SPINDOWN) &&
  		     system_entering_hibernation())
  			goto skip;
78981a7c6   Robert Hancock   libata: fix trans...
1316
1317
  		/* Issue ATA STANDBY IMMEDIATE command */
  		tf->command = ATA_CMD_STANDBYNOW1;
920a4b103   Tejun Heo   libata: implement...
1318
  	}
78981a7c6   Robert Hancock   libata: fix trans...
1319

972dcafb6   Douglas Gilbert   [libata scsi] add...
1320
1321
1322
1323
1324
1325
1326
1327
  	/*
  	 * Standby and Idle condition timers could be implemented but that
  	 * would require libata to implement the Power condition mode page
  	 * and allow the user to change it. Changing mode pages requires
  	 * MODE SELECT to be implemented.
  	 */
  
  	return 0;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1328

2a6e58d27   Rafael J. Wysocki   SATA: Blacklistin...
1329
   invalid_fld:
542b1444c   Tejun Heo   [PATCH] libata: c...
1330
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1331
1332
  	/* "Invalid field in cbd" */
  	return 1;
2a6e58d27   Rafael J. Wysocki   SATA: Blacklistin...
1333
1334
1335
   skip:
  	scmd->result = SAM_STAT_GOOD;
  	return 1;
972dcafb6   Douglas Gilbert   [libata scsi] add...
1336
1337
1338
1339
  }
  
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1340
1341
   *	ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command
   *	@qc: Storage for translated ATA taskfile
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1342
1343
1344
1345
1346
   *
   *	Sets up an ATA taskfile to issue FLUSH CACHE or
   *	FLUSH CACHE EXT.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1347
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348
1349
1350
1351
   *
   *	RETURNS:
   *	Zero on success, non-zero on error.
   */
ad706991f   Tejun Heo   [PATCH] libata: k...
1352
  static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1353
1354
1355
1356
1357
  {
  	struct ata_taskfile *tf = &qc->tf;
  
  	tf->flags |= ATA_TFLAG_DEVICE;
  	tf->protocol = ATA_PROT_NODATA;
6fc49adb9   Tejun Heo   [PATCH] libata: u...
1358
  	if (qc->dev->flags & ATA_DFLAG_FLUSH_EXT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1359
1360
1361
  		tf->command = ATA_CMD_FLUSH_EXT;
  	else
  		tf->command = ATA_CMD_FLUSH;
b666da35d   Tejun Heo   libata: flush is ...
1362
1363
  	/* flush is critical for IO integrity, consider it an IO command */
  	qc->flags |= ATA_QCFLAG_IO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1364
1365
1366
1367
  	return 0;
  }
  
  /**
3aef52311   Albert Lee   [libata scsi] tid...
1368
   *	scsi_6_lba_len - Get LBA and transfer length
542b1444c   Tejun Heo   [PATCH] libata: c...
1369
   *	@cdb: SCSI command to translate
3aef52311   Albert Lee   [libata scsi] tid...
1370
1371
1372
1373
1374
1375
1376
   *
   *	Calculate LBA and transfer length for 6-byte commands.
   *
   *	RETURNS:
   *	@plba: the LBA
   *	@plen: the transfer length
   */
542b1444c   Tejun Heo   [PATCH] libata: c...
1377
  static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
3aef52311   Albert Lee   [libata scsi] tid...
1378
1379
  {
  	u64 lba = 0;
6c7b7d2b7   Jeff Garzik   [libata] Fix deco...
1380
  	u32 len;
3aef52311   Albert Lee   [libata scsi] tid...
1381
1382
1383
  
  	VPRINTK("six-byte command
  ");
6c7b7d2b7   Jeff Garzik   [libata] Fix deco...
1384
  	lba |= ((u64)(cdb[1] & 0x1f)) << 16;
542b1444c   Tejun Heo   [PATCH] libata: c...
1385
1386
  	lba |= ((u64)cdb[2]) << 8;
  	lba |= ((u64)cdb[3]);
3aef52311   Albert Lee   [libata scsi] tid...
1387

6c7b7d2b7   Jeff Garzik   [libata] Fix deco...
1388
  	len = cdb[4];
3aef52311   Albert Lee   [libata scsi] tid...
1389
1390
1391
1392
1393
1394
1395
  
  	*plba = lba;
  	*plen = len;
  }
  
  /**
   *	scsi_10_lba_len - Get LBA and transfer length
542b1444c   Tejun Heo   [PATCH] libata: c...
1396
   *	@cdb: SCSI command to translate
3aef52311   Albert Lee   [libata scsi] tid...
1397
1398
1399
1400
1401
1402
1403
   *
   *	Calculate LBA and transfer length for 10-byte commands.
   *
   *	RETURNS:
   *	@plba: the LBA
   *	@plen: the transfer length
   */
542b1444c   Tejun Heo   [PATCH] libata: c...
1404
  static void scsi_10_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
3aef52311   Albert Lee   [libata scsi] tid...
1405
1406
1407
1408
1409
1410
  {
  	u64 lba = 0;
  	u32 len = 0;
  
  	VPRINTK("ten-byte command
  ");
542b1444c   Tejun Heo   [PATCH] libata: c...
1411
1412
1413
1414
  	lba |= ((u64)cdb[2]) << 24;
  	lba |= ((u64)cdb[3]) << 16;
  	lba |= ((u64)cdb[4]) << 8;
  	lba |= ((u64)cdb[5]);
3aef52311   Albert Lee   [libata scsi] tid...
1415

542b1444c   Tejun Heo   [PATCH] libata: c...
1416
1417
  	len |= ((u32)cdb[7]) << 8;
  	len |= ((u32)cdb[8]);
3aef52311   Albert Lee   [libata scsi] tid...
1418
1419
1420
1421
1422
1423
1424
  
  	*plba = lba;
  	*plen = len;
  }
  
  /**
   *	scsi_16_lba_len - Get LBA and transfer length
542b1444c   Tejun Heo   [PATCH] libata: c...
1425
   *	@cdb: SCSI command to translate
3aef52311   Albert Lee   [libata scsi] tid...
1426
1427
1428
1429
1430
1431
1432
   *
   *	Calculate LBA and transfer length for 16-byte commands.
   *
   *	RETURNS:
   *	@plba: the LBA
   *	@plen: the transfer length
   */
542b1444c   Tejun Heo   [PATCH] libata: c...
1433
  static void scsi_16_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
3aef52311   Albert Lee   [libata scsi] tid...
1434
1435
1436
1437
1438
1439
  {
  	u64 lba = 0;
  	u32 len = 0;
  
  	VPRINTK("sixteen-byte command
  ");
542b1444c   Tejun Heo   [PATCH] libata: c...
1440
1441
1442
1443
1444
1445
1446
1447
  	lba |= ((u64)cdb[2]) << 56;
  	lba |= ((u64)cdb[3]) << 48;
  	lba |= ((u64)cdb[4]) << 40;
  	lba |= ((u64)cdb[5]) << 32;
  	lba |= ((u64)cdb[6]) << 24;
  	lba |= ((u64)cdb[7]) << 16;
  	lba |= ((u64)cdb[8]) << 8;
  	lba |= ((u64)cdb[9]);
3aef52311   Albert Lee   [libata scsi] tid...
1448

542b1444c   Tejun Heo   [PATCH] libata: c...
1449
1450
1451
1452
  	len |= ((u32)cdb[10]) << 24;
  	len |= ((u32)cdb[11]) << 16;
  	len |= ((u32)cdb[12]) << 8;
  	len |= ((u32)cdb[13]);
3aef52311   Albert Lee   [libata scsi] tid...
1453
1454
1455
1456
1457
1458
  
  	*plba = lba;
  	*plen = len;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1459
1460
   *	ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one
   *	@qc: Storage for translated ATA taskfile
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1461
1462
1463
1464
   *
   *	Converts SCSI VERIFY command to an ATA READ VERIFY command.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1465
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
1467
1468
1469
   *
   *	RETURNS:
   *	Zero on success, non-zero on error.
   */
ad706991f   Tejun Heo   [PATCH] libata: k...
1470
  static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1471
  {
542b1444c   Tejun Heo   [PATCH] libata: c...
1472
  	struct scsi_cmnd *scmd = qc->scsicmd;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473
  	struct ata_taskfile *tf = &qc->tf;
8bf62ecee   Albert Lee   [libata] C/H/S su...
1474
  	struct ata_device *dev = qc->dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1475
  	u64 dev_sectors = qc->dev->n_sectors;
ad706991f   Tejun Heo   [PATCH] libata: k...
1476
  	const u8 *cdb = scmd->cmnd;
3aef52311   Albert Lee   [libata scsi] tid...
1477
1478
  	u64 block;
  	u32 n_block;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1479
1480
1481
  
  	tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
  	tf->protocol = ATA_PROT_NODATA;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1482

2e5704f63   Tejun Heo   [PATCH] libata: t...
1483
1484
1485
  	if (cdb[0] == VERIFY) {
  		if (scmd->cmd_len < 10)
  			goto invalid_fld;
542b1444c   Tejun Heo   [PATCH] libata: c...
1486
  		scsi_10_lba_len(cdb, &block, &n_block);
2e5704f63   Tejun Heo   [PATCH] libata: t...
1487
1488
1489
  	} else if (cdb[0] == VERIFY_16) {
  		if (scmd->cmd_len < 16)
  			goto invalid_fld;
542b1444c   Tejun Heo   [PATCH] libata: c...
1490
  		scsi_16_lba_len(cdb, &block, &n_block);
2e5704f63   Tejun Heo   [PATCH] libata: t...
1491
  	} else
ae0065102   Douglas Gilbert   [libata scsi] imp...
1492
  		goto invalid_fld;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1493

8bf62ecee   Albert Lee   [libata] C/H/S su...
1494
  	if (!n_block)
ae0065102   Douglas Gilbert   [libata scsi] imp...
1495
  		goto nothing_to_do;
8bf62ecee   Albert Lee   [libata] C/H/S su...
1496
  	if (block >= dev_sectors)
ae0065102   Douglas Gilbert   [libata scsi] imp...
1497
  		goto out_of_range;
8bf62ecee   Albert Lee   [libata] C/H/S su...
1498
  	if ((block + n_block) > dev_sectors)
ae0065102   Douglas Gilbert   [libata scsi] imp...
1499
  		goto out_of_range;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500

07506697d   Albert Lee   [PATCH] libata CH...
1501
1502
  	if (dev->flags & ATA_DFLAG_LBA) {
  		tf->flags |= ATA_TFLAG_LBA;
c6a33e246   Albert Lee   [PATCH] libata CH...
1503
1504
1505
1506
1507
1508
1509
  		if (lba_28_ok(block, n_block)) {
  			/* use LBA28 */
  			tf->command = ATA_CMD_VERIFY;
  			tf->device |= (block >> 24) & 0xf;
  		} else if (lba_48_ok(block, n_block)) {
  			if (!(dev->flags & ATA_DFLAG_LBA48))
  				goto out_of_range;
07506697d   Albert Lee   [PATCH] libata CH...
1510
1511
1512
  
  			/* use LBA48 */
  			tf->flags |= ATA_TFLAG_LBA48;
8bf62ecee   Albert Lee   [libata] C/H/S su...
1513
  			tf->command = ATA_CMD_VERIFY_EXT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1514

8bf62ecee   Albert Lee   [libata] C/H/S su...
1515
  			tf->hob_nsect = (n_block >> 8) & 0xff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1516

8bf62ecee   Albert Lee   [libata] C/H/S su...
1517
1518
1519
  			tf->hob_lbah = (block >> 40) & 0xff;
  			tf->hob_lbam = (block >> 32) & 0xff;
  			tf->hob_lbal = (block >> 24) & 0xff;
c6a33e246   Albert Lee   [PATCH] libata CH...
1520
1521
1522
  		} else
  			/* request too large even for LBA48 */
  			goto out_of_range;
8bf62ecee   Albert Lee   [libata] C/H/S su...
1523
1524
  
  		tf->nsect = n_block & 0xff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1525

8bf62ecee   Albert Lee   [libata] C/H/S su...
1526
1527
1528
  		tf->lbah = (block >> 16) & 0xff;
  		tf->lbam = (block >> 8) & 0xff;
  		tf->lbal = block & 0xff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1529

8bf62ecee   Albert Lee   [libata] C/H/S su...
1530
1531
1532
1533
  		tf->device |= ATA_LBA;
  	} else {
  		/* CHS */
  		u32 sect, head, cyl, track;
c6a33e246   Albert Lee   [PATCH] libata CH...
1534
1535
  		if (!lba_28_ok(block, n_block))
  			goto out_of_range;
07506697d   Albert Lee   [PATCH] libata CH...
1536

8bf62ecee   Albert Lee   [libata] C/H/S su...
1537
1538
1539
1540
1541
  		/* Convert LBA to CHS */
  		track = (u32)block / dev->sectors;
  		cyl   = track / dev->heads;
  		head  = track % dev->heads;
  		sect  = (u32)block % dev->sectors + 1;
c187c4b58   Albert Lee   libata: minor whi...
1542
1543
1544
  		DPRINTK("block %u track %u cyl %u head %u sect %u
  ",
  			(u32)block, track, cyl, head, sect);
2e9edbf81   Jeff Garzik   [libata] export a...
1545
1546
1547
  
  		/* Check whether the converted CHS can fit.
  		   Cylinder: 0-65535
8bf62ecee   Albert Lee   [libata] C/H/S su...
1548
1549
  		   Head: 0-15
  		   Sector: 1-255*/
2e9edbf81   Jeff Garzik   [libata] export a...
1550
  		if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect))
ae0065102   Douglas Gilbert   [libata scsi] imp...
1551
  			goto out_of_range;
2e9edbf81   Jeff Garzik   [libata] export a...
1552

8bf62ecee   Albert Lee   [libata] C/H/S su...
1553
1554
1555
1556
1557
1558
1559
  		tf->command = ATA_CMD_VERIFY;
  		tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */
  		tf->lbal = sect;
  		tf->lbam = cyl;
  		tf->lbah = cyl >> 8;
  		tf->device |= head;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1560
1561
  
  	return 0;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1562
1563
  
  invalid_fld:
542b1444c   Tejun Heo   [PATCH] libata: c...
1564
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1565
1566
1567
1568
  	/* "Invalid field in cbd" */
  	return 1;
  
  out_of_range:
542b1444c   Tejun Heo   [PATCH] libata: c...
1569
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1570
1571
1572
1573
  	/* "Logical Block Address out of range" */
  	return 1;
  
  nothing_to_do:
542b1444c   Tejun Heo   [PATCH] libata: c...
1574
  	scmd->result = SAM_STAT_GOOD;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1575
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1576
1577
1578
1579
1580
  }
  
  /**
   *	ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
   *	@qc: Storage for translated ATA taskfile
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
   *
   *	Converts any of six SCSI read/write commands into the
   *	ATA counterpart, including starting sector (LBA),
   *	sector count, and taking into account the device's LBA48
   *	support.
   *
   *	Commands %READ_6, %READ_10, %READ_16, %WRITE_6, %WRITE_10, and
   *	%WRITE_16 are currently supported.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1591
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1592
1593
1594
1595
   *
   *	RETURNS:
   *	Zero on success, non-zero on error.
   */
ad706991f   Tejun Heo   [PATCH] libata: k...
1596
  static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1597
  {
542b1444c   Tejun Heo   [PATCH] libata: c...
1598
  	struct scsi_cmnd *scmd = qc->scsicmd;
ad706991f   Tejun Heo   [PATCH] libata: k...
1599
  	const u8 *cdb = scmd->cmnd;
bd056d7ee   Tejun Heo   [PATCH] libata: s...
1600
  	unsigned int tf_flags = 0;
3aef52311   Albert Lee   [libata scsi] tid...
1601
1602
  	u64 block;
  	u32 n_block;
bd056d7ee   Tejun Heo   [PATCH] libata: s...
1603
  	int rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1604

542b1444c   Tejun Heo   [PATCH] libata: c...
1605
  	if (cdb[0] == WRITE_10 || cdb[0] == WRITE_6 || cdb[0] == WRITE_16)
bd056d7ee   Tejun Heo   [PATCH] libata: s...
1606
  		tf_flags |= ATA_TFLAG_WRITE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1607

9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
1608
  	/* Calculate the SCSI LBA, transfer length and FUA. */
542b1444c   Tejun Heo   [PATCH] libata: c...
1609
  	switch (cdb[0]) {
3aef52311   Albert Lee   [libata scsi] tid...
1610
1611
  	case READ_10:
  	case WRITE_10:
2e5704f63   Tejun Heo   [PATCH] libata: t...
1612
1613
  		if (unlikely(scmd->cmd_len < 10))
  			goto invalid_fld;
542b1444c   Tejun Heo   [PATCH] libata: c...
1614
1615
  		scsi_10_lba_len(cdb, &block, &n_block);
  		if (unlikely(cdb[1] & (1 << 3)))
bd056d7ee   Tejun Heo   [PATCH] libata: s...
1616
  			tf_flags |= ATA_TFLAG_FUA;
3aef52311   Albert Lee   [libata scsi] tid...
1617
1618
1619
  		break;
  	case READ_6:
  	case WRITE_6:
2e5704f63   Tejun Heo   [PATCH] libata: t...
1620
1621
  		if (unlikely(scmd->cmd_len < 6))
  			goto invalid_fld;
542b1444c   Tejun Heo   [PATCH] libata: c...
1622
  		scsi_6_lba_len(cdb, &block, &n_block);
c187c4b58   Albert Lee   libata: minor whi...
1623
1624
1625
1626
  
  		/* for 6-byte r/w commands, transfer length 0
  		 * means 256 blocks of data, not 0 block.
  		 */
76b2bf9b4   Jeff Garzik   Merge libata bran...
1627
1628
  		if (!n_block)
  			n_block = 256;
3aef52311   Albert Lee   [libata scsi] tid...
1629
1630
1631
  		break;
  	case READ_16:
  	case WRITE_16:
2e5704f63   Tejun Heo   [PATCH] libata: t...
1632
1633
  		if (unlikely(scmd->cmd_len < 16))
  			goto invalid_fld;
542b1444c   Tejun Heo   [PATCH] libata: c...
1634
1635
  		scsi_16_lba_len(cdb, &block, &n_block);
  		if (unlikely(cdb[1] & (1 << 3)))
bd056d7ee   Tejun Heo   [PATCH] libata: s...
1636
  			tf_flags |= ATA_TFLAG_FUA;
3aef52311   Albert Lee   [libata scsi] tid...
1637
1638
  		break;
  	default:
8bf62ecee   Albert Lee   [libata] C/H/S su...
1639
1640
  		DPRINTK("no-byte command
  ");
ae0065102   Douglas Gilbert   [libata scsi] imp...
1641
  		goto invalid_fld;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1642
  	}
8bf62ecee   Albert Lee   [libata] C/H/S su...
1643
1644
  	/* Check and compose ATA command */
  	if (!n_block)
c187c4b58   Albert Lee   libata: minor whi...
1645
1646
1647
1648
  		/* For 10-byte and 16-byte SCSI R/W commands, transfer
  		 * length 0 means transfer 0 block of data.
  		 * However, for ATA R/W commands, sector count 0 means
  		 * 256 or 65536 sectors, not 0 sectors as in SCSI.
f51750d5e   Alan Cox   [PATCH] libata: N...
1649
1650
  		 *
  		 * WARNING: one or two older ATA drives treat 0 as 0...
c187c4b58   Albert Lee   libata: minor whi...
1651
  		 */
ae0065102   Douglas Gilbert   [libata scsi] imp...
1652
  		goto nothing_to_do;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1653

bd056d7ee   Tejun Heo   [PATCH] libata: s...
1654
  	qc->flags |= ATA_QCFLAG_IO;
295124dce   Grant Grundler   [libata] support ...
1655
  	qc->nbytes = n_block * scmd->device->sector_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1656

bd056d7ee   Tejun Heo   [PATCH] libata: s...
1657
1658
1659
1660
  	rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
  			     qc->tag);
  	if (likely(rc == 0))
  		return 0;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1661

bd056d7ee   Tejun Heo   [PATCH] libata: s...
1662
1663
1664
  	if (rc == -ERANGE)
  		goto out_of_range;
  	/* treat all other errors as -EINVAL, fall through */
ae0065102   Douglas Gilbert   [libata scsi] imp...
1665
  invalid_fld:
542b1444c   Tejun Heo   [PATCH] libata: c...
1666
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1667
1668
1669
1670
  	/* "Invalid field in cbd" */
  	return 1;
  
  out_of_range:
542b1444c   Tejun Heo   [PATCH] libata: c...
1671
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1672
1673
1674
1675
  	/* "Logical Block Address out of range" */
  	return 1;
  
  nothing_to_do:
542b1444c   Tejun Heo   [PATCH] libata: c...
1676
  	scmd->result = SAM_STAT_GOOD;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1677
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1678
  }
77853bf2b   Tejun Heo   [PATCH] libata: m...
1679
  static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1680
  {
c31f571d9   Tejun Heo   [PATCH] libata: d...
1681
  	struct ata_port *ap = qc->ap;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682
  	struct scsi_cmnd *cmd = qc->scsicmd;
a7dac447b   Jeff Garzik   [libata] change a...
1683
  	u8 *cdb = cmd->cmnd;
2dcb407e6   Jeff Garzik   [libata] checkpat...
1684
  	int need_sense = (qc->err_mask != 0);
b095518ef   Jeff Garzik   [libata] ATA pass...
1685
1686
1687
1688
1689
1690
1691
1692
  
  	/* For ATA pass thru (SAT) commands, generate a sense block if
  	 * user mandated it or if there's an error.  Note that if we
  	 * generate because the user forced us to, a check condition
  	 * is generated and the ATA register values are returned
  	 * whether the command completed successfully or not. If there
  	 * was no error, SK, ASC and ASCQ will all be zero.
  	 */
a7dac447b   Jeff Garzik   [libata] change a...
1693
  	if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
2dcb407e6   Jeff Garzik   [libata] checkpat...
1694
  	    ((cdb[2] & 0x20) || need_sense)) {
750426aa1   Tejun Heo   [PATCH] libata: c...
1695
  		ata_gen_passthru_sense(qc);
b095518ef   Jeff Garzik   [libata] ATA pass...
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
  	} else {
  		if (!need_sense) {
  			cmd->result = SAM_STAT_GOOD;
  		} else {
  			/* TODO: decide which descriptor format to use
  			 * for 48b LBA devices and call that here
  			 * instead of the fixed desc, which is only
  			 * good for smaller LBA (and maybe CHS?)
  			 * devices.
  			 */
750426aa1   Tejun Heo   [PATCH] libata: c...
1706
  			ata_gen_ata_sense(qc);
b095518ef   Jeff Garzik   [libata] ATA pass...
1707
1708
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1709

c31f571d9   Tejun Heo   [PATCH] libata: d...
1710
  	if (need_sense && !ap->ops->error_handler)
44877b4e2   Tejun Heo   libata: s/ap->id/...
1711
  		ata_dump_status(ap->print_id, &qc->result_tf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1712
1713
  
  	qc->scsidone(cmd);
77853bf2b   Tejun Heo   [PATCH] libata: m...
1714
  	ata_qc_free(qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1715
1716
1717
1718
  }
  
  /**
   *	ata_scsi_translate - Translate then issue SCSI command to ATA device
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1719
1720
   *	@dev: ATA device to which the command is addressed
   *	@cmd: SCSI command to execute
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1721
1722
1723
1724
1725
1726
1727
1728
1729
   *	@xlat_func: Actor which translates @cmd to an ATA taskfile
   *
   *	Our ->queuecommand() function has decided that the SCSI
   *	command issued can be directly translated into an ATA
   *	command, rather than handled internally.
   *
   *	This function sets up an ata_queued_cmd structure for the
   *	SCSI command, and sends that ata_queued_cmd to the hardware.
   *
ae0065102   Douglas Gilbert   [libata scsi] imp...
1730
1731
1732
1733
1734
1735
   *	The xlat_func argument (actor) returns 0 if ready to execute
   *	ATA command, else 1 to finish translation. If 1 is returned
   *	then cmd->result (and possibly cmd->sense_buffer) are assumed
   *	to be set reflecting an error condition or clean (early)
   *	termination.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1736
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1737
   *	spin_lock_irqsave(host lock)
2115ea94a   Tejun Heo   [PATCH] libata-nc...
1738
1739
1740
1741
   *
   *	RETURNS:
   *	0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command
   *	needs to be deferred.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1742
   */
2115ea94a   Tejun Heo   [PATCH] libata-nc...
1743
  static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
2115ea94a   Tejun Heo   [PATCH] libata-nc...
1744
  			      ata_xlat_func_t xlat_func)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1745
  {
31cc23b34   Tejun Heo   libata-pmp-prep: ...
1746
  	struct ata_port *ap = dev->link->ap;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1747
  	struct ata_queued_cmd *qc;
31cc23b34   Tejun Heo   libata-pmp-prep: ...
1748
  	int rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1749
1750
1751
  
  	VPRINTK("ENTER
  ");
b27dcfb06   Jeff Garzik   [libata] avoid ne...
1752
  	qc = ata_scsi_qc_new(dev, cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1753
  	if (!qc)
ae0065102   Douglas Gilbert   [libata scsi] imp...
1754
  		goto err_mem;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1755
1756
  
  	/* data is present; dma-map it */
be7db055d   Christoph Hellwig   [PATCH] remove ol...
1757
1758
  	if (cmd->sc_data_direction == DMA_FROM_DEVICE ||
  	    cmd->sc_data_direction == DMA_TO_DEVICE) {
7120165cf   Boaz Harrosh   libata-scsi: conv...
1759
  		if (unlikely(scsi_bufflen(cmd) < 1)) {
a9a79dfec   Joe Perches   ata: Convert ata_...
1760
1761
  			ata_dev_warn(dev, "WARNING: zero len r/w req
  ");
ae0065102   Douglas Gilbert   [libata scsi] imp...
1762
  			goto err_did;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1763
  		}
7120165cf   Boaz Harrosh   libata-scsi: conv...
1764
  		ata_sg_init(qc, scsi_sglist(cmd), scsi_sg_count(cmd));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1765
1766
1767
1768
1769
  
  		qc->dma_dir = cmd->sc_data_direction;
  	}
  
  	qc->complete_fn = ata_scsi_qc_complete;
ad706991f   Tejun Heo   [PATCH] libata: k...
1770
  	if (xlat_func(qc))
ae0065102   Douglas Gilbert   [libata scsi] imp...
1771
  		goto early_finish;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1772

31cc23b34   Tejun Heo   libata-pmp-prep: ...
1773
1774
1775
1776
  	if (ap->ops->qc_defer) {
  		if ((rc = ap->ops->qc_defer(qc)))
  			goto defer;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1777
  	/* select device, send command to hardware */
8e0e694a3   Tejun Heo   [PATCH] libata: m...
1778
  	ata_qc_issue(qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1779
1780
1781
  
  	VPRINTK("EXIT
  ");
2115ea94a   Tejun Heo   [PATCH] libata-nc...
1782
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1783

ae0065102   Douglas Gilbert   [libata scsi] imp...
1784
  early_finish:
2dcb407e6   Jeff Garzik   [libata] checkpat...
1785
  	ata_qc_free(qc);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
1786
  	cmd->scsi_done(cmd);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1787
1788
  	DPRINTK("EXIT - early finish (good or error)
  ");
2115ea94a   Tejun Heo   [PATCH] libata-nc...
1789
  	return 0;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1790
1791
  
  err_did:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1792
  	ata_qc_free(qc);
ae0065102   Douglas Gilbert   [libata scsi] imp...
1793
  	cmd->result = (DID_ERROR << 16);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
1794
  	cmd->scsi_done(cmd);
253b92ecb   Darrick J. Wong   libata: fix doubl...
1795
  err_mem:
ae0065102   Douglas Gilbert   [libata scsi] imp...
1796
1797
  	DPRINTK("EXIT - internal
  ");
2115ea94a   Tejun Heo   [PATCH] libata-nc...
1798
  	return 0;
3dc1d8819   Tejun Heo   [PATCH] libata-nc...
1799
1800
  
  defer:
31cc23b34   Tejun Heo   libata-pmp-prep: ...
1801
  	ata_qc_free(qc);
3dc1d8819   Tejun Heo   [PATCH] libata-nc...
1802
1803
  	DPRINTK("EXIT - defer
  ");
31cc23b34   Tejun Heo   libata-pmp-prep: ...
1804
1805
1806
1807
  	if (rc == ATA_DEFER_LINK)
  		return SCSI_MLQUEUE_DEVICE_BUSY;
  	else
  		return SCSI_MLQUEUE_HOST_BUSY;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1808
1809
1810
1811
  }
  
  /**
   *	ata_scsi_rbuf_get - Map response buffer.
ec2a20e61   Randy Dunlap   libata: fix libat...
1812
   *	@cmd: SCSI command containing buffer to be mapped.
87340e983   Tejun Heo   libata-scsi: impr...
1813
1814
   *	@flags: unsigned long variable to store irq enable status
   *	@copy_in: copy in from user buffer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1815
   *
87340e983   Tejun Heo   libata-scsi: impr...
1816
   *	Prepare buffer for simulated SCSI commands.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1817
1818
   *
   *	LOCKING:
87340e983   Tejun Heo   libata-scsi: impr...
1819
   *	spin_lock_irqsave(ata_scsi_rbuf_lock) on success
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1820
1821
   *
   *	RETURNS:
87340e983   Tejun Heo   libata-scsi: impr...
1822
   *	Pointer to response buffer.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1823
   */
87340e983   Tejun Heo   libata-scsi: impr...
1824
1825
  static void *ata_scsi_rbuf_get(struct scsi_cmnd *cmd, bool copy_in,
  			       unsigned long *flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1826
  {
87340e983   Tejun Heo   libata-scsi: impr...
1827
  	spin_lock_irqsave(&ata_scsi_rbuf_lock, *flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1828

87340e983   Tejun Heo   libata-scsi: impr...
1829
1830
1831
1832
1833
  	memset(ata_scsi_rbuf, 0, ATA_SCSI_RBUF_SIZE);
  	if (copy_in)
  		sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
  				  ata_scsi_rbuf, ATA_SCSI_RBUF_SIZE);
  	return ata_scsi_rbuf;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1834
1835
1836
1837
1838
  }
  
  /**
   *	ata_scsi_rbuf_put - Unmap response buffer.
   *	@cmd: SCSI command containing buffer to be unmapped.
87340e983   Tejun Heo   libata-scsi: impr...
1839
1840
   *	@copy_out: copy out result
   *	@flags: @flags passed to ata_scsi_rbuf_get()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1841
   *
87340e983   Tejun Heo   libata-scsi: impr...
1842
1843
   *	Returns rbuf buffer.  The result is copied to @cmd's buffer if
   *	@copy_back is true.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1844
1845
   *
   *	LOCKING:
87340e983   Tejun Heo   libata-scsi: impr...
1846
   *	Unlocks ata_scsi_rbuf_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1847
   */
87340e983   Tejun Heo   libata-scsi: impr...
1848
1849
  static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, bool copy_out,
  				     unsigned long *flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1850
  {
87340e983   Tejun Heo   libata-scsi: impr...
1851
1852
1853
1854
  	if (copy_out)
  		sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
  				    ata_scsi_rbuf, ATA_SCSI_RBUF_SIZE);
  	spin_unlock_irqrestore(&ata_scsi_rbuf_lock, *flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
  }
  
  /**
   *	ata_scsi_rbuf_fill - wrapper for SCSI command simulators
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@actor: Callback hook for desired SCSI command simulator
   *
   *	Takes care of the hard work of simulating a SCSI command...
   *	Mapping the response buffer, calling the command's handler,
   *	and handling the handler's return value.  This return value
   *	indicates whether the handler wishes the SCSI command to be
ae0065102   Douglas Gilbert   [libata scsi] imp...
1866
1867
   *	completed successfully (0), or not (in which case cmd->result
   *	and sense buffer are assumed to be set).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1868
1869
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1870
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1871
   */
f0761be34   Tejun Heo   libata-scsi: clea...
1872
  static void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
87340e983   Tejun Heo   libata-scsi: impr...
1873
  		unsigned int (*actor)(struct ata_scsi_args *args, u8 *rbuf))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1874
1875
  {
  	u8 *rbuf;
87340e983   Tejun Heo   libata-scsi: impr...
1876
  	unsigned int rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1877
  	struct scsi_cmnd *cmd = args->cmd;
b445c5681   Jeff Garzik   [libata] wrap kma...
1878
  	unsigned long flags;
87340e983   Tejun Heo   libata-scsi: impr...
1879
1880
1881
  	rbuf = ata_scsi_rbuf_get(cmd, false, &flags);
  	rc = actor(args, rbuf);
  	ata_scsi_rbuf_put(cmd, rc == 0, &flags);
b445c5681   Jeff Garzik   [libata] wrap kma...
1882

ae0065102   Douglas Gilbert   [libata scsi] imp...
1883
  	if (rc == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1884
  		cmd->result = SAM_STAT_GOOD;
ae0065102   Douglas Gilbert   [libata scsi] imp...
1885
  	args->done(cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1886
1887
1888
1889
1890
1891
  }
  
  /**
   *	ata_scsiop_inq_std - Simulate INQUIRY command
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1892
1893
   *
   *	Returns standard device identification data associated
b142eb659   Jeff Garzik   [libata] SCSI VPD...
1894
   *	with non-VPD INQUIRY command output.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1895
1896
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1897
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1898
   */
87340e983   Tejun Heo   libata-scsi: impr...
1899
  static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1900
  {
87340e983   Tejun Heo   libata-scsi: impr...
1901
1902
1903
1904
1905
1906
1907
1908
1909
  	const u8 versions[] = {
  		0x60,	/* SAM-3 (no version claimed) */
  
  		0x03,
  		0x20,	/* SBC-2 (no version claimed) */
  
  		0x02,
  		0x60	/* SPC-3 (no version claimed) */
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1910
1911
1912
1913
1914
1915
1916
  	u8 hdr[] = {
  		TYPE_DISK,
  		0,
  		0x5,	/* claim SPC-3 version compatibility */
  		2,
  		95 - 4
  	};
87340e983   Tejun Heo   libata-scsi: impr...
1917
1918
  	VPRINTK("ENTER
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1919
1920
1921
  	/* set scsi removeable (RMB) bit per ata bit */
  	if (ata_id_removeable(args->id))
  		hdr[1] |= (1 << 7);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1922
  	memcpy(rbuf, hdr, sizeof(hdr));
87340e983   Tejun Heo   libata-scsi: impr...
1923
1924
1925
  	memcpy(&rbuf[8], "ATA     ", 8);
  	ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
  	ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1926

87340e983   Tejun Heo   libata-scsi: impr...
1927
1928
  	if (rbuf[32] == 0 || rbuf[32] == ' ')
  		memcpy(&rbuf[32], "n/a ", 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1929

87340e983   Tejun Heo   libata-scsi: impr...
1930
  	memcpy(rbuf + 59, versions, sizeof(versions));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1931
1932
1933
1934
1935
  
  	return 0;
  }
  
  /**
b142eb659   Jeff Garzik   [libata] SCSI VPD...
1936
   *	ata_scsiop_inq_00 - Simulate INQUIRY VPD page 0, list of pages
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1937
1938
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1939
   *
b142eb659   Jeff Garzik   [libata] SCSI VPD...
1940
   *	Returns list of inquiry VPD pages available.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1941
1942
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1943
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1944
   */
87340e983   Tejun Heo   libata-scsi: impr...
1945
  static unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1946
1947
1948
1949
  {
  	const u8 pages[] = {
  		0x00,	/* page 0x00, this page */
  		0x80,	/* page 0x80, unit serial no page */
1e9dbc929   Matthew Wilcox   [libata] Add supp...
1950
1951
  		0x83,	/* page 0x83, device ident page */
  		0x89,	/* page 0x89, ata info page */
18f0f9785   Christoph Hellwig   libata: add trans...
1952
  		0xb0,	/* page 0xb0, block limits page */
1e9dbc929   Matthew Wilcox   [libata] Add supp...
1953
  		0xb1,	/* page 0xb1, block device characteristics page */
02e0a6047   Martin K. Petersen   libata: Signal th...
1954
  		0xb2,	/* page 0xb2, thin provisioning page */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1955
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1956

87340e983   Tejun Heo   libata-scsi: impr...
1957
1958
  	rbuf[3] = sizeof(pages);	/* number of supported VPD pages */
  	memcpy(rbuf + 4, pages, sizeof(pages));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1959
1960
1961
1962
  	return 0;
  }
  
  /**
b142eb659   Jeff Garzik   [libata] SCSI VPD...
1963
   *	ata_scsiop_inq_80 - Simulate INQUIRY VPD page 80, device serial number
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1964
1965
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1966
1967
1968
1969
   *
   *	Returns ATA device serial number.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1970
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1971
   */
87340e983   Tejun Heo   libata-scsi: impr...
1972
  static unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1973
1974
1975
1976
1977
  {
  	const u8 hdr[] = {
  		0,
  		0x80,			/* this page code */
  		0,
a0cf733b3   Tejun Heo   libata: straighte...
1978
  		ATA_ID_SERNO_LEN,	/* page len */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1979
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1980

87340e983   Tejun Heo   libata-scsi: impr...
1981
1982
1983
  	memcpy(rbuf, hdr, sizeof(hdr));
  	ata_id_string(args->id, (unsigned char *) &rbuf[4],
  		      ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1984
1985
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1986
  /**
b142eb659   Jeff Garzik   [libata] SCSI VPD...
1987
   *	ata_scsiop_inq_83 - Simulate INQUIRY VPD page 83, device identity
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1988
1989
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1990
   *
b142eb659   Jeff Garzik   [libata] SCSI VPD...
1991
1992
1993
1994
   *	Yields two logical unit device identification designators:
   *	 - vendor specific ASCII containing the ATA serial number
   *	 - SAT defined "t10 vendor id based" containing ASCII vendor
   *	   name ("ATA     "), model and serial numbers.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1995
1996
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
1997
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1998
   */
87340e983   Tejun Heo   libata-scsi: impr...
1999
  static unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2000
  {
b142eb659   Jeff Garzik   [libata] SCSI VPD...
2001
  	const int sat_model_serial_desc_len = 68;
87340e983   Tejun Heo   libata-scsi: impr...
2002
  	int num;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2003

b142eb659   Jeff Garzik   [libata] SCSI VPD...
2004
2005
  	rbuf[1] = 0x83;			/* this page code */
  	num = 4;
87340e983   Tejun Heo   libata-scsi: impr...
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
  	/* piv=0, assoc=lu, code_set=ACSII, designator=vendor */
  	rbuf[num + 0] = 2;
  	rbuf[num + 3] = ATA_ID_SERNO_LEN;
  	num += 4;
  	ata_id_string(args->id, (unsigned char *) rbuf + num,
  		      ATA_ID_SERNO, ATA_ID_SERNO_LEN);
  	num += ATA_ID_SERNO_LEN;
  
  	/* SAT defined lu model and serial numbers descriptor */
  	/* piv=0, assoc=lu, code_set=ACSII, designator=t10 vendor id */
  	rbuf[num + 0] = 2;
  	rbuf[num + 1] = 1;
  	rbuf[num + 3] = sat_model_serial_desc_len;
  	num += 4;
  	memcpy(rbuf + num, "ATA     ", 8);
  	num += 8;
  	ata_id_string(args->id, (unsigned char *) rbuf + num, ATA_ID_PROD,
  		      ATA_ID_PROD_LEN);
  	num += ATA_ID_PROD_LEN;
  	ata_id_string(args->id, (unsigned char *) rbuf + num, ATA_ID_SERNO,
  		      ATA_ID_SERNO_LEN);
  	num += ATA_ID_SERNO_LEN;
6b3b9d73e   Hannes Reinecke   libata: Include W...
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
  	if (ata_id_has_wwn(args->id)) {
  		/* SAT defined lu world wide name */
  		/* piv=0, assoc=lu, code_set=binary, designator=NAA */
  		rbuf[num + 0] = 1;
  		rbuf[num + 1] = 3;
  		rbuf[num + 3] = ATA_ID_WWN_LEN;
  		num += 4;
  		ata_id_string(args->id, (unsigned char *) rbuf + num,
  			      ATA_ID_WWN, ATA_ID_WWN_LEN);
  		num += ATA_ID_WWN_LEN;
  	}
b142eb659   Jeff Garzik   [libata] SCSI VPD...
2039
  	rbuf[3] = num - 4;    /* page len (assume less than 256 bytes) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2040
2041
2042
2043
  	return 0;
  }
  
  /**
ad355b462   Jeff Garzik   [libata] SCSI: su...
2044
2045
2046
   *	ata_scsiop_inq_89 - Simulate INQUIRY VPD page 89, ATA info
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
ad355b462   Jeff Garzik   [libata] SCSI: su...
2047
2048
2049
2050
2051
2052
   *
   *	Yields SAT-specified ATA VPD page.
   *
   *	LOCKING:
   *	spin_lock_irqsave(host lock)
   */
87340e983   Tejun Heo   libata-scsi: impr...
2053
  static unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf)
ad355b462   Jeff Garzik   [libata] SCSI: su...
2054
  {
ad355b462   Jeff Garzik   [libata] SCSI: su...
2055
  	struct ata_taskfile tf;
ad355b462   Jeff Garzik   [libata] SCSI: su...
2056

ad355b462   Jeff Garzik   [libata] SCSI: su...
2057
  	memset(&tf, 0, sizeof(tf));
87340e983   Tejun Heo   libata-scsi: impr...
2058
2059
2060
  	rbuf[1] = 0x89;			/* our page code */
  	rbuf[2] = (0x238 >> 8);		/* page size fixed at 238h */
  	rbuf[3] = (0x238 & 0xff);
ad355b462   Jeff Garzik   [libata] SCSI: su...
2061

87340e983   Tejun Heo   libata-scsi: impr...
2062
2063
2064
2065
  	memcpy(&rbuf[8], "linux   ", 8);
  	memcpy(&rbuf[16], "libata          ", 16);
  	memcpy(&rbuf[32], DRV_VERSION, 4);
  	ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
ad355b462   Jeff Garzik   [libata] SCSI: su...
2066
2067
2068
2069
2070
2071
  
  	/* we don't store the ATA device signature, so we fake it */
  
  	tf.command = ATA_DRDY;		/* really, this is Status reg */
  	tf.lbal = 0x1;
  	tf.nsect = 0x1;
87340e983   Tejun Heo   libata-scsi: impr...
2072
2073
  	ata_tf_to_fis(&tf, 0, 1, &rbuf[36]);	/* TODO: PMP? */
  	rbuf[36] = 0x34;		/* force D2H Reg FIS (34h) */
ad355b462   Jeff Garzik   [libata] SCSI: su...
2074

87340e983   Tejun Heo   libata-scsi: impr...
2075
  	rbuf[56] = ATA_CMD_ID_ATA;
ad355b462   Jeff Garzik   [libata] SCSI: su...
2076

87340e983   Tejun Heo   libata-scsi: impr...
2077
  	memcpy(&rbuf[60], &args->id[0], 512);
ad355b462   Jeff Garzik   [libata] SCSI: su...
2078
2079
  	return 0;
  }
18f0f9785   Christoph Hellwig   libata: add trans...
2080
2081
  static unsigned int ata_scsiop_inq_b0(struct ata_scsi_args *args, u8 *rbuf)
  {
295124dce   Grant Grundler   [libata] support ...
2082
  	u16 min_io_sectors;
18f0f9785   Christoph Hellwig   libata: add trans...
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
  
  	rbuf[1] = 0xb0;
  	rbuf[3] = 0x3c;		/* required VPD size with unmap support */
  
  	/*
  	 * Optimal transfer length granularity.
  	 *
  	 * This is always one physical block, but for disks with a smaller
  	 * logical than physical sector size we need to figure out what the
  	 * latter is.
  	 */
295124dce   Grant Grundler   [libata] support ...
2094
  	min_io_sectors = 1 << ata_id_log2_per_physical_sector(args->id);
18f0f9785   Christoph Hellwig   libata: add trans...
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
  	put_unaligned_be16(min_io_sectors, &rbuf[6]);
  
  	/*
  	 * Optimal unmap granularity.
  	 *
  	 * The ATA spec doesn't even know about a granularity or alignment
  	 * for the TRIM command.  We can leave away most of the unmap related
  	 * VPD page entries, but we have specifify a granularity to signal
  	 * that we support some form of unmap - in thise case via WRITE SAME
  	 * with the unmap bit set.
  	 */
e78db4dfb   Martin K. Petersen   libata: Report ze...
2106
  	if (ata_id_has_trim(args->id)) {
5f4e20666   Martin K. Petersen   libata: Use Maxim...
2107
  		put_unaligned_be64(65535 * 512 / 8, &rbuf[36]);
18f0f9785   Christoph Hellwig   libata: add trans...
2108
  		put_unaligned_be32(1, &rbuf[28]);
e78db4dfb   Martin K. Petersen   libata: Report ze...
2109
  	}
18f0f9785   Christoph Hellwig   libata: add trans...
2110
2111
2112
  
  	return 0;
  }
1e9dbc929   Matthew Wilcox   [libata] Add supp...
2113
2114
  static unsigned int ata_scsiop_inq_b1(struct ata_scsi_args *args, u8 *rbuf)
  {
4bca32864   Martin K. Petersen   libata: Media rot...
2115
2116
  	int form_factor = ata_id_form_factor(args->id);
  	int media_rotation_rate = ata_id_rotation_rate(args->id);
1e9dbc929   Matthew Wilcox   [libata] Add supp...
2117
2118
  	rbuf[1] = 0xb1;
  	rbuf[3] = 0x3c;
4bca32864   Martin K. Petersen   libata: Media rot...
2119
2120
2121
  	rbuf[4] = media_rotation_rate >> 8;
  	rbuf[5] = media_rotation_rate;
  	rbuf[7] = form_factor;
1e9dbc929   Matthew Wilcox   [libata] Add supp...
2122
2123
2124
  
  	return 0;
  }
02e0a6047   Martin K. Petersen   libata: Signal th...
2125
2126
2127
2128
2129
2130
2131
2132
2133
  static unsigned int ata_scsiop_inq_b2(struct ata_scsi_args *args, u8 *rbuf)
  {
  	/* SCSI Thin Provisioning VPD page: SBC-3 rev 22 or later */
  	rbuf[1] = 0xb2;
  	rbuf[3] = 0x4;
  	rbuf[5] = 1 << 6;	/* TPWS */
  
  	return 0;
  }
ad355b462   Jeff Garzik   [libata] SCSI: su...
2134
  /**
0cba632b7   Jeff Garzik   libata: doc updates
2135
   *	ata_scsiop_noop - Command handler that simply returns success.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2136
2137
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2138
2139
2140
2141
2142
   *
   *	No operation.  Simply returns success to caller, to indicate
   *	that the caller should successfully complete this SCSI command.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
2143
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2144
   */
87340e983   Tejun Heo   libata-scsi: impr...
2145
  static unsigned int ata_scsiop_noop(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2146
2147
2148
2149
2150
2151
2152
  {
  	VPRINTK("ENTER
  ");
  	return 0;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2153
2154
   *	ata_msense_caching - Simulate MODE SENSE caching info page
   *	@id: device IDENTIFY data
87340e983   Tejun Heo   libata-scsi: impr...
2155
   *	@buf: output buffer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2156
2157
2158
2159
2160
2161
2162
2163
   *
   *	Generate a caching info page, which conditionally indicates
   *	write caching to the SCSI layer, depending on device
   *	capabilities.
   *
   *	LOCKING:
   *	None.
   */
87340e983   Tejun Heo   libata-scsi: impr...
2164
  static unsigned int ata_msense_caching(u16 *id, u8 *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2165
  {
87340e983   Tejun Heo   libata-scsi: impr...
2166
  	memcpy(buf, def_cache_mpage, sizeof(def_cache_mpage));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2167
  	if (ata_id_wcache_enabled(id))
87340e983   Tejun Heo   libata-scsi: impr...
2168
  		buf[2] |= (1 << 2);	/* write cache enable */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2169
  	if (!ata_id_rahead_enabled(id))
87340e983   Tejun Heo   libata-scsi: impr...
2170
2171
  		buf[12] |= (1 << 5);	/* disable read ahead */
  	return sizeof(def_cache_mpage);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2172
2173
2174
2175
  }
  
  /**
   *	ata_msense_ctl_mode - Simulate MODE SENSE control mode page
87340e983   Tejun Heo   libata-scsi: impr...
2176
   *	@buf: output buffer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2177
2178
2179
2180
2181
2182
   *
   *	Generate a generic MODE SENSE control mode page.
   *
   *	LOCKING:
   *	None.
   */
87340e983   Tejun Heo   libata-scsi: impr...
2183
  static unsigned int ata_msense_ctl_mode(u8 *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2184
  {
87340e983   Tejun Heo   libata-scsi: impr...
2185
  	memcpy(buf, def_control_mpage, sizeof(def_control_mpage));
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2186
  	return sizeof(def_control_mpage);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2187
2188
2189
2190
  }
  
  /**
   *	ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page
ec2a20e61   Randy Dunlap   libata: fix libat...
2191
   *	@buf: output buffer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2192
2193
2194
2195
2196
2197
   *
   *	Generate a generic MODE SENSE r/w error recovery page.
   *
   *	LOCKING:
   *	None.
   */
87340e983   Tejun Heo   libata-scsi: impr...
2198
  static unsigned int ata_msense_rw_recovery(u8 *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2199
  {
87340e983   Tejun Heo   libata-scsi: impr...
2200
  	memcpy(buf, def_rw_recovery_mpage, sizeof(def_rw_recovery_mpage));
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2201
  	return sizeof(def_rw_recovery_mpage);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2202
  }
48bdc8ec4   Jens Axboe   [LIBATA] Blacklis...
2203
2204
2205
2206
2207
2208
  /*
   * We can turn this into a real blacklist if it's needed, for now just
   * blacklist any Maxtor BANC1G10 revision firmware
   */
  static int ata_dev_supports_fua(u16 *id)
  {
a0cf733b3   Tejun Heo   libata: straighte...
2209
  	unsigned char model[ATA_ID_PROD_LEN + 1], fw[ATA_ID_FW_REV_LEN + 1];
48bdc8ec4   Jens Axboe   [LIBATA] Blacklis...
2210

c3c013a2c   Jeff Garzik   [libata] Disable FUA
2211
2212
  	if (!libata_fua)
  		return 0;
48bdc8ec4   Jens Axboe   [LIBATA] Blacklis...
2213
2214
  	if (!ata_id_has_fua(id))
  		return 0;
a0cf733b3   Tejun Heo   libata: straighte...
2215
2216
  	ata_id_c_string(id, model, ATA_ID_PROD, sizeof(model));
  	ata_id_c_string(id, fw, ATA_ID_FW_REV, sizeof(fw));
48bdc8ec4   Jens Axboe   [LIBATA] Blacklis...
2217

2e02671da   Tejun Heo   [PATCH] libata: u...
2218
  	if (strcmp(model, "Maxtor"))
48bdc8ec4   Jens Axboe   [LIBATA] Blacklis...
2219
  		return 1;
2e02671da   Tejun Heo   [PATCH] libata: u...
2220
  	if (strcmp(fw, "BANC1G10"))
48bdc8ec4   Jens Axboe   [LIBATA] Blacklis...
2221
2222
2223
2224
  		return 1;
  
  	return 0; /* blacklisted */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2225
2226
2227
2228
  /**
   *	ata_scsiop_mode_sense - Simulate MODE SENSE 6, 10 commands
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2229
   *
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2230
2231
2232
   *	Simulate MODE SENSE commands. Assume this is invoked for direct
   *	access devices (e.g. disks) only. There should be no block
   *	descriptor for other device types.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2233
2234
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
2235
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2236
   */
87340e983   Tejun Heo   libata-scsi: impr...
2237
  static unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2238
  {
9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
2239
  	struct ata_device *dev = args->dev;
87340e983   Tejun Heo   libata-scsi: impr...
2240
  	u8 *scsicmd = args->cmd->cmnd, *p = rbuf;
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2241
2242
2243
2244
2245
2246
  	const u8 sat_blk_desc[] = {
  		0, 0, 0, 0,	/* number of blocks: sat unspecified */
  		0,
  		0, 0x2, 0x0	/* block length: 512 bytes */
  	};
  	u8 pg, spg;
87340e983   Tejun Heo   libata-scsi: impr...
2247
  	unsigned int ebd, page_control, six_byte;
9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
2248
  	u8 dpofua;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2249
2250
2251
2252
2253
  
  	VPRINTK("ENTER
  ");
  
  	six_byte = (scsicmd[0] == MODE_SENSE);
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2254
2255
2256
  	ebd = !(scsicmd[1] & 0x8);      /* dbd bit inverted == edb */
  	/*
  	 * LLBA bit in msense(10) ignored (compliant)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2257
  	 */
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2258

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2259
  	page_control = scsicmd[2] >> 6;
ae0065102   Douglas Gilbert   [libata scsi] imp...
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
  	switch (page_control) {
  	case 0: /* current */
  		break;  /* supported */
  	case 3: /* saved */
  		goto saving_not_supp;
  	case 1: /* changeable */
  	case 2: /* defaults */
  	default:
  		goto invalid_fld;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2270

87340e983   Tejun Heo   libata-scsi: impr...
2271
2272
2273
2274
  	if (six_byte)
  		p += 4 + (ebd ? 8 : 0);
  	else
  		p += 8 + (ebd ? 8 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2275

00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
  	pg = scsicmd[2] & 0x3f;
  	spg = scsicmd[3];
  	/*
  	 * No mode subpages supported (yet) but asking for _all_
  	 * subpages may be valid
  	 */
  	if (spg && (spg != ALL_SUB_MPAGES))
  		goto invalid_fld;
  
  	switch(pg) {
  	case RW_RECOVERY_MPAGE:
87340e983   Tejun Heo   libata-scsi: impr...
2287
  		p += ata_msense_rw_recovery(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2288
  		break;
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2289
  	case CACHE_MPAGE:
87340e983   Tejun Heo   libata-scsi: impr...
2290
  		p += ata_msense_caching(args->id, p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2291
  		break;
87340e983   Tejun Heo   libata-scsi: impr...
2292
2293
  	case CONTROL_MPAGE:
  		p += ata_msense_ctl_mode(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2294
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2295

00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2296
  	case ALL_MPAGES:
87340e983   Tejun Heo   libata-scsi: impr...
2297
2298
2299
  		p += ata_msense_rw_recovery(p);
  		p += ata_msense_caching(args->id, p);
  		p += ata_msense_ctl_mode(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2300
2301
2302
  		break;
  
  	default:		/* invalid page code */
ae0065102   Douglas Gilbert   [libata scsi] imp...
2303
  		goto invalid_fld;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2304
  	}
9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
2305
  	dpofua = 0;
f79d409fa   Alan Cox   [PATCH] libata - ...
2306
  	if (ata_dev_supports_fua(args->id) && (dev->flags & ATA_DFLAG_LBA48) &&
9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
2307
2308
  	    (!(dev->flags & ATA_DFLAG_PIO) || dev->multi_count))
  		dpofua = 1 << 4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2309
  	if (six_byte) {
87340e983   Tejun Heo   libata-scsi: impr...
2310
2311
  		rbuf[0] = p - rbuf - 1;
  		rbuf[2] |= dpofua;
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2312
  		if (ebd) {
87340e983   Tejun Heo   libata-scsi: impr...
2313
2314
  			rbuf[3] = sizeof(sat_blk_desc);
  			memcpy(rbuf + 4, sat_blk_desc, sizeof(sat_blk_desc));
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2315
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2316
  	} else {
87340e983   Tejun Heo   libata-scsi: impr...
2317
  		unsigned int output_len = p - rbuf - 2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2318
  		rbuf[0] = output_len >> 8;
87340e983   Tejun Heo   libata-scsi: impr...
2319
2320
  		rbuf[1] = output_len;
  		rbuf[3] |= dpofua;
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2321
  		if (ebd) {
87340e983   Tejun Heo   libata-scsi: impr...
2322
2323
  			rbuf[7] = sizeof(sat_blk_desc);
  			memcpy(rbuf + 8, sat_blk_desc, sizeof(sat_blk_desc));
00ac37f50   Douglas Gilbert   [libata scsi] MOD...
2324
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2325
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2326
  	return 0;
ae0065102   Douglas Gilbert   [libata scsi] imp...
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
  
  invalid_fld:
  	ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x24, 0x0);
  	/* "Invalid field in cbd" */
  	return 1;
  
  saving_not_supp:
  	ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x39, 0x0);
  	 /* "Saving parameters not supported" */
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2337
2338
2339
2340
2341
2342
  }
  
  /**
   *	ata_scsiop_read_cap - Simulate READ CAPACITY[ 16] commands
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2343
2344
2345
2346
   *
   *	Simulate READ CAPACITY commands.
   *
   *	LOCKING:
6a36261e6   Tejun Heo   [PATCH] libata: f...
2347
   *	None.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2348
   */
87340e983   Tejun Heo   libata-scsi: impr...
2349
  static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2350
  {
61d79a8eb   Martin K. Petersen   libata: Report di...
2351
2352
  	struct ata_device *dev = args->dev;
  	u64 last_lba = dev->n_sectors - 1; /* LBA of the last block */
295124dce   Grant Grundler   [libata] support ...
2353
2354
2355
2356
2357
2358
2359
  	u32 sector_size; /* physical sector size in bytes */
  	u8 log2_per_phys;
  	u16 lowest_aligned;
  
  	sector_size = ata_id_logical_sector_size(dev->id);
  	log2_per_phys = ata_id_log2_per_physical_sector(dev->id);
  	lowest_aligned = ata_id_logical_sector_offset(dev->id, log2_per_phys);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2360
2361
2362
  
  	VPRINTK("ENTER
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2363
  	if (args->cmd->cmnd[0] == READ_CAPACITY) {
6a36261e6   Tejun Heo   [PATCH] libata: f...
2364
2365
  		if (last_lba >= 0xffffffffULL)
  			last_lba = 0xffffffff;
0c144d0d0   Philip Pokorny   [PATCH] libata fi...
2366

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2367
  		/* sector count, 32-bit */
87340e983   Tejun Heo   libata-scsi: impr...
2368
2369
2370
2371
  		rbuf[0] = last_lba >> (8 * 3);
  		rbuf[1] = last_lba >> (8 * 2);
  		rbuf[2] = last_lba >> (8 * 1);
  		rbuf[3] = last_lba;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2372
2373
  
  		/* sector size */
295124dce   Grant Grundler   [libata] support ...
2374
2375
2376
2377
  		rbuf[4] = sector_size >> (8 * 3);
  		rbuf[5] = sector_size >> (8 * 2);
  		rbuf[6] = sector_size >> (8 * 1);
  		rbuf[7] = sector_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2378
2379
  	} else {
  		/* sector count, 64-bit */
87340e983   Tejun Heo   libata-scsi: impr...
2380
2381
2382
2383
2384
2385
2386
2387
  		rbuf[0] = last_lba >> (8 * 7);
  		rbuf[1] = last_lba >> (8 * 6);
  		rbuf[2] = last_lba >> (8 * 5);
  		rbuf[3] = last_lba >> (8 * 4);
  		rbuf[4] = last_lba >> (8 * 3);
  		rbuf[5] = last_lba >> (8 * 2);
  		rbuf[6] = last_lba >> (8 * 1);
  		rbuf[7] = last_lba;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2388
2389
  
  		/* sector size */
295124dce   Grant Grundler   [libata] support ...
2390
2391
2392
2393
  		rbuf[ 8] = sector_size >> (8 * 3);
  		rbuf[ 9] = sector_size >> (8 * 2);
  		rbuf[10] = sector_size >> (8 * 1);
  		rbuf[11] = sector_size;
61d79a8eb   Martin K. Petersen   libata: Report di...
2394
2395
  
  		rbuf[12] = 0;
295124dce   Grant Grundler   [libata] support ...
2396
  		rbuf[13] = log2_per_phys;
61d79a8eb   Martin K. Petersen   libata: Report di...
2397
2398
  		rbuf[14] = (lowest_aligned >> 8) & 0x3f;
  		rbuf[15] = lowest_aligned;
18f0f9785   Christoph Hellwig   libata: add trans...
2399

e78db4dfb   Martin K. Petersen   libata: Report ze...
2400
2401
2402
2403
2404
2405
  		if (ata_id_has_trim(args->id)) {
  			rbuf[14] |= 0x80; /* TPE */
  
  			if (ata_id_has_zero_after_trim(args->id))
  				rbuf[14] |= 0x40; /* TPRZ */
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2406
2407
2408
2409
2410
2411
2412
2413
2414
  	}
  
  	return 0;
  }
  
  /**
   *	ata_scsiop_report_luns - Simulate REPORT LUNS command
   *	@args: device IDENTIFY data / SCSI command of interest.
   *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2415
2416
2417
2418
   *
   *	Simulate REPORT LUNS command.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
2419
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2420
   */
87340e983   Tejun Heo   libata-scsi: impr...
2421
  static unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2422
2423
2424
2425
2426
2427
2428
  {
  	VPRINTK("ENTER
  ");
  	rbuf[3] = 8;	/* just one lun, LUN 0, size 8 bytes */
  
  	return 0;
  }
77853bf2b   Tejun Heo   [PATCH] libata: m...
2429
  static void atapi_sense_complete(struct ata_queued_cmd *qc)
a939c9631   Jeff Garzik   libata: move atap...
2430
  {
74e6c8c39   Tejun Heo   [PATCH] libata: d...
2431
  	if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0)) {
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2432
2433
2434
2435
2436
  		/* FIXME: not quite right; we don't want the
  		 * translation of taskfile registers into
  		 * a sense descriptors, since that's only
  		 * correct for ATA, not ATAPI
  		 */
750426aa1   Tejun Heo   [PATCH] libata: c...
2437
  		ata_gen_passthru_sense(qc);
74e6c8c39   Tejun Heo   [PATCH] libata: d...
2438
  	}
a939c9631   Jeff Garzik   libata: move atap...
2439

c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2440
  	qc->scsidone(qc->scsicmd);
77853bf2b   Tejun Heo   [PATCH] libata: m...
2441
  	ata_qc_free(qc);
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2442
  }
a939c9631   Jeff Garzik   libata: move atap...
2443

c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
  /* is it pointless to prefer PIO for "safety reasons"? */
  static inline int ata_pio_use_silly(struct ata_port *ap)
  {
  	return (ap->flags & ATA_FLAG_PIO_DMA);
  }
  
  static void atapi_request_sense(struct ata_queued_cmd *qc)
  {
  	struct ata_port *ap = qc->ap;
  	struct scsi_cmnd *cmd = qc->scsicmd;
  
  	DPRINTK("ATAPI request sense
  ");
a939c9631   Jeff Garzik   libata: move atap...
2457
2458
  
  	/* FIXME: is this needed? */
7ccd720da   James Bottomley   [libata] Prefer S...
2459
  	memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
a939c9631   Jeff Garzik   libata: move atap...
2460

127102aea   Tejun Heo   libata: make SFF ...
2461
  #ifdef CONFIG_ATA_SFF
855d854a3   James Bottomley   libata: fix boot ...
2462
2463
  	if (ap->ops->sff_tf_read)
  		ap->ops->sff_tf_read(ap, &qc->tf);
127102aea   Tejun Heo   libata: make SFF ...
2464
  #endif
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2465
2466
2467
2468
2469
2470
  
  	/* fill these in, for the case where they are -not- overwritten */
  	cmd->sense_buffer[0] = 0x70;
  	cmd->sense_buffer[2] = qc->tf.feature >> 4;
  
  	ata_qc_reinit(qc);
93f8fecbe   Tejun Heo   libata: make atap...
2471
  	/* setup sg table and init transfer direction */
cadb7345d   akpm@linux-foundation.org   [libata] Prefer S...
2472
  	sg_init_one(&qc->sgent, cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE);
93f8fecbe   Tejun Heo   libata: make atap...
2473
  	ata_sg_init(qc, &qc->sgent, 1);
a939c9631   Jeff Garzik   libata: move atap...
2474
  	qc->dma_dir = DMA_FROM_DEVICE;
6e7846e9c   Tejun Heo   [PATCH] libata: m...
2475
  	memset(&qc->cdb, 0, qc->dev->cdb_len);
a939c9631   Jeff Garzik   libata: move atap...
2476
2477
2478
2479
2480
  	qc->cdb[0] = REQUEST_SENSE;
  	qc->cdb[4] = SCSI_SENSE_BUFFERSIZE;
  
  	qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
  	qc->tf.command = ATA_CMD_PACKET;
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2481
  	if (ata_pio_use_silly(ap)) {
0dc36888d   Tejun Heo   libata: rename AT...
2482
  		qc->tf.protocol = ATAPI_PROT_DMA;
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2483
2484
  		qc->tf.feature |= ATAPI_PKT_DMA;
  	} else {
0dc36888d   Tejun Heo   libata: rename AT...
2485
  		qc->tf.protocol = ATAPI_PROT_PIO;
2db78dd30   Alan Cox   libata_scsi: Fix ...
2486
2487
  		qc->tf.lbam = SCSI_SENSE_BUFFERSIZE;
  		qc->tf.lbah = 0;
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2488
  	}
a939c9631   Jeff Garzik   libata: move atap...
2489
  	qc->nbytes = SCSI_SENSE_BUFFERSIZE;
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2490
  	qc->complete_fn = atapi_sense_complete;
a939c9631   Jeff Garzik   libata: move atap...
2491

8e0e694a3   Tejun Heo   [PATCH] libata: m...
2492
  	ata_qc_issue(qc);
a939c9631   Jeff Garzik   libata: move atap...
2493
2494
2495
2496
  
  	DPRINTK("EXIT
  ");
  }
77853bf2b   Tejun Heo   [PATCH] libata: m...
2497
  static void atapi_qc_complete(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2498
2499
  {
  	struct scsi_cmnd *cmd = qc->scsicmd;
a22e2eb07   Albert Lee   [PATCH] libata: m...
2500
  	unsigned int err_mask = qc->err_mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2501

a7dac447b   Jeff Garzik   [libata] change a...
2502
2503
  	VPRINTK("ENTER, err_mask 0x%X
  ", err_mask);
e12669e77   Jeff Garzik   libata: minor cle...
2504

246619da3   Tejun Heo   [PATCH] libata-eh...
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
  	/* handle completion from new EH */
  	if (unlikely(qc->ap->ops->error_handler &&
  		     (err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) {
  
  		if (!(qc->flags & ATA_QCFLAG_SENSE_VALID)) {
  			/* FIXME: not quite right; we don't want the
  			 * translation of taskfile registers into a
  			 * sense descriptors, since that's only
  			 * correct for ATA, not ATAPI
  			 */
750426aa1   Tejun Heo   [PATCH] libata: c...
2515
  			ata_gen_passthru_sense(qc);
246619da3   Tejun Heo   [PATCH] libata-eh...
2516
  		}
22aac0896   Tejun Heo   [PATCH] libata: c...
2517
2518
2519
2520
2521
2522
2523
2524
2525
  		/* SCSI EH automatically locks door if sdev->locked is
  		 * set.  Sometimes door lock request continues to
  		 * fail, for example, when no media is present.  This
  		 * creates a loop - SCSI EH issues door lock which
  		 * fails and gets invoked again to acquire sense data
  		 * for the failed command.
  		 *
  		 * If door lock fails, always clear sdev->locked to
  		 * avoid this infinite loop.
2a5f07b5e   Tejun Heo   libata: fix NULL ...
2526
2527
2528
  		 *
  		 * This may happen before SCSI scan is complete.  Make
  		 * sure qc->dev->sdev isn't NULL before dereferencing.
22aac0896   Tejun Heo   [PATCH] libata: c...
2529
  		 */
2a5f07b5e   Tejun Heo   libata: fix NULL ...
2530
  		if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL && qc->dev->sdev)
22aac0896   Tejun Heo   [PATCH] libata: c...
2531
  			qc->dev->sdev->locked = 0;
246619da3   Tejun Heo   [PATCH] libata-eh...
2532
2533
2534
2535
2536
2537
2538
  		qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
  		qc->scsidone(cmd);
  		ata_qc_free(qc);
  		return;
  	}
  
  	/* successful completion or old EH failure path */
a7dac447b   Jeff Garzik   [libata] change a...
2539
  	if (unlikely(err_mask & AC_ERR_DEV)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2540
  		cmd->result = SAM_STAT_CHECK_CONDITION;
c6e6e666c   Jeff Garzik   [libata] REQUEST ...
2541
  		atapi_request_sense(qc);
77853bf2b   Tejun Heo   [PATCH] libata: m...
2542
  		return;
74e6c8c39   Tejun Heo   [PATCH] libata: d...
2543
  	} else if (unlikely(err_mask)) {
a7dac447b   Jeff Garzik   [libata] change a...
2544
2545
2546
2547
2548
  		/* FIXME: not quite right; we don't want the
  		 * translation of taskfile registers into
  		 * a sense descriptors, since that's only
  		 * correct for ATA, not ATAPI
  		 */
750426aa1   Tejun Heo   [PATCH] libata: c...
2549
  		ata_gen_passthru_sense(qc);
74e6c8c39   Tejun Heo   [PATCH] libata: d...
2550
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2551
  		u8 *scsicmd = cmd->cmnd;
fd71da468   Tony Battersby   [PATCH] fix libat...
2552
  		if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
b445c5681   Jeff Garzik   [libata] wrap kma...
2553
  			unsigned long flags;
87340e983   Tejun Heo   libata-scsi: impr...
2554
  			u8 *buf;
b445c5681   Jeff Garzik   [libata] wrap kma...
2555

87340e983   Tejun Heo   libata-scsi: impr...
2556
  			buf = ata_scsi_rbuf_get(cmd, true, &flags);
a15dbeb47   Jeff Garzik   libata: ATAPI com...
2557
2558
2559
2560
2561
2562
2563
2564
2565
  
  	/* ATAPI devices typically report zero for their SCSI version,
  	 * and sometimes deviate from the spec WRT response data
  	 * format.  If SCSI version is reported as zero like normal,
  	 * then we make the following fixups:  1) Fake MMC-5 version,
  	 * to indicate to the Linux scsi midlayer this is a modern
  	 * device.  2) Ensure response data format / ATAPI information
  	 * are always correct.
  	 */
a15dbeb47   Jeff Garzik   libata: ATAPI com...
2566
2567
2568
2569
  			if (buf[2] == 0) {
  				buf[2] = 0x5;
  				buf[3] = 0x32;
  			}
87340e983   Tejun Heo   libata-scsi: impr...
2570
  			ata_scsi_rbuf_put(cmd, true, &flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2571
  		}
a15dbeb47   Jeff Garzik   libata: ATAPI com...
2572

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2573
2574
2575
2576
  		cmd->result = SAM_STAT_GOOD;
  	}
  
  	qc->scsidone(cmd);
77853bf2b   Tejun Heo   [PATCH] libata: m...
2577
  	ata_qc_free(qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2578
2579
2580
2581
  }
  /**
   *	atapi_xlat - Initialize PACKET taskfile
   *	@qc: command structure to be initialized
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2582
2583
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
2584
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2585
2586
2587
2588
   *
   *	RETURNS:
   *	Zero on success, non-zero on failure.
   */
ad706991f   Tejun Heo   [PATCH] libata: k...
2589
  static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2590
  {
542b1444c   Tejun Heo   [PATCH] libata: c...
2591
  	struct scsi_cmnd *scmd = qc->scsicmd;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2592
  	struct ata_device *dev = qc->dev;
542b1444c   Tejun Heo   [PATCH] libata: c...
2593
  	int nodata = (scmd->sc_data_direction == DMA_NONE);
5895ef9a5   Tejun Heo   libata: don't che...
2594
  	int using_pio = !nodata && (dev->flags & ATA_DFLAG_PIO);
2db78dd30   Alan Cox   libata_scsi: Fix ...
2595
  	unsigned int nbytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2596

2e5704f63   Tejun Heo   [PATCH] libata: t...
2597
2598
  	memset(qc->cdb, 0, dev->cdb_len);
  	memcpy(qc->cdb, scmd->cmnd, scmd->cmd_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2599
2600
2601
2602
  
  	qc->complete_fn = atapi_qc_complete;
  
  	qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
542b1444c   Tejun Heo   [PATCH] libata: c...
2603
  	if (scmd->sc_data_direction == DMA_TO_DEVICE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2604
2605
2606
2607
2608
2609
  		qc->tf.flags |= ATA_TFLAG_WRITE;
  		DPRINTK("direction: write
  ");
  	}
  
  	qc->tf.command = ATA_CMD_PACKET;
aacda3753   Tejun Heo   libata: implement...
2610
  	ata_qc_set_pc_nbytes(qc);
e00f1ff3c   Tejun Heo   libata: call ata_...
2611
2612
  
  	/* check whether ATAPI DMA is safe */
5895ef9a5   Tejun Heo   libata: don't che...
2613
  	if (!nodata && !using_pio && atapi_check_dma(qc))
e00f1ff3c   Tejun Heo   libata: call ata_...
2614
  		using_pio = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2615

e190222d0   Tejun Heo   libata: bump tran...
2616
2617
2618
2619
2620
  	/* Some controller variants snoop this value for Packet
  	 * transfers to do state machine and FIFO management.  Thus we
  	 * want to set it properly, and for DMA where it is
  	 * effectively meaningless.
  	 */
aacda3753   Tejun Heo   libata: implement...
2621
  	nbytes = min(ata_qc_raw_nbytes(qc), (unsigned int)63 * 1024);
2db78dd30   Alan Cox   libata_scsi: Fix ...
2622

e190222d0   Tejun Heo   libata: bump tran...
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
  	/* Most ATAPI devices which honor transfer chunk size don't
  	 * behave according to the spec when odd chunk size which
  	 * matches the transfer length is specified.  If the number of
  	 * bytes to transfer is 2n+1.  According to the spec, what
  	 * should happen is to indicate that 2n+1 is going to be
  	 * transferred and transfer 2n+2 bytes where the last byte is
  	 * padding.
  	 *
  	 * In practice, this doesn't happen.  ATAPI devices first
  	 * indicate and transfer 2n bytes and then indicate and
  	 * transfer 2 bytes where the last byte is padding.
  	 *
  	 * This inconsistency confuses several controllers which
  	 * perform PIO using DMA such as Intel AHCIs and sil3124/32.
  	 * These controllers use actual number of transferred bytes to
  	 * update DMA poitner and transfer of 4n+2 bytes make those
  	 * controller push DMA pointer by 4n+4 bytes because SATA data
  	 * FISes are aligned to 4 bytes.  This causes data corruption
  	 * and buffer overrun.
  	 *
  	 * Always setting nbytes to even number solves this problem
  	 * because then ATAPI devices don't have to split data at 2n
  	 * boundaries.
  	 */
  	if (nbytes & 0x1)
  		nbytes++;
2db78dd30   Alan Cox   libata_scsi: Fix ...
2649
2650
  	qc->tf.lbam = (nbytes & 0xFF);
  	qc->tf.lbah = (nbytes >> 8);
5895ef9a5   Tejun Heo   libata: don't che...
2651
2652
2653
2654
2655
  	if (nodata)
  		qc->tf.protocol = ATAPI_PROT_NODATA;
  	else if (using_pio)
  		qc->tf.protocol = ATAPI_PROT_PIO;
  	else {
e00f1ff3c   Tejun Heo   libata: call ata_...
2656
  		/* DMA data xfer */
0dc36888d   Tejun Heo   libata: rename AT...
2657
  		qc->tf.protocol = ATAPI_PROT_DMA;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2658
  		qc->tf.feature |= ATAPI_PKT_DMA;
911630063   Tejun Heo   libata: automatic...
2659
2660
  		if ((dev->flags & ATA_DFLAG_DMADIR) &&
  		    (scmd->sc_data_direction != DMA_TO_DEVICE))
95de719ad   Albert Lee   [PATCH] libata: c...
2661
  			/* some SATA bridges need us to indicate data xfer direction */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2662
  			qc->tf.feature |= ATAPI_DMADIR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2663
  	}
2db78dd30   Alan Cox   libata_scsi: Fix ...
2664
2665
2666
  
  	/* FIXME: We need to translate 0x05 READ_BLOCK_LIMITS to a MODE_SENSE
  	   as ATAPI tape drives don't get this right otherwise */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2667
2668
  	return 0;
  }
2dcb407e6   Jeff Garzik   [libata] checkpat...
2669
  static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2670
  {
071f44b1d   Tejun Heo   libata: implement...
2671
  	if (!sata_pmp_attached(ap)) {
41bda9c98   Tejun Heo   libata-link: upda...
2672
2673
2674
2675
2676
2677
  		if (likely(devno < ata_link_max_devices(&ap->link)))
  			return &ap->link.device[devno];
  	} else {
  		if (likely(devno < ap->nr_pmp_links))
  			return &ap->pmp_link[devno].device[0];
  	}
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2678
2679
  	return NULL;
  }
2dcb407e6   Jeff Garzik   [libata] checkpat...
2680
2681
  static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
  					      const struct scsi_device *scsidev)
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2682
  {
41bda9c98   Tejun Heo   libata-link: upda...
2683
  	int devno;
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2684
  	/* skip commands not addressed to targets we simulate */
071f44b1d   Tejun Heo   libata: implement...
2685
  	if (!sata_pmp_attached(ap)) {
41bda9c98   Tejun Heo   libata-link: upda...
2686
2687
2688
2689
2690
2691
2692
2693
  		if (unlikely(scsidev->channel || scsidev->lun))
  			return NULL;
  		devno = scsidev->id;
  	} else {
  		if (unlikely(scsidev->id || scsidev->lun))
  			return NULL;
  		devno = scsidev->channel;
  	}
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2694

41bda9c98   Tejun Heo   libata-link: upda...
2695
  	return ata_find_dev(ap, devno);
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2696
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
  /**
   *	ata_scsi_find_dev - lookup ata_device from scsi_cmnd
   *	@ap: ATA port to which the device is attached
   *	@scsidev: SCSI device from which we derive the ATA device
   *
   *	Given various information provided in struct scsi_cmnd,
   *	map that onto an ATA bus, and using that mapping
   *	determine which ata_device is associated with the
   *	SCSI command to be sent.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
2708
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2709
2710
2711
2712
   *
   *	RETURNS:
   *	Associated ATA device, or %NULL if not found.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2713
  static struct ata_device *
057ace5e7   Jeff Garzik   libata: const-ifi...
2714
  ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2715
  {
ab5b3a5b2   Tejun Heo   [PATCH] libata-hp...
2716
  	struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2717

2486fa561   Tejun Heo   libata: update at...
2718
  	if (unlikely(!dev || !ata_dev_enabled(dev)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2719
  		return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2720
2721
  	return dev;
  }
b095518ef   Jeff Garzik   [libata] ATA pass...
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
  /*
   *	ata_scsi_map_proto - Map pass-thru protocol value to taskfile value.
   *	@byte1: Byte 1 from pass-thru CDB.
   *
   *	RETURNS:
   *	ATA_PROT_UNKNOWN if mapping failed/unimplemented, protocol otherwise.
   */
  static u8
  ata_scsi_map_proto(u8 byte1)
  {
  	switch((byte1 & 0x1e) >> 1) {
2dcb407e6   Jeff Garzik   [libata] checkpat...
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
  	case 3:		/* Non-data */
  		return ATA_PROT_NODATA;
  
  	case 6:		/* DMA */
  	case 10:	/* UDMA Data-in */
  	case 11:	/* UDMA Data-Out */
  		return ATA_PROT_DMA;
  
  	case 4:		/* PIO Data-in */
  	case 5:		/* PIO Data-out */
  		return ATA_PROT_PIO;
  
  	case 0:		/* Hard Reset */
  	case 1:		/* SRST */
  	case 8:		/* Device Diagnostic */
  	case 9:		/* Device Reset */
  	case 7:		/* DMA Queued */
  	case 12:	/* FPDMA */
  	case 15:	/* Return Response Info */
  	default:	/* Reserved */
  		break;
b095518ef   Jeff Garzik   [libata] ATA pass...
2754
2755
2756
2757
2758
2759
2760
2761
  	}
  
  	return ATA_PROT_UNKNOWN;
  }
  
  /**
   *	ata_scsi_pass_thru - convert ATA pass-thru CDB to taskfile
   *	@qc: command structure to be initialized
b095518ef   Jeff Garzik   [libata] ATA pass...
2762
2763
2764
2765
2766
2767
   *
   *	Handles either 12 or 16-byte versions of the CDB.
   *
   *	RETURNS:
   *	Zero on success, non-zero on failure.
   */
ad706991f   Tejun Heo   [PATCH] libata: k...
2768
  static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
b095518ef   Jeff Garzik   [libata] ATA pass...
2769
2770
  {
  	struct ata_taskfile *tf = &(qc->tf);
542b1444c   Tejun Heo   [PATCH] libata: c...
2771
  	struct scsi_cmnd *scmd = qc->scsicmd;
f79d409fa   Alan Cox   [PATCH] libata - ...
2772
  	struct ata_device *dev = qc->dev;
ad706991f   Tejun Heo   [PATCH] libata: k...
2773
  	const u8 *cdb = scmd->cmnd;
b095518ef   Jeff Garzik   [libata] ATA pass...
2774

542b1444c   Tejun Heo   [PATCH] libata: c...
2775
  	if ((tf->protocol = ata_scsi_map_proto(cdb[1])) == ATA_PROT_UNKNOWN)
9a4052578   Tejun Heo   [PATCH] libata: f...
2776
  		goto invalid_fld;
8190bdb92   Jeff Garzik   [libata] libata-s...
2777

ae8d4ee7f   Alan Cox   libata: Disable A...
2778
  	/*
b095518ef   Jeff Garzik   [libata] ATA pass...
2779
2780
2781
  	 * 12 and 16 byte CDBs use different offsets to
  	 * provide the various register values.
  	 */
542b1444c   Tejun Heo   [PATCH] libata: c...
2782
  	if (cdb[0] == ATA_16) {
b095518ef   Jeff Garzik   [libata] ATA pass...
2783
2784
2785
2786
2787
  		/*
  		 * 16-byte CDB - may contain extended commands.
  		 *
  		 * If that is the case, copy the upper byte register values.
  		 */
542b1444c   Tejun Heo   [PATCH] libata: c...
2788
2789
2790
2791
2792
2793
  		if (cdb[1] & 0x01) {
  			tf->hob_feature = cdb[3];
  			tf->hob_nsect = cdb[5];
  			tf->hob_lbal = cdb[7];
  			tf->hob_lbam = cdb[9];
  			tf->hob_lbah = cdb[11];
b095518ef   Jeff Garzik   [libata] ATA pass...
2794
2795
2796
2797
2798
2799
2800
  			tf->flags |= ATA_TFLAG_LBA48;
  		} else
  			tf->flags &= ~ATA_TFLAG_LBA48;
  
  		/*
  		 * Always copy low byte, device and command registers.
  		 */
542b1444c   Tejun Heo   [PATCH] libata: c...
2801
2802
2803
2804
2805
2806
2807
  		tf->feature = cdb[4];
  		tf->nsect = cdb[6];
  		tf->lbal = cdb[8];
  		tf->lbam = cdb[10];
  		tf->lbah = cdb[12];
  		tf->device = cdb[13];
  		tf->command = cdb[14];
b095518ef   Jeff Garzik   [libata] ATA pass...
2808
2809
2810
2811
2812
  	} else {
  		/*
  		 * 12-byte CDB - incapable of extended commands.
  		 */
  		tf->flags &= ~ATA_TFLAG_LBA48;
542b1444c   Tejun Heo   [PATCH] libata: c...
2813
2814
2815
2816
2817
2818
2819
  		tf->feature = cdb[3];
  		tf->nsect = cdb[4];
  		tf->lbal = cdb[5];
  		tf->lbam = cdb[6];
  		tf->lbah = cdb[7];
  		tf->device = cdb[8];
  		tf->command = cdb[9];
b095518ef   Jeff Garzik   [libata] ATA pass...
2820
  	}
fa4453c4c   Albert Lee   libata passthru: ...
2821
2822
2823
2824
  
  	/* enforce correct master/slave bit */
  	tf->device = dev->devno ?
  		tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
b095518ef   Jeff Garzik   [libata] ATA pass...
2825

bd30add88   Tejun Heo   libata: unbreak T...
2826
  	switch (tf->command) {
295124dce   Grant Grundler   [libata] support ...
2827
  	/* READ/WRITE LONG use a non-standard sect_size */
bd30add88   Tejun Heo   libata: unbreak T...
2828
2829
2830
2831
2832
2833
2834
  	case ATA_CMD_READ_LONG:
  	case ATA_CMD_READ_LONG_ONCE:
  	case ATA_CMD_WRITE_LONG:
  	case ATA_CMD_WRITE_LONG_ONCE:
  		if (tf->protocol != ATA_PROT_PIO || tf->nsect != 1)
  			goto invalid_fld;
  		qc->sect_size = scsi_bufflen(scmd);
295124dce   Grant Grundler   [libata] support ...
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
  		break;
  
  	/* commands using reported Logical Block size (e.g. 512 or 4K) */
  	case ATA_CMD_CFA_WRITE_NE:
  	case ATA_CMD_CFA_TRANS_SECT:
  	case ATA_CMD_CFA_WRITE_MULT_NE:
  	/* XXX: case ATA_CMD_CFA_WRITE_SECTORS_WITHOUT_ERASE: */
  	case ATA_CMD_READ:
  	case ATA_CMD_READ_EXT:
  	case ATA_CMD_READ_QUEUED:
  	/* XXX: case ATA_CMD_READ_QUEUED_EXT: */
  	case ATA_CMD_FPDMA_READ:
  	case ATA_CMD_READ_MULTI:
  	case ATA_CMD_READ_MULTI_EXT:
  	case ATA_CMD_PIO_READ:
  	case ATA_CMD_PIO_READ_EXT:
  	case ATA_CMD_READ_STREAM_DMA_EXT:
  	case ATA_CMD_READ_STREAM_EXT:
  	case ATA_CMD_VERIFY:
  	case ATA_CMD_VERIFY_EXT:
  	case ATA_CMD_WRITE:
  	case ATA_CMD_WRITE_EXT:
  	case ATA_CMD_WRITE_FUA_EXT:
  	case ATA_CMD_WRITE_QUEUED:
  	case ATA_CMD_WRITE_QUEUED_FUA_EXT:
  	case ATA_CMD_FPDMA_WRITE:
  	case ATA_CMD_WRITE_MULTI:
  	case ATA_CMD_WRITE_MULTI_EXT:
  	case ATA_CMD_WRITE_MULTI_FUA_EXT:
  	case ATA_CMD_PIO_WRITE:
  	case ATA_CMD_PIO_WRITE_EXT:
  	case ATA_CMD_WRITE_STREAM_DMA_EXT:
  	case ATA_CMD_WRITE_STREAM_EXT:
  		qc->sect_size = scmd->device->sector_size;
  		break;
  
  	/* Everything else uses 512 byte "sectors" */
  	default:
  		qc->sect_size = ATA_SECT_SIZE;
bd30add88   Tejun Heo   libata: unbreak T...
2874
2875
2876
2877
2878
2879
2880
  	}
  
  	/*
  	 * Set flags so that all registers will be written, pass on
  	 * write indication (used for PIO/DMA setup), result TF is
  	 * copied back and we don't whine too much about its failure.
  	 */
bc496ed00   Douglas Gilbert   libata-scsi passt...
2881
  	tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
bd30add88   Tejun Heo   libata: unbreak T...
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
  	if (scmd->sc_data_direction == DMA_TO_DEVICE)
  		tf->flags |= ATA_TFLAG_WRITE;
  
  	qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
  
  	/*
  	 * Set transfer length.
  	 *
  	 * TODO: find out if we need to do more here to
  	 *       cover scatter/gather case.
  	 */
  	ata_qc_set_pc_nbytes(qc);
  
  	/* We may not issue DMA commands if no DMA mode is set */
  	if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
  		goto invalid_fld;
1dce589c3   Albert Lee   libata passthru: ...
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
  	/* sanity check for pio multi commands */
  	if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf))
  		goto invalid_fld;
  
  	if (is_multi_taskfile(tf)) {
  		unsigned int multi_count = 1 << (cdb[1] >> 5);
  
  		/* compare the passed through multi_count
  		 * with the cached multi_count of libata
  		 */
  		if (multi_count != dev->multi_count)
a9a79dfec   Joe Perches   ata: Convert ata_...
2909
2910
2911
  			ata_dev_warn(dev, "invalid multi_count %u ignored
  ",
  				     multi_count);
d26fc9551   Alan Cox   libata: Support c...
2912
  	}
1dce589c3   Albert Lee   libata passthru: ...
2913

b095518ef   Jeff Garzik   [libata] ATA pass...
2914
2915
2916
2917
2918
2919
2920
  	/*
  	 * Filter SET_FEATURES - XFER MODE command -- otherwise,
  	 * SET_FEATURES - XFER MODE must be preceded/succeeded
  	 * by an update to hardware-specific registers for each
  	 * controller (i.e. the reason for ->set_piomode(),
  	 * ->set_dmamode(), and ->post_set_mode() hooks).
  	 */
bd30add88   Tejun Heo   libata: unbreak T...
2921
2922
  	if (tf->command == ATA_CMD_SET_FEATURES &&
  	    tf->feature == SETFEATURES_XFER)
9a4052578   Tejun Heo   [PATCH] libata: f...
2923
  		goto invalid_fld;
b095518ef   Jeff Garzik   [libata] ATA pass...
2924
2925
  
  	/*
bd30add88   Tejun Heo   libata: unbreak T...
2926
2927
2928
2929
2930
2931
2932
  	 * Filter TPM commands by default. These provide an
  	 * essentially uncontrolled encrypted "back door" between
  	 * applications and the disk. Set libata.allow_tpm=1 if you
  	 * have a real reason for wanting to use them. This ensures
  	 * that installed software cannot easily mess stuff up without
  	 * user intent. DVR type users will probably ship with this enabled
  	 * for movie content management.
b095518ef   Jeff Garzik   [libata] ATA pass...
2933
  	 *
bd30add88   Tejun Heo   libata: unbreak T...
2934
2935
2936
2937
2938
  	 * Note that for ATA8 we can issue a DCS change and DCS freeze lock
  	 * for this and should do in future but that it is not sufficient as
  	 * DCS is an optional feature set. Thus we also do the software filter
  	 * so that we comply with the TC consortium stated goal that the user
  	 * can turn off TC features of their system.
b095518ef   Jeff Garzik   [libata] ATA pass...
2939
  	 */
bd30add88   Tejun Heo   libata: unbreak T...
2940
2941
  	if (tf->command >= 0x5C && tf->command <= 0x5F && !libata_allow_tpm)
  		goto invalid_fld;
e61e06722   Tejun Heo   [PATCH] libata: i...
2942

b095518ef   Jeff Garzik   [libata] ATA pass...
2943
  	return 0;
9a4052578   Tejun Heo   [PATCH] libata: f...
2944
2945
  
   invalid_fld:
542b1444c   Tejun Heo   [PATCH] libata: c...
2946
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x00);
9a4052578   Tejun Heo   [PATCH] libata: f...
2947
2948
  	/* "Invalid field in cdb" */
  	return 1;
b095518ef   Jeff Garzik   [libata] ATA pass...
2949
  }
18f0f9785   Christoph Hellwig   libata: add trans...
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
  static unsigned int ata_scsi_write_same_xlat(struct ata_queued_cmd *qc)
  {
  	struct ata_taskfile *tf = &qc->tf;
  	struct scsi_cmnd *scmd = qc->scsicmd;
  	struct ata_device *dev = qc->dev;
  	const u8 *cdb = scmd->cmnd;
  	u64 block;
  	u32 n_block;
  	u32 size;
  	void *buf;
  
  	/* we may not issue DMA commands if no DMA mode is set */
  	if (unlikely(!dev->dma_mode))
  		goto invalid_fld;
  
  	if (unlikely(scmd->cmd_len < 16))
  		goto invalid_fld;
  	scsi_16_lba_len(cdb, &block, &n_block);
  
  	/* for now we only support WRITE SAME with the unmap bit set */
  	if (unlikely(!(cdb[1] & 0x8)))
  		goto invalid_fld;
  
  	/*
  	 * WRITE SAME always has a sector sized buffer as payload, this
  	 * should never be a multiple entry S/G list.
  	 */
  	if (!scsi_sg_count(scmd))
  		goto invalid_fld;
  
  	buf = page_address(sg_page(scsi_sglist(scmd)));
d0634c4ae   Martin K. Petersen   libata: Clarify a...
2981
  	size = ata_set_lba_range_entries(buf, 512, block, n_block);
18f0f9785   Christoph Hellwig   libata: add trans...
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
  
  	tf->protocol = ATA_PROT_DMA;
  	tf->hob_feature = 0;
  	tf->feature = ATA_DSM_TRIM;
  	tf->hob_nsect = (size / 512) >> 8;
  	tf->nsect = size / 512;
  	tf->command = ATA_CMD_DSM;
  	tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 |
  		     ATA_TFLAG_WRITE;
  
  	ata_qc_set_pc_nbytes(qc);
  
  	return 0;
  
   invalid_fld:
  	ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x00);
  	/* "Invalid field in cdb" */
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
  /**
   *	ata_get_xlat_func - check if SCSI to ATA translation is possible
   *	@dev: ATA device
   *	@cmd: SCSI command opcode to consider
   *
   *	Look up the SCSI command given, and determine whether the
   *	SCSI command is to be translated or simulated.
   *
   *	RETURNS:
   *	Pointer to translation function if possible, %NULL if not.
   */
  
  static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
  {
  	switch (cmd) {
  	case READ_6:
  	case READ_10:
  	case READ_16:
  
  	case WRITE_6:
  	case WRITE_10:
  	case WRITE_16:
  		return ata_scsi_rw_xlat;
0cdd6eb7e   Christoph Hellwig   libata: use the W...
3024
  	case WRITE_SAME_16:
18f0f9785   Christoph Hellwig   libata: add trans...
3025
  		return ata_scsi_write_same_xlat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3026
3027
3028
3029
3030
3031
3032
3033
  	case SYNCHRONIZE_CACHE:
  		if (ata_try_flush_cache(dev))
  			return ata_scsi_flush_xlat;
  		break;
  
  	case VERIFY:
  	case VERIFY_16:
  		return ata_scsi_verify_xlat;
b095518ef   Jeff Garzik   [libata] ATA pass...
3034
3035
3036
3037
  
  	case ATA_12:
  	case ATA_16:
  		return ata_scsi_pass_thru;
da61396d2   Jeff Garzik   Merge upstream ke...
3038

972dcafb6   Douglas Gilbert   [libata scsi] add...
3039
3040
  	case START_STOP:
  		return ata_scsi_start_stop_xlat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
  	}
  
  	return NULL;
  }
  
  /**
   *	ata_scsi_dump_cdb - dump SCSI command contents to dmesg
   *	@ap: ATA port to which the command was being sent
   *	@cmd: SCSI command to dump
   *
   *	Prints the contents of a SCSI command via printk().
   */
  
  static inline void ata_scsi_dump_cdb(struct ata_port *ap,
  				     struct scsi_cmnd *cmd)
  {
  #ifdef ATA_DEBUG
  	struct scsi_device *scsidev = cmd->device;
  	u8 *scsicmd = cmd->cmnd;
  
  	DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x
  ",
44877b4e2   Tejun Heo   libata: s/ap->id/...
3063
  		ap->print_id,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3064
3065
3066
3067
3068
3069
  		scsidev->channel, scsidev->id, scsidev->lun,
  		scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
  		scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
  		scsicmd[8]);
  #endif
  }
542b1444c   Tejun Heo   [PATCH] libata: c...
3070
  static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
2115ea94a   Tejun Heo   [PATCH] libata-nc...
3071
  				      struct ata_device *dev)
eb3f0f9c6   Brian King   [PATCH] libata: a...
3072
  {
baf4fdfaa   Mark Lord   libata: add suppo...
3073
3074
  	u8 scsi_op = scmd->cmnd[0];
  	ata_xlat_func_t xlat_func;
2115ea94a   Tejun Heo   [PATCH] libata-nc...
3075
  	int rc = 0;
eb3f0f9c6   Brian King   [PATCH] libata: a...
3076
  	if (dev->class == ATA_DEV_ATA) {
baf4fdfaa   Mark Lord   libata: add suppo...
3077
3078
  		if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len))
  			goto bad_cdb_len;
eb3f0f9c6   Brian King   [PATCH] libata: a...
3079

baf4fdfaa   Mark Lord   libata: add suppo...
3080
3081
3082
3083
3084
3085
3086
3087
  		xlat_func = ata_get_xlat_func(dev, scsi_op);
  	} else {
  		if (unlikely(!scmd->cmd_len))
  			goto bad_cdb_len;
  
  		xlat_func = NULL;
  		if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
  			/* relay SCSI command to ATAPI device */
607126c2a   Mark Lord   libata-scsi: be t...
3088
3089
  			int len = COMMAND_SIZE(scsi_op);
  			if (unlikely(len > scmd->cmd_len || len > dev->cdb_len))
baf4fdfaa   Mark Lord   libata: add suppo...
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
  				goto bad_cdb_len;
  
  			xlat_func = atapi_xlat;
  		} else {
  			/* ATA_16 passthru, treat as an ATA command */
  			if (unlikely(scmd->cmd_len > 16))
  				goto bad_cdb_len;
  
  			xlat_func = ata_get_xlat_func(dev, scsi_op);
  		}
  	}
  
  	if (xlat_func)
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3103
  		rc = ata_scsi_translate(dev, scmd, xlat_func);
baf4fdfaa   Mark Lord   libata: add suppo...
3104
  	else
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3105
  		ata_scsi_simulate(dev, scmd);
2115ea94a   Tejun Heo   [PATCH] libata-nc...
3106
3107
  
  	return rc;
baf4fdfaa   Mark Lord   libata: add suppo...
3108
3109
3110
3111
3112
3113
  
   bad_cdb_len:
  	DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u
  ",
  		scmd->cmd_len, scsi_op, dev->cdb_len);
  	scmd->result = DID_ERROR << 16;
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3114
  	scmd->scsi_done(scmd);
baf4fdfaa   Mark Lord   libata: add suppo...
3115
  	return 0;
eb3f0f9c6   Brian King   [PATCH] libata: a...
3116
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3117
3118
  /**
   *	ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device
23e701e62   Jeff Garzik   [libata] remove S...
3119
   *	@shost: SCSI host of command to be sent
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3120
   *	@cmd: SCSI command to be sent
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3121
3122
3123
3124
3125
3126
3127
3128
3129
   *
   *	In some cases, this function translates SCSI commands into
   *	ATA taskfiles, and queues the taskfiles to be sent to
   *	hardware.  In other cases, this function simulates a
   *	SCSI device by evaluating and responding to certain
   *	SCSI commands.  This creates the overall effect of
   *	ATA and ATAPI devices appearing as SCSI devices.
   *
   *	LOCKING:
23e701e62   Jeff Garzik   [libata] remove S...
3130
   *	ATA host lock
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3131
3132
   *
   *	RETURNS:
2115ea94a   Tejun Heo   [PATCH] libata-nc...
3133
3134
   *	Return value from __ata_scsi_queuecmd() if @cmd can be queued,
   *	0 otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3135
   */
23e701e62   Jeff Garzik   [libata] remove S...
3136
  int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3137
3138
3139
3140
  {
  	struct ata_port *ap;
  	struct ata_device *dev;
  	struct scsi_device *scsidev = cmd->device;
2115ea94a   Tejun Heo   [PATCH] libata-nc...
3141
  	int rc = 0;
23e701e62   Jeff Garzik   [libata] remove S...
3142
  	unsigned long irq_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3143

35bb94b11   Jeff Garzik   libata: Add helpe...
3144
  	ap = ata_shost_to_port(shost);
005a5a06a   Jeff Garzik   [libata] locking ...
3145

23e701e62   Jeff Garzik   [libata] remove S...
3146
  	spin_lock_irqsave(ap->lock, irq_flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3147
3148
3149
3150
  
  	ata_scsi_dump_cdb(ap, cmd);
  
  	dev = ata_scsi_find_dev(ap, scsidev);
eb3f0f9c6   Brian King   [PATCH] libata: a...
3151
  	if (likely(dev))
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3152
  		rc = __ata_scsi_queuecmd(cmd, dev);
eb3f0f9c6   Brian King   [PATCH] libata: a...
3153
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3154
  		cmd->result = (DID_BAD_TARGET << 16);
23e701e62   Jeff Garzik   [libata] remove S...
3155
  		cmd->scsi_done(cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3156
  	}
23e701e62   Jeff Garzik   [libata] remove S...
3157
  	spin_unlock_irqrestore(ap->lock, irq_flags);
2115ea94a   Tejun Heo   [PATCH] libata-nc...
3158
  	return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3159
3160
3161
3162
  }
  
  /**
   *	ata_scsi_simulate - simulate SCSI command on ATA device
c893a3ae4   Randy Dunlap   Various libata do...
3163
   *	@dev: the target device
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3164
   *	@cmd: SCSI command being sent to device.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3165
3166
3167
3168
3169
   *
   *	Interprets and directly executes a select list of SCSI commands
   *	that can be handled internally.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
3170
   *	spin_lock_irqsave(host lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3171
   */
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3172
  void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3173
3174
  {
  	struct ata_scsi_args args;
057ace5e7   Jeff Garzik   libata: const-ifi...
3175
  	const u8 *scsicmd = cmd->cmnd;
453941455   Jeff Garzik   [libata] Slightly...
3176
  	u8 tmp8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3177

9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
3178
3179
  	args.dev = dev;
  	args.id = dev->id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3180
  	args.cmd = cmd;
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3181
  	args.done = cmd->scsi_done;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3182
3183
  
  	switch(scsicmd[0]) {
2dcb407e6   Jeff Garzik   [libata] checkpat...
3184
3185
  	/* TODO: worth improving? */
  	case FORMAT_UNIT:
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3186
  		ata_scsi_invalid_field(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3187
3188
3189
3190
  		break;
  
  	case INQUIRY:
  		if (scsicmd[1] & 2)	           /* is CmdDt set?  */
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3191
  			ata_scsi_invalid_field(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3192
3193
3194
3195
3196
  		else if ((scsicmd[1] & 1) == 0)    /* is EVPD clear? */
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
  		else switch (scsicmd[2]) {
  		case 0x00:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3197
  			break;
2dcb407e6   Jeff Garzik   [libata] checkpat...
3198
3199
  		case 0x80:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3200
  			break;
2dcb407e6   Jeff Garzik   [libata] checkpat...
3201
3202
  		case 0x83:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3203
  			break;
2dcb407e6   Jeff Garzik   [libata] checkpat...
3204
3205
3206
  		case 0x89:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89);
  			break;
18f0f9785   Christoph Hellwig   libata: add trans...
3207
3208
3209
  		case 0xb0:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b0);
  			break;
1e9dbc929   Matthew Wilcox   [libata] Add supp...
3210
3211
3212
  		case 0xb1:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b1);
  			break;
02e0a6047   Martin K. Petersen   libata: Signal th...
3213
3214
3215
  		case 0xb2:
  			ata_scsi_rbuf_fill(&args, ata_scsiop_inq_b2);
  			break;
2dcb407e6   Jeff Garzik   [libata] checkpat...
3216
  		default:
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3217
  			ata_scsi_invalid_field(cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3218
  			break;
2dcb407e6   Jeff Garzik   [libata] checkpat...
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
  		}
  		break;
  
  	case MODE_SENSE:
  	case MODE_SENSE_10:
  		ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
  		break;
  
  	case MODE_SELECT:	/* unconditionally return */
  	case MODE_SELECT_10:	/* bad-field-in-cdb */
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3229
  		ata_scsi_invalid_field(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3230
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3231

2dcb407e6   Jeff Garzik   [libata] checkpat...
3232
3233
3234
3235
3236
3237
  	case READ_CAPACITY:
  		ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
  		break;
  
  	case SERVICE_ACTION_IN:
  		if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3238
  			ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3239
  		else
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3240
  			ata_scsi_invalid_field(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3241
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3242

2dcb407e6   Jeff Garzik   [libata] checkpat...
3243
3244
3245
  	case REPORT_LUNS:
  		ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3246

2dcb407e6   Jeff Garzik   [libata] checkpat...
3247
3248
3249
  	case REQUEST_SENSE:
  		ata_scsi_set_sense(cmd, 0, 0, 0);
  		cmd->result = (DRIVER_SENSE << 24);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3250
  		cmd->scsi_done(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3251
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3252

2dcb407e6   Jeff Garzik   [libata] checkpat...
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
  	/* if we reach this, then writeback caching is disabled,
  	 * turning this into a no-op.
  	 */
  	case SYNCHRONIZE_CACHE:
  		/* fall through */
  
  	/* no-op's, complete with success */
  	case REZERO_UNIT:
  	case SEEK_6:
  	case SEEK_10:
  	case TEST_UNIT_READY:
  		ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
  		break;
453941455   Jeff Garzik   [libata] Slightly...
3266

2dcb407e6   Jeff Garzik   [libata] checkpat...
3267
3268
3269
  	case SEND_DIAGNOSTIC:
  		tmp8 = scsicmd[1] & ~(1 << 3);
  		if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
00bd02027   Jeff Garzik   [libata] SCSI: im...
3270
  			ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3271
  		else
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3272
  			ata_scsi_invalid_field(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3273
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3274

2dcb407e6   Jeff Garzik   [libata] checkpat...
3275
3276
3277
3278
  	/* all other commands */
  	default:
  		ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
  		/* "Invalid command operation code" */
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3279
  		cmd->scsi_done(cmd);
2dcb407e6   Jeff Garzik   [libata] checkpat...
3280
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3281
3282
  	}
  }
f31871951   Tejun Heo   libata: separate ...
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
  int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
  {
  	int i, rc;
  
  	for (i = 0; i < host->n_ports; i++) {
  		struct ata_port *ap = host->ports[i];
  		struct Scsi_Host *shost;
  
  		rc = -ENOMEM;
  		shost = scsi_host_alloc(sht, sizeof(struct ata_port *));
  		if (!shost)
  			goto err_alloc;
9ee4f3933   Lin Ming   ata: add ata port...
3295
  		shost->eh_noresume = 1;
f31871951   Tejun Heo   libata: separate ...
3296
3297
  		*(struct ata_port **)&shost->hostdata[0] = ap;
  		ap->scsi_host = shost;
d9027470b   Gwendal Grignou   [libata] Add ATA ...
3298
  		shost->transportt = ata_scsi_transport_template;
f31871951   Tejun Heo   libata: separate ...
3299
3300
3301
3302
3303
  		shost->unique_id = ap->print_id;
  		shost->max_id = 16;
  		shost->max_lun = 1;
  		shost->max_channel = 1;
  		shost->max_cmd_len = 16;
31cc23b34   Tejun Heo   libata-pmp-prep: ...
3304
3305
3306
3307
3308
3309
  		/* Schedule policy is determined by ->qc_defer()
  		 * callback and it needs to see every deferred qc.
  		 * Set host_blocked to 1 to prevent SCSI midlayer from
  		 * automatically deferring requests.
  		 */
  		shost->max_host_blocked = 1;
9a6d6a2dd   Lin Ming   ata: make ata por...
3310
  		rc = scsi_add_host(ap->scsi_host, &ap->tdev);
f31871951   Tejun Heo   libata: separate ...
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
  		if (rc)
  			goto err_add;
  	}
  
  	return 0;
  
   err_add:
  	scsi_host_put(host->ports[i]->scsi_host);
   err_alloc:
  	while (--i >= 0) {
  		struct Scsi_Host *shost = host->ports[i]->scsi_host;
  
  		scsi_remove_host(shost);
  		scsi_host_put(shost);
  	}
  	return rc;
  }
1ae463171   Tejun Heo   libata: improve S...
3328
  void ata_scsi_scan_host(struct ata_port *ap, int sync)
644dd0cc4   Jeff Garzik   [libata] improve ...
3329
  {
1ae463171   Tejun Heo   libata: improve S...
3330
3331
  	int tries = 5;
  	struct ata_device *last_failed_dev = NULL;
41bda9c98   Tejun Heo   libata-link: upda...
3332
  	struct ata_link *link;
1ae463171   Tejun Heo   libata: improve S...
3333
  	struct ata_device *dev;
644dd0cc4   Jeff Garzik   [libata] improve ...
3334

1ae463171   Tejun Heo   libata: improve S...
3335
   repeat:
1eca4365b   Tejun Heo   libata: beef up i...
3336
3337
  	ata_for_each_link(link, ap, EDGE) {
  		ata_for_each_dev(dev, link, ENABLED) {
41bda9c98   Tejun Heo   libata-link: upda...
3338
3339
  			struct scsi_device *sdev;
  			int channel = 0, id = 0;
3edebac41   Tejun Heo   [PATCH] libata-hp...
3340

1eca4365b   Tejun Heo   libata: beef up i...
3341
  			if (dev->sdev)
41bda9c98   Tejun Heo   libata-link: upda...
3342
  				continue;
3f19ee8cb   Jeff Garzik   [libata] improve ...
3343

41bda9c98   Tejun Heo   libata-link: upda...
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
  			if (ata_is_host_link(link))
  				id = dev->devno;
  			else
  				channel = link->pmp;
  
  			sdev = __scsi_add_device(ap->scsi_host, channel, id, 0,
  						 NULL);
  			if (!IS_ERR(sdev)) {
  				dev->sdev = sdev;
  				scsi_device_put(sdev);
295124dce   Grant Grundler   [libata] support ...
3354
3355
  			} else {
  				dev->sdev = NULL;
41bda9c98   Tejun Heo   libata-link: upda...
3356
  			}
3edebac41   Tejun Heo   [PATCH] libata-hp...
3357
  		}
3f19ee8cb   Jeff Garzik   [libata] improve ...
3358
  	}
1ae463171   Tejun Heo   libata: improve S...
3359
3360
3361
3362
3363
  
  	/* If we scanned while EH was in progress or allocation
  	 * failure occurred, scan would have failed silently.  Check
  	 * whether all devices are attached.
  	 */
1eca4365b   Tejun Heo   libata: beef up i...
3364
3365
3366
  	ata_for_each_link(link, ap, EDGE) {
  		ata_for_each_dev(dev, link, ENABLED) {
  			if (!dev->sdev)
41bda9c98   Tejun Heo   libata-link: upda...
3367
3368
  				goto exit_loop;
  		}
1ae463171   Tejun Heo   libata: improve S...
3369
  	}
41bda9c98   Tejun Heo   libata-link: upda...
3370
3371
   exit_loop:
  	if (!link)
1ae463171   Tejun Heo   libata: improve S...
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
  		return;
  
  	/* we're missing some SCSI devices */
  	if (sync) {
  		/* If caller requested synchrnous scan && we've made
  		 * any progress, sleep briefly and repeat.
  		 */
  		if (dev != last_failed_dev) {
  			msleep(100);
  			last_failed_dev = dev;
  			goto repeat;
  		}
  
  		/* We might be failing to detect boot device, give it
  		 * a few more chances.
  		 */
  		if (--tries) {
  			msleep(100);
  			goto repeat;
  		}
a9a79dfec   Joe Perches   ata: Convert ata_...
3392
3393
3394
  		ata_port_err(ap,
  			     "WARNING: synchronous SCSI scan failed without making any progress, switching to async
  ");
1ae463171   Tejun Heo   libata: improve S...
3395
  	}
ad72cf988   Tejun Heo   libata: take adva...
3396
  	queue_delayed_work(system_long_wq, &ap->hotplug_task,
1ae463171   Tejun Heo   libata: improve S...
3397
  			   round_jiffies_relative(HZ));
644dd0cc4   Jeff Garzik   [libata] improve ...
3398
  }
0ea035a3d   Tejun Heo   [PATCH] libata-hp...
3399
3400
3401
3402
3403
3404
3405
  
  /**
   *	ata_scsi_offline_dev - offline attached SCSI device
   *	@dev: ATA device to offline attached SCSI device for
   *
   *	This function is called from ata_eh_hotplug() and responsible
   *	for taking the SCSI device attached to @dev offline.  This
cca3974e4   Jeff Garzik   libata: Grand ren...
3406
   *	function is called with host lock which protects dev->sdev
0ea035a3d   Tejun Heo   [PATCH] libata-hp...
3407
3408
3409
   *	against clearing.
   *
   *	LOCKING:
cca3974e4   Jeff Garzik   libata: Grand ren...
3410
   *	spin_lock_irqsave(host lock)
0ea035a3d   Tejun Heo   [PATCH] libata-hp...
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
   *
   *	RETURNS:
   *	1 if attached SCSI device exists, 0 otherwise.
   */
  int ata_scsi_offline_dev(struct ata_device *dev)
  {
  	if (dev->sdev) {
  		scsi_device_set_state(dev->sdev, SDEV_OFFLINE);
  		return 1;
  	}
  	return 0;
  }
580b21023   Tejun Heo   [PATCH] libata-hp...
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
  
  /**
   *	ata_scsi_remove_dev - remove attached SCSI device
   *	@dev: ATA device to remove attached SCSI device for
   *
   *	This function is called from ata_eh_scsi_hotplug() and
   *	responsible for removing the SCSI device attached to @dev.
   *
   *	LOCKING:
   *	Kernel thread context (may sleep).
   */
  static void ata_scsi_remove_dev(struct ata_device *dev)
  {
9af5c9c97   Tejun Heo   libata-link: intr...
3436
  	struct ata_port *ap = dev->link->ap;
580b21023   Tejun Heo   [PATCH] libata-hp...
3437
3438
3439
3440
3441
3442
3443
3444
3445
  	struct scsi_device *sdev;
  	unsigned long flags;
  
  	/* Alas, we need to grab scan_mutex to ensure SCSI device
  	 * state doesn't change underneath us and thus
  	 * scsi_device_get() always succeeds.  The mutex locking can
  	 * be removed if there is __scsi_device_get() interface which
  	 * increments reference counts regardless of device state.
  	 */
cca3974e4   Jeff Garzik   libata: Grand ren...
3446
  	mutex_lock(&ap->scsi_host->scan_mutex);
ba6a13083   Jeff Garzik   [libata] Add host...
3447
  	spin_lock_irqsave(ap->lock, flags);
580b21023   Tejun Heo   [PATCH] libata-hp...
3448

cca3974e4   Jeff Garzik   libata: Grand ren...
3449
  	/* clearing dev->sdev is protected by host lock */
580b21023   Tejun Heo   [PATCH] libata-hp...
3450
3451
3452
3453
3454
  	sdev = dev->sdev;
  	dev->sdev = NULL;
  
  	if (sdev) {
  		/* If user initiated unplug races with us, sdev can go
cca3974e4   Jeff Garzik   libata: Grand ren...
3455
  		 * away underneath us after the host lock and
580b21023   Tejun Heo   [PATCH] libata-hp...
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
  		 * scan_mutex are released.  Hold onto it.
  		 */
  		if (scsi_device_get(sdev) == 0) {
  			/* The following ensures the attached sdev is
  			 * offline on return from ata_scsi_offline_dev()
  			 * regardless it wins or loses the race
  			 * against this function.
  			 */
  			scsi_device_set_state(sdev, SDEV_OFFLINE);
  		} else {
  			WARN_ON(1);
  			sdev = NULL;
  		}
  	}
ba6a13083   Jeff Garzik   [libata] Add host...
3470
  	spin_unlock_irqrestore(ap->lock, flags);
cca3974e4   Jeff Garzik   libata: Grand ren...
3471
  	mutex_unlock(&ap->scsi_host->scan_mutex);
580b21023   Tejun Heo   [PATCH] libata-hp...
3472
3473
  
  	if (sdev) {
a9a79dfec   Joe Perches   ata: Convert ata_...
3474
3475
3476
  		ata_dev_info(dev, "detaching (SCSI %s)
  ",
  			     dev_name(&sdev->sdev_gendev));
580b21023   Tejun Heo   [PATCH] libata-hp...
3477
3478
3479
3480
3481
  
  		scsi_remove_device(sdev);
  		scsi_device_put(sdev);
  	}
  }
41bda9c98   Tejun Heo   libata-link: upda...
3482
3483
3484
3485
  static void ata_scsi_handle_link_detach(struct ata_link *link)
  {
  	struct ata_port *ap = link->ap;
  	struct ata_device *dev;
1eca4365b   Tejun Heo   libata: beef up i...
3486
  	ata_for_each_dev(dev, link, ALL) {
41bda9c98   Tejun Heo   libata-link: upda...
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
  		unsigned long flags;
  
  		if (!(dev->flags & ATA_DFLAG_DETACHED))
  			continue;
  
  		spin_lock_irqsave(ap->lock, flags);
  		dev->flags &= ~ATA_DFLAG_DETACHED;
  		spin_unlock_irqrestore(ap->lock, flags);
  
  		ata_scsi_remove_dev(dev);
  	}
  }
580b21023   Tejun Heo   [PATCH] libata-hp...
3499
  /**
2f2949680   Kristen Carlson Accardi   [libata] ahci: se...
3500
   *	ata_scsi_media_change_notify - send media change event
c5d0e6a0d   Randy Dunlap   docbook: fix liba...
3501
   *	@dev: Pointer to the disk device with media change event
2f2949680   Kristen Carlson Accardi   [libata] ahci: se...
3502
3503
3504
3505
3506
   *
   *	Tell the block layer to send a media change notification
   *	event.
   *
   * 	LOCKING:
854c73a2f   Tejun Heo   libata: misc upda...
3507
   * 	spin_lock_irqsave(host lock)
2f2949680   Kristen Carlson Accardi   [libata] ahci: se...
3508
   */
854c73a2f   Tejun Heo   libata: misc upda...
3509
  void ata_scsi_media_change_notify(struct ata_device *dev)
2f2949680   Kristen Carlson Accardi   [libata] ahci: se...
3510
  {
854c73a2f   Tejun Heo   libata: misc upda...
3511
  	if (dev->sdev)
f26792d5c   Jeff Garzik   [libata] Utilize ...
3512
3513
  		sdev_evt_send_simple(dev->sdev, SDEV_EVT_MEDIA_CHANGE,
  				     GFP_ATOMIC);
2f2949680   Kristen Carlson Accardi   [libata] ahci: se...
3514
  }
2f2949680   Kristen Carlson Accardi   [libata] ahci: se...
3515
3516
  
  /**
580b21023   Tejun Heo   [PATCH] libata-hp...
3517
   *	ata_scsi_hotplug - SCSI part of hotplug
65f27f384   David Howells   WorkStruct: Pass ...
3518
   *	@work: Pointer to ATA port to perform SCSI hotplug on
580b21023   Tejun Heo   [PATCH] libata-hp...
3519
3520
3521
3522
3523
3524
3525
3526
3527
   *
   *	Perform SCSI part of hotplug.  It's executed from a separate
   *	workqueue after EH completes.  This is necessary because SCSI
   *	hot plugging requires working EH and hot unplugging is
   *	synchronized with hot plugging with a mutex.
   *
   *	LOCKING:
   *	Kernel thread context (may sleep).
   */
65f27f384   David Howells   WorkStruct: Pass ...
3528
  void ata_scsi_hotplug(struct work_struct *work)
580b21023   Tejun Heo   [PATCH] libata-hp...
3529
  {
65f27f384   David Howells   WorkStruct: Pass ...
3530
3531
  	struct ata_port *ap =
  		container_of(work, struct ata_port, hotplug_task.work);
41bda9c98   Tejun Heo   libata-link: upda...
3532
  	int i;
580b21023   Tejun Heo   [PATCH] libata-hp...
3533

b51e9e5db   Tejun Heo   [PATCH] libata: a...
3534
  	if (ap->pflags & ATA_PFLAG_UNLOADING) {
580b21023   Tejun Heo   [PATCH] libata-hp...
3535
3536
3537
3538
3539
3540
3541
  		DPRINTK("ENTER/EXIT - unloading
  ");
  		return;
  	}
  
  	DPRINTK("ENTER
  ");
ad72cf988   Tejun Heo   libata: take adva...
3542
  	mutex_lock(&ap->scsi_scan_mutex);
580b21023   Tejun Heo   [PATCH] libata-hp...
3543

41bda9c98   Tejun Heo   libata-link: upda...
3544
3545
3546
3547
3548
3549
3550
3551
  	/* Unplug detached devices.  We cannot use link iterator here
  	 * because PMP links have to be scanned even if PMP is
  	 * currently not attached.  Iterate manually.
  	 */
  	ata_scsi_handle_link_detach(&ap->link);
  	if (ap->pmp_link)
  		for (i = 0; i < SATA_PMP_MAX_PORTS; i++)
  			ata_scsi_handle_link_detach(&ap->pmp_link[i]);
580b21023   Tejun Heo   [PATCH] libata-hp...
3552
3553
  
  	/* scan for new ones */
1ae463171   Tejun Heo   libata: improve S...
3554
  	ata_scsi_scan_host(ap, 0);
580b21023   Tejun Heo   [PATCH] libata-hp...
3555

ad72cf988   Tejun Heo   libata: take adva...
3556
  	mutex_unlock(&ap->scsi_scan_mutex);
580b21023   Tejun Heo   [PATCH] libata-hp...
3557
3558
3559
  	DPRINTK("EXIT
  ");
  }
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
  
  /**
   *	ata_scsi_user_scan - indication for user-initiated bus scan
   *	@shost: SCSI host to scan
   *	@channel: Channel to scan
   *	@id: ID to scan
   *	@lun: LUN to scan
   *
   *	This function is called when user explicitly requests bus
   *	scan.  Set probe pending flag and invoke EH.
   *
   *	LOCKING:
   *	SCSI layer (we don't care)
   *
   *	RETURNS:
   *	Zero.
   */
d9027470b   Gwendal Grignou   [libata] Add ATA ...
3577
3578
  int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
  		       unsigned int id, unsigned int lun)
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3579
3580
3581
  {
  	struct ata_port *ap = ata_shost_to_port(shost);
  	unsigned long flags;
41bda9c98   Tejun Heo   libata-link: upda...
3582
  	int devno, rc = 0;
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3583
3584
3585
  
  	if (!ap->ops->error_handler)
  		return -EOPNOTSUPP;
41bda9c98   Tejun Heo   libata-link: upda...
3586
  	if (lun != SCAN_WILD_CARD && lun)
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3587
  		return -EINVAL;
071f44b1d   Tejun Heo   libata: implement...
3588
  	if (!sata_pmp_attached(ap)) {
41bda9c98   Tejun Heo   libata-link: upda...
3589
3590
3591
3592
3593
3594
3595
3596
  		if (channel != SCAN_WILD_CARD && channel)
  			return -EINVAL;
  		devno = id;
  	} else {
  		if (id != SCAN_WILD_CARD && id)
  			return -EINVAL;
  		devno = channel;
  	}
ba6a13083   Jeff Garzik   [libata] Add host...
3597
  	spin_lock_irqsave(ap->lock, flags);
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3598

41bda9c98   Tejun Heo   libata-link: upda...
3599
3600
  	if (devno == SCAN_WILD_CARD) {
  		struct ata_link *link;
1eca4365b   Tejun Heo   libata: beef up i...
3601
  		ata_for_each_link(link, ap, EDGE) {
41bda9c98   Tejun Heo   libata-link: upda...
3602
  			struct ata_eh_info *ehi = &link->eh_info;
b558edddb   Tejun Heo   libata: kill ata_...
3603
  			ehi->probe_mask |= ATA_ALL_DEVICES;
cf4806265   Tejun Heo   libata: prefer ha...
3604
  			ehi->action |= ATA_EH_RESET;
41bda9c98   Tejun Heo   libata-link: upda...
3605
  		}
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3606
  	} else {
41bda9c98   Tejun Heo   libata-link: upda...
3607
  		struct ata_device *dev = ata_find_dev(ap, devno);
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3608
3609
  
  		if (dev) {
41bda9c98   Tejun Heo   libata-link: upda...
3610
  			struct ata_eh_info *ehi = &dev->link->eh_info;
9af5c9c97   Tejun Heo   libata-link: intr...
3611
  			ehi->probe_mask |= 1 << dev->devno;
cf4806265   Tejun Heo   libata: prefer ha...
3612
  			ehi->action |= ATA_EH_RESET;
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3613
3614
3615
  		} else
  			rc = -EINVAL;
  	}
309afcb5c   Tejun Heo   [PATCH] libata: m...
3616
  	if (rc == 0) {
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3617
  		ata_port_schedule_eh(ap);
309afcb5c   Tejun Heo   [PATCH] libata: m...
3618
3619
3620
3621
  		spin_unlock_irqrestore(ap->lock, flags);
  		ata_port_wait_eh(ap);
  	} else
  		spin_unlock_irqrestore(ap->lock, flags);
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
3622
3623
3624
  
  	return rc;
  }
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3625
3626
  
  /**
d01712698   Tejun Heo   [PATCH] libata: f...
3627
   *	ata_scsi_dev_rescan - initiate scsi_rescan_device()
65f27f384   David Howells   WorkStruct: Pass ...
3628
   *	@work: Pointer to ATA port to perform scsi_rescan_device()
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3629
   *
d01712698   Tejun Heo   [PATCH] libata: f...
3630
   *	After ATA pass thru (SAT) commands are executed successfully,
ad72cf988   Tejun Heo   libata: take adva...
3631
   *	libata need to propagate the changes to SCSI layer.
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3632
   *
d01712698   Tejun Heo   [PATCH] libata: f...
3633
3634
   *	LOCKING:
   *	Kernel thread context (may sleep).
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3635
   */
65f27f384   David Howells   WorkStruct: Pass ...
3636
  void ata_scsi_dev_rescan(struct work_struct *work)
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3637
  {
65f27f384   David Howells   WorkStruct: Pass ...
3638
3639
  	struct ata_port *ap =
  		container_of(work, struct ata_port, scsi_rescan_task);
41bda9c98   Tejun Heo   libata-link: upda...
3640
  	struct ata_link *link;
f58229f80   Tejun Heo   libata-link: impl...
3641
  	struct ata_device *dev;
f84e7e41e   Tejun Heo   [PATCH] libata: m...
3642
  	unsigned long flags;
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3643

ad72cf988   Tejun Heo   libata: take adva...
3644
  	mutex_lock(&ap->scsi_scan_mutex);
f84e7e41e   Tejun Heo   [PATCH] libata: m...
3645
  	spin_lock_irqsave(ap->lock, flags);
1eca4365b   Tejun Heo   libata: beef up i...
3646
3647
  	ata_for_each_link(link, ap, EDGE) {
  		ata_for_each_dev(dev, link, ENABLED) {
41bda9c98   Tejun Heo   libata-link: upda...
3648
  			struct scsi_device *sdev = dev->sdev;
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3649

1eca4365b   Tejun Heo   libata: beef up i...
3650
  			if (!sdev)
41bda9c98   Tejun Heo   libata-link: upda...
3651
3652
3653
  				continue;
  			if (scsi_device_get(sdev))
  				continue;
f84e7e41e   Tejun Heo   [PATCH] libata: m...
3654

41bda9c98   Tejun Heo   libata-link: upda...
3655
3656
3657
3658
3659
  			spin_unlock_irqrestore(ap->lock, flags);
  			scsi_rescan_device(&(sdev->sdev_gendev));
  			scsi_device_put(sdev);
  			spin_lock_irqsave(ap->lock, flags);
  		}
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3660
  	}
f84e7e41e   Tejun Heo   [PATCH] libata: m...
3661
3662
  
  	spin_unlock_irqrestore(ap->lock, flags);
ad72cf988   Tejun Heo   libata: take adva...
3663
  	mutex_unlock(&ap->scsi_scan_mutex);
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
3664
  }
80289167f   Brian King   [PATCH] libata: A...
3665
3666
3667
  
  /**
   *	ata_sas_port_alloc - Allocate port for a SAS attached SATA device
4f931374e   Jeff Garzik   [libata] DocBook ...
3668
   *	@host: ATA host container for all SAS ports
80289167f   Brian King   [PATCH] libata: A...
3669
   *	@port_info: Information from low-level host driver
cca3974e4   Jeff Garzik   libata: Grand ren...
3670
   *	@shost: SCSI host that the scsi device is attached to
80289167f   Brian King   [PATCH] libata: A...
3671
3672
3673
3674
3675
3676
3677
   *
   *	LOCKING:
   *	PCI/etc. bus probe sem.
   *
   *	RETURNS:
   *	ata_port pointer on success / NULL on failure.
   */
cca3974e4   Jeff Garzik   libata: Grand ren...
3678
  struct ata_port *ata_sas_port_alloc(struct ata_host *host,
80289167f   Brian King   [PATCH] libata: A...
3679
  				    struct ata_port_info *port_info,
cca3974e4   Jeff Garzik   libata: Grand ren...
3680
  				    struct Scsi_Host *shost)
80289167f   Brian King   [PATCH] libata: A...
3681
  {
f31871951   Tejun Heo   libata: separate ...
3682
  	struct ata_port *ap;
80289167f   Brian King   [PATCH] libata: A...
3683

f31871951   Tejun Heo   libata: separate ...
3684
  	ap = ata_port_alloc(host);
80289167f   Brian King   [PATCH] libata: A...
3685
3686
  	if (!ap)
  		return NULL;
f31871951   Tejun Heo   libata: separate ...
3687
  	ap->port_no = 0;
a29b5dad4   James Bottomley   libata: fix locki...
3688
  	ap->lock = &host->lock;
f31871951   Tejun Heo   libata: separate ...
3689
3690
3691
3692
3693
3694
  	ap->pio_mask = port_info->pio_mask;
  	ap->mwdma_mask = port_info->mwdma_mask;
  	ap->udma_mask = port_info->udma_mask;
  	ap->flags |= port_info->flags;
  	ap->ops = port_info->port_ops;
  	ap->cbl = ATA_CBL_SATA;
80289167f   Brian King   [PATCH] libata: A...
3695
3696
3697
3698
3699
3700
3701
3702
3703
  	return ap;
  }
  EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
  
  /**
   *	ata_sas_port_start - Set port up for dma.
   *	@ap: Port to initialize
   *
   *	Called just after data structures for each port are
dde202075   James Bottomley   libata: eliminate...
3704
   *	initialized.
80289167f   Brian King   [PATCH] libata: A...
3705
3706
3707
3708
3709
3710
3711
3712
   *
   *	May be used as the port_start() entry in ata_port_operations.
   *
   *	LOCKING:
   *	Inherited from caller.
   */
  int ata_sas_port_start(struct ata_port *ap)
  {
3f1e046ad   Nishanth Aravamudan   libata/sas: only ...
3713
3714
3715
3716
3717
3718
  	/*
  	 * the port is marked as frozen at allocation time, but if we don't
  	 * have new eh, we won't thaw it
  	 */
  	if (!ap->ops->error_handler)
  		ap->pflags &= ~ATA_PFLAG_FROZEN;
dde202075   James Bottomley   libata: eliminate...
3719
  	return 0;
80289167f   Brian King   [PATCH] libata: A...
3720
3721
3722
3723
3724
3725
3726
  }
  EXPORT_SYMBOL_GPL(ata_sas_port_start);
  
  /**
   *	ata_port_stop - Undo ata_sas_port_start()
   *	@ap: Port to shut down
   *
80289167f   Brian King   [PATCH] libata: A...
3727
3728
3729
3730
3731
3732
3733
3734
   *	May be used as the port_stop() entry in ata_port_operations.
   *
   *	LOCKING:
   *	Inherited from caller.
   */
  
  void ata_sas_port_stop(struct ata_port *ap)
  {
80289167f   Brian King   [PATCH] libata: A...
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
  }
  EXPORT_SYMBOL_GPL(ata_sas_port_stop);
  
  /**
   *	ata_sas_port_init - Initialize a SATA device
   *	@ap: SATA port to initialize
   *
   *	LOCKING:
   *	PCI/etc. bus probe sem.
   *
   *	RETURNS:
   *	Zero on success, non-zero on error.
   */
  
  int ata_sas_port_init(struct ata_port *ap)
  {
  	int rc = ap->ops->port_start(ap);
f31871951   Tejun Heo   libata: separate ...
3752
3753
  	if (!rc) {
  		ap->print_id = ata_print_id++;
238c9cf9e   James Bottomley   libata: plumb sas...
3754
  		rc = ata_port_probe(ap);
f31871951   Tejun Heo   libata: separate ...
3755
  	}
80289167f   Brian King   [PATCH] libata: A...
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
  
  	return rc;
  }
  EXPORT_SYMBOL_GPL(ata_sas_port_init);
  
  /**
   *	ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
   *	@ap: SATA port to destroy
   *
   */
  
  void ata_sas_port_destroy(struct ata_port *ap)
  {
f0d36efdc   Tejun Heo   libata: update li...
3769
3770
  	if (ap->ops->port_stop)
  		ap->ops->port_stop(ap);
80289167f   Brian King   [PATCH] libata: A...
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
  	kfree(ap);
  }
  EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
  
  /**
   *	ata_sas_slave_configure - Default slave_config routine for libata devices
   *	@sdev: SCSI device to configure
   *	@ap: ATA port to which SCSI device is attached
   *
   *	RETURNS:
   *	Zero.
   */
  
  int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
  {
  	ata_scsi_sdev_config(sdev);
9af5c9c97   Tejun Heo   libata-link: intr...
3787
  	ata_scsi_dev_config(sdev, ap->link.device);
80289167f   Brian King   [PATCH] libata: A...
3788
3789
3790
3791
3792
3793
3794
  	return 0;
  }
  EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
  
  /**
   *	ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
   *	@cmd: SCSI command to be sent
80289167f   Brian King   [PATCH] libata: A...
3795
3796
3797
   *	@ap:	ATA port to which the command is being sent
   *
   *	RETURNS:
08475a192   Brian King   [PATCH] libata: F...
3798
3799
   *	Return value from __ata_scsi_queuecmd() if @cmd can be queued,
   *	0 otherwise.
80289167f   Brian King   [PATCH] libata: A...
3800
   */
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3801
  int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
80289167f   Brian King   [PATCH] libata: A...
3802
  {
08475a192   Brian King   [PATCH] libata: F...
3803
  	int rc = 0;
80289167f   Brian King   [PATCH] libata: A...
3804
  	ata_scsi_dump_cdb(ap, cmd);
2486fa561   Tejun Heo   libata: update at...
3805
  	if (likely(ata_dev_enabled(ap->link.device)))
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3806
  		rc = __ata_scsi_queuecmd(cmd, ap->link.device);
80289167f   Brian King   [PATCH] libata: A...
3807
3808
  	else {
  		cmd->result = (DID_BAD_TARGET << 16);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
3809
  		cmd->scsi_done(cmd);
80289167f   Brian King   [PATCH] libata: A...
3810
  	}
08475a192   Brian King   [PATCH] libata: F...
3811
  	return rc;
80289167f   Brian King   [PATCH] libata: A...
3812
3813
  }
  EXPORT_SYMBOL_GPL(ata_sas_queuecmd);