blob: 6ef5ecb917ce36fbcef6a046200cd3ce3a6060fb [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Jeff Garzikaf36d7f2005-08-28 20:18:39 -04002 * libata-scsi.c - helper library for ATA
3 *
4 * Maintained by: Jeff Garzik <jgarzik@pobox.com>
5 * Please ALWAYS copy linux-ide@vger.kernel.org
6 * on emails.
7 *
8 * Copyright 2003-2004 Red Hat, Inc. All rights reserved.
9 * Copyright 2003-2004 Jeff Garzik
10 *
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; see the file COPYING. If not, write to
24 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25 *
26 *
27 * libata documentation is available via 'make {ps|pdf}docs',
28 * as Documentation/DocBook/libata.*
29 *
30 * Hardware documentation available from
31 * - http://www.t10.org/
32 * - http://www.t13.org/
33 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070034 */
35
36#include <linux/kernel.h>
37#include <linux/blkdev.h>
38#include <linux/spinlock.h>
39#include <scsi/scsi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <scsi/scsi_host.h>
Christoph Hellwigbeb40482006-06-10 18:01:03 +020041#include <scsi/scsi_cmnd.h>
Mike Christie85837eb2005-11-11 16:38:53 -060042#include <scsi/scsi_eh.h>
Jeff Garzik005a5a02005-10-30 23:31:48 -050043#include <scsi/scsi_device.h>
Tejun Heoa6e6ce82006-05-15 21:03:48 +090044#include <scsi/scsi_tcq.h>
Tejun Heo30afc842006-03-18 18:40:14 +090045#include <scsi/scsi_transport.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include <linux/libata.h>
Jeff Garzikb0955182005-05-12 15:45:22 -040047#include <linux/hdreg.h>
Jeff Garzik2dcb4072007-10-19 06:42:56 -040048#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
50#include "libata.h"
51
Jeff Garzikb0955182005-05-12 15:45:22 -040052#define SECTOR_SIZE 512
53
Tejun Heoad706992006-12-17 10:45:57 +090054typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc);
Tejun Heoab5b3a52006-05-31 18:27:34 +090055
Jeff Garzik2dcb4072007-10-19 06:42:56 -040056static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
Tejun Heoab5b3a52006-05-31 18:27:34 +090057 const struct scsi_device *scsidev);
Jeff Garzik2dcb4072007-10-19 06:42:56 -040058static struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
Tejun Heoab5b3a52006-05-31 18:27:34 +090059 const struct scsi_device *scsidev);
Tejun Heo83c47bc2006-05-31 18:28:07 +090060static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
61 unsigned int id, unsigned int lun);
Tejun Heoab5b3a52006-05-31 18:27:34 +090062
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Douglas Gilbert00ac37f2005-10-28 15:58:28 -040064#define RW_RECOVERY_MPAGE 0x1
65#define RW_RECOVERY_MPAGE_LEN 12
66#define CACHE_MPAGE 0x8
67#define CACHE_MPAGE_LEN 20
68#define CONTROL_MPAGE 0xa
69#define CONTROL_MPAGE_LEN 12
70#define ALL_MPAGES 0x3f
71#define ALL_SUB_MPAGES 0xff
72
73
Jeff Garzik24f75682007-09-21 07:54:49 -040074static const u8 def_rw_recovery_mpage[RW_RECOVERY_MPAGE_LEN] = {
Douglas Gilbert00ac37f2005-10-28 15:58:28 -040075 RW_RECOVERY_MPAGE,
76 RW_RECOVERY_MPAGE_LEN - 2,
Jeff Garzik24f75682007-09-21 07:54:49 -040077 (1 << 7), /* AWRE */
Douglas Gilbert00ac37f2005-10-28 15:58:28 -040078 0, /* read retry count */
79 0, 0, 0, 0,
80 0, /* write retry count */
81 0, 0, 0
82};
83
84static const u8 def_cache_mpage[CACHE_MPAGE_LEN] = {
85 CACHE_MPAGE,
86 CACHE_MPAGE_LEN - 2,
87 0, /* contains WCE, needs to be 0 for logic */
88 0, 0, 0, 0, 0, 0, 0, 0, 0,
89 0, /* contains DRA, needs to be 0 for logic */
90 0, 0, 0, 0, 0, 0, 0
91};
92
93static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = {
94 CONTROL_MPAGE,
95 CONTROL_MPAGE_LEN - 2,
96 2, /* DSENSE=0, GLTSD=1 */
97 0, /* [QAM+QERR may be 1, see 05-359r1] */
98 0, 0, 0, 0, 0xff, 0xff,
99 0, 30 /* extended self test time, see 05-359r1 */
100};
101
Tejun Heo30afc842006-03-18 18:40:14 +0900102/*
103 * libata transport template. libata doesn't do real transport stuff.
104 * It just needs the eh_timed_out hook.
105 */
Tejun Heof3187192007-04-17 23:44:07 +0900106static struct scsi_transport_template ata_scsi_transport_template = {
Christoph Hellwig9227c332006-04-01 19:21:04 +0200107 .eh_strategy_handler = ata_scsi_error,
Tejun Heo30afc842006-03-18 18:40:14 +0900108 .eh_timed_out = ata_scsi_timed_out,
Tejun Heoccf68c32006-05-31 18:28:09 +0900109 .user_scan = ata_scsi_user_scan,
Tejun Heo30afc842006-03-18 18:40:14 +0900110};
111
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Kristen Carlson Accardica773292007-10-25 00:58:59 -0400113static const struct {
114 enum link_pm value;
115 const char *name;
116} link_pm_policy[] = {
117 { NOT_AVAILABLE, "max_performance" },
118 { MIN_POWER, "min_power" },
119 { MAX_PERFORMANCE, "max_performance" },
120 { MEDIUM_POWER, "medium_power" },
121};
122
123const char *ata_scsi_lpm_get(enum link_pm policy)
124{
125 int i;
126
127 for (i = 0; i < ARRAY_SIZE(link_pm_policy); i++)
128 if (link_pm_policy[i].value == policy)
129 return link_pm_policy[i].name;
130
131 return NULL;
132}
133
134static ssize_t ata_scsi_lpm_put(struct class_device *class_dev,
135 const char *buf, size_t count)
136{
137 struct Scsi_Host *shost = class_to_shost(class_dev);
138 struct ata_port *ap = ata_shost_to_port(shost);
139 enum link_pm policy = 0;
140 int i;
141
142 /*
143 * we are skipping array location 0 on purpose - this
144 * is because a value of NOT_AVAILABLE is displayed
145 * to the user as max_performance, but when the user
146 * writes "max_performance", they actually want the
147 * value to match MAX_PERFORMANCE.
148 */
149 for (i = 1; i < ARRAY_SIZE(link_pm_policy); i++) {
150 const int len = strlen(link_pm_policy[i].name);
151 if (strncmp(link_pm_policy[i].name, buf, len) == 0 &&
152 buf[len] == '\n') {
153 policy = link_pm_policy[i].value;
154 break;
155 }
156 }
157 if (!policy)
158 return -EINVAL;
159
160 ata_lpm_schedule(ap, policy);
161 return count;
162}
163
164static ssize_t
165ata_scsi_lpm_show(struct class_device *class_dev, char *buf)
166{
167 struct Scsi_Host *shost = class_to_shost(class_dev);
168 struct ata_port *ap = ata_shost_to_port(shost);
169 const char *policy =
170 ata_scsi_lpm_get(ap->pm_policy);
171
172 if (!policy)
173 return -EINVAL;
174
175 return snprintf(buf, 23, "%s\n", policy);
176}
177CLASS_DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR,
178 ata_scsi_lpm_show, ata_scsi_lpm_put);
179EXPORT_SYMBOL_GPL(class_device_attr_link_power_management_policy);
180
Douglas Gilbertae006512005-10-09 09:09:35 -0400181static void ata_scsi_invalid_field(struct scsi_cmnd *cmd,
182 void (*done)(struct scsi_cmnd *))
183{
184 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x24, 0x0);
185 /* "Invalid field in cbd" */
186 done(cmd);
187}
188
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189/**
190 * ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd.
191 * @sdev: SCSI device for which BIOS geometry is to be determined
192 * @bdev: block device associated with @sdev
193 * @capacity: capacity of SCSI device
194 * @geom: location to which geometry will be output
195 *
196 * Generic bios head/sector/cylinder calculator
197 * used by sd. Most BIOSes nowadays expect a XXX/255/16 (CHS)
198 * mapping. Some situations may arise where the disk is not
199 * bootable if this is not used.
200 *
201 * LOCKING:
202 * Defined by the SCSI layer. We don't really care.
203 *
204 * RETURNS:
205 * Zero.
206 */
207int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
208 sector_t capacity, int geom[])
209{
210 geom[0] = 255;
211 geom[1] = 63;
212 sector_div(capacity, 255*63);
213 geom[2] = capacity;
214
215 return 0;
216}
217
Jeff Garzikb0955182005-05-12 15:45:22 -0400218/**
Tejun Heo5924b742007-01-02 20:20:07 +0900219 * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
220 * @sdev: SCSI device to get identify data for
221 * @arg: User buffer area for identify data
222 *
223 * LOCKING:
224 * Defined by the SCSI layer. We don't really care.
225 *
226 * RETURNS:
227 * Zero on success, negative errno on error.
228 */
229static int ata_get_identity(struct scsi_device *sdev, void __user *arg)
230{
231 struct ata_port *ap = ata_shost_to_port(sdev->host);
232 struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
233 u16 __user *dst = arg;
234 char buf[40];
235
236 if (!dev)
237 return -ENOMSG;
238
239 if (copy_to_user(dst, dev->id, ATA_ID_WORDS * sizeof(u16)))
240 return -EFAULT;
241
242 ata_id_string(dev->id, buf, ATA_ID_PROD, ATA_ID_PROD_LEN);
243 if (copy_to_user(dst + ATA_ID_PROD, buf, ATA_ID_PROD_LEN))
244 return -EFAULT;
245
246 ata_id_string(dev->id, buf, ATA_ID_FW_REV, ATA_ID_FW_REV_LEN);
247 if (copy_to_user(dst + ATA_ID_FW_REV, buf, ATA_ID_FW_REV_LEN))
248 return -EFAULT;
249
250 ata_id_string(dev->id, buf, ATA_ID_SERNO, ATA_ID_SERNO_LEN);
251 if (copy_to_user(dst + ATA_ID_SERNO, buf, ATA_ID_SERNO_LEN))
252 return -EFAULT;
253
254 return 0;
255}
256
257/**
Jeff Garzikb0955182005-05-12 15:45:22 -0400258 * ata_cmd_ioctl - Handler for HDIO_DRIVE_CMD ioctl
Randy Dunlap8e8b77d2005-11-01 21:29:27 -0800259 * @scsidev: Device to which we are issuing command
Jeff Garzikb0955182005-05-12 15:45:22 -0400260 * @arg: User provided data for issuing command
261 *
262 * LOCKING:
263 * Defined by the SCSI layer. We don't really care.
264 *
265 * RETURNS:
266 * Zero on success, negative errno on error.
267 */
Jeff Garzikb0955182005-05-12 15:45:22 -0400268int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
269{
270 int rc = 0;
271 u8 scsi_cmd[MAX_COMMAND_SIZE];
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700272 u8 args[4], *argbuf = NULL, *sensebuf = NULL;
Jeff Garzikb0955182005-05-12 15:45:22 -0400273 int argsize = 0;
Mike Christie85837eb2005-11-11 16:38:53 -0600274 enum dma_data_direction data_dir;
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700275 int cmd_result;
Jeff Garzikb0955182005-05-12 15:45:22 -0400276
Randy Dunlapc893a3a2006-01-28 13:15:32 -0500277 if (arg == NULL)
Jeff Garzikb0955182005-05-12 15:45:22 -0400278 return -EINVAL;
279
280 if (copy_from_user(args, arg, sizeof(args)))
281 return -EFAULT;
282
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700283 sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
284 if (!sensebuf)
285 return -ENOMEM;
286
Jeff Garzikb0955182005-05-12 15:45:22 -0400287 memset(scsi_cmd, 0, sizeof(scsi_cmd));
288
289 if (args[3]) {
290 argsize = SECTOR_SIZE * args[3];
291 argbuf = kmalloc(argsize, GFP_KERNEL);
Jeff Raubitschek54dac832005-10-04 10:21:19 -0400292 if (argbuf == NULL) {
293 rc = -ENOMEM;
294 goto error;
295 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400296
297 scsi_cmd[1] = (4 << 1); /* PIO Data-in */
298 scsi_cmd[2] = 0x0e; /* no off.line or cc, read from dev,
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400299 block count in sector count field */
Mike Christie85837eb2005-11-11 16:38:53 -0600300 data_dir = DMA_FROM_DEVICE;
Jeff Garzikb0955182005-05-12 15:45:22 -0400301 } else {
302 scsi_cmd[1] = (3 << 1); /* Non-data */
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700303 scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */
Mike Christie85837eb2005-11-11 16:38:53 -0600304 data_dir = DMA_NONE;
Jeff Garzikb0955182005-05-12 15:45:22 -0400305 }
306
307 scsi_cmd[0] = ATA_16;
308
309 scsi_cmd[4] = args[2];
310 if (args[0] == WIN_SMART) { /* hack -- ide driver does this too... */
311 scsi_cmd[6] = args[3];
312 scsi_cmd[8] = args[1];
313 scsi_cmd[10] = 0x4f;
314 scsi_cmd[12] = 0xc2;
315 } else {
316 scsi_cmd[6] = args[1];
317 }
318 scsi_cmd[14] = args[0];
319
320 /* Good values for timeout and retries? Values below
321 from scsi_ioctl_send_command() for default case... */
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700322 cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400323 sensebuf, (10*HZ), 5, 0);
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700324
325 if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
326 u8 *desc = sensebuf + 8;
327 cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
328
329 /* If we set cc then ATA pass-through will cause a
330 * check condition even if no error. Filter that. */
331 if (cmd_result & SAM_STAT_CHECK_CONDITION) {
332 struct scsi_sense_hdr sshdr;
333 scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400334 &sshdr);
335 if (sshdr.sense_key == 0 &&
336 sshdr.asc == 0 && sshdr.ascq == 0)
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700337 cmd_result &= ~SAM_STAT_CHECK_CONDITION;
338 }
339
340 /* Send userspace a few ATA registers (same as drivers/ide) */
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400341 if (sensebuf[0] == 0x72 && /* format is "descriptor" */
342 desc[0] == 0x09) { /* code is "ATA Descriptor" */
343 args[0] = desc[13]; /* status */
344 args[1] = desc[3]; /* error */
345 args[2] = desc[5]; /* sector count (0:7) */
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700346 if (copy_to_user(arg, args, sizeof(args)))
347 rc = -EFAULT;
348 }
349 }
350
351
352 if (cmd_result) {
Jeff Garzikb0955182005-05-12 15:45:22 -0400353 rc = -EIO;
354 goto error;
355 }
356
Jeff Garzikb0955182005-05-12 15:45:22 -0400357 if ((argbuf)
Randy Dunlapc893a3a2006-01-28 13:15:32 -0500358 && copy_to_user(arg + sizeof(args), argbuf, argsize))
Jeff Garzikb0955182005-05-12 15:45:22 -0400359 rc = -EFAULT;
360error:
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700361 kfree(sensebuf);
Jesper Juhl8f760782006-06-27 02:55:06 -0700362 kfree(argbuf);
Jeff Garzikb0955182005-05-12 15:45:22 -0400363 return rc;
364}
365
366/**
367 * ata_task_ioctl - Handler for HDIO_DRIVE_TASK ioctl
Randy Dunlap8e8b77d2005-11-01 21:29:27 -0800368 * @scsidev: Device to which we are issuing command
Jeff Garzikb0955182005-05-12 15:45:22 -0400369 * @arg: User provided data for issuing command
370 *
371 * LOCKING:
372 * Defined by the SCSI layer. We don't really care.
373 *
374 * RETURNS:
375 * Zero on success, negative errno on error.
376 */
377int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
378{
379 int rc = 0;
380 u8 scsi_cmd[MAX_COMMAND_SIZE];
David Milburnaf068bd2007-01-30 00:59:15 -0800381 u8 args[7], *sensebuf = NULL;
382 int cmd_result;
Jeff Garzikb0955182005-05-12 15:45:22 -0400383
Randy Dunlapc893a3a2006-01-28 13:15:32 -0500384 if (arg == NULL)
Jeff Garzikb0955182005-05-12 15:45:22 -0400385 return -EINVAL;
386
387 if (copy_from_user(args, arg, sizeof(args)))
388 return -EFAULT;
389
David Milburnaf068bd2007-01-30 00:59:15 -0800390 sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
391 if (!sensebuf)
392 return -ENOMEM;
393
Jeff Garzikb0955182005-05-12 15:45:22 -0400394 memset(scsi_cmd, 0, sizeof(scsi_cmd));
395 scsi_cmd[0] = ATA_16;
396 scsi_cmd[1] = (3 << 1); /* Non-data */
David Milburnaf068bd2007-01-30 00:59:15 -0800397 scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */
Jeff Garzikb0955182005-05-12 15:45:22 -0400398 scsi_cmd[4] = args[1];
399 scsi_cmd[6] = args[2];
400 scsi_cmd[8] = args[3];
401 scsi_cmd[10] = args[4];
402 scsi_cmd[12] = args[5];
Mark Lord277239f2007-03-30 17:45:52 -0400403 scsi_cmd[13] = args[6] & 0x4f;
Jeff Garzikb0955182005-05-12 15:45:22 -0400404 scsi_cmd[14] = args[0];
405
Jeff Garzikb0955182005-05-12 15:45:22 -0400406 /* Good values for timeout and retries? Values below
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500407 from scsi_ioctl_send_command() for default case... */
David Milburnaf068bd2007-01-30 00:59:15 -0800408 cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
409 sensebuf, (10*HZ), 5, 0);
Jeff Garzikb0955182005-05-12 15:45:22 -0400410
David Milburnaf068bd2007-01-30 00:59:15 -0800411 if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
412 u8 *desc = sensebuf + 8;
413 cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
414
415 /* If we set cc then ATA pass-through will cause a
416 * check condition even if no error. Filter that. */
417 if (cmd_result & SAM_STAT_CHECK_CONDITION) {
418 struct scsi_sense_hdr sshdr;
419 scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
420 &sshdr);
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400421 if (sshdr.sense_key == 0 &&
422 sshdr.asc == 0 && sshdr.ascq == 0)
David Milburnaf068bd2007-01-30 00:59:15 -0800423 cmd_result &= ~SAM_STAT_CHECK_CONDITION;
424 }
425
426 /* Send userspace ATA registers */
427 if (sensebuf[0] == 0x72 && /* format is "descriptor" */
428 desc[0] == 0x09) {/* code is "ATA Descriptor" */
429 args[0] = desc[13]; /* status */
430 args[1] = desc[3]; /* error */
431 args[2] = desc[5]; /* sector count (0:7) */
432 args[3] = desc[7]; /* lbal */
433 args[4] = desc[9]; /* lbam */
434 args[5] = desc[11]; /* lbah */
435 args[6] = desc[12]; /* select */
436 if (copy_to_user(arg, args, sizeof(args)))
437 rc = -EFAULT;
438 }
439 }
440
441 if (cmd_result) {
442 rc = -EIO;
443 goto error;
444 }
445
446 error:
447 kfree(sensebuf);
Jeff Garzikb0955182005-05-12 15:45:22 -0400448 return rc;
449}
450
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
452{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 int val = -EINVAL, rc = -EINVAL;
454
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 switch (cmd) {
456 case ATA_IOC_GET_IO32:
457 val = 0;
458 if (copy_to_user(arg, &val, 1))
459 return -EFAULT;
460 return 0;
461
462 case ATA_IOC_SET_IO32:
463 val = (unsigned long) arg;
464 if (val != 0)
465 return -EINVAL;
466 return 0;
467
Tejun Heo5924b742007-01-02 20:20:07 +0900468 case HDIO_GET_IDENTITY:
469 return ata_get_identity(scsidev, arg);
470
Jeff Garzikb0955182005-05-12 15:45:22 -0400471 case HDIO_DRIVE_CMD:
472 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
473 return -EACCES;
474 return ata_cmd_ioctl(scsidev, arg);
475
476 case HDIO_DRIVE_TASK:
477 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
478 return -EACCES;
479 return ata_task_ioctl(scsidev, arg);
480
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481 default:
482 rc = -ENOTTY;
483 break;
484 }
485
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 return rc;
487}
488
489/**
490 * ata_scsi_qc_new - acquire new ata_queued_cmd reference
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 * @dev: ATA device to which the new command is attached
492 * @cmd: SCSI command that originated this ATA command
493 * @done: SCSI command completion function
494 *
495 * Obtain a reference to an unused ata_queued_cmd structure,
496 * which is the basic libata structure representing a single
497 * ATA command sent to the hardware.
498 *
499 * If a command was available, fill in the SCSI-specific
500 * portions of the structure with information on the
501 * current command.
502 *
503 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400504 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 *
506 * RETURNS:
507 * Command allocated, or %NULL if none available.
508 */
Adrian Bunk7102d232007-01-04 00:09:36 +0100509static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
510 struct scsi_cmnd *cmd,
511 void (*done)(struct scsi_cmnd *))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512{
513 struct ata_queued_cmd *qc;
514
Tejun Heo3373efd2006-05-15 20:57:53 +0900515 qc = ata_qc_new_init(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516 if (qc) {
517 qc->scsicmd = cmd;
518 qc->scsidone = done;
519
Boaz Harrosh71201652007-09-18 17:48:50 +0200520 qc->__sg = scsi_sglist(cmd);
521 qc->n_elem = scsi_sg_count(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 } else {
523 cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
524 done(cmd);
525 }
526
527 return qc;
528}
529
530/**
Jeff Garzikb0955182005-05-12 15:45:22 -0400531 * ata_dump_status - user friendly display of error info
532 * @id: id of the port in question
533 * @tf: ptr to filled out taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 *
Jeff Garzikb0955182005-05-12 15:45:22 -0400535 * Decode and dump the ATA error/status registers for the user so
536 * that they have some idea what really happened at the non
537 * make-believe layer.
538 *
539 * LOCKING:
540 * inherited from caller
541 */
Adrian Bunk7102d232007-01-04 00:09:36 +0100542static void ata_dump_status(unsigned id, struct ata_taskfile *tf)
Jeff Garzikb0955182005-05-12 15:45:22 -0400543{
544 u8 stat = tf->command, err = tf->feature;
545
546 printk(KERN_WARNING "ata%u: status=0x%02x { ", id, stat);
547 if (stat & ATA_BUSY) {
548 printk("Busy }\n"); /* Data is not valid in this case */
549 } else {
550 if (stat & 0x40) printk("DriveReady ");
551 if (stat & 0x20) printk("DeviceFault ");
552 if (stat & 0x10) printk("SeekComplete ");
553 if (stat & 0x08) printk("DataRequest ");
554 if (stat & 0x04) printk("CorrectedError ");
555 if (stat & 0x02) printk("Index ");
556 if (stat & 0x01) printk("Error ");
557 printk("}\n");
558
559 if (err) {
560 printk(KERN_WARNING "ata%u: error=0x%02x { ", id, err);
561 if (err & 0x04) printk("DriveStatusError ");
562 if (err & 0x80) {
563 if (err & 0x04) printk("BadCRC ");
564 else printk("Sector ");
565 }
566 if (err & 0x40) printk("UncorrectableError ");
567 if (err & 0x10) printk("SectorIdNotFound ");
568 if (err & 0x02) printk("TrackZeroNotFound ");
569 if (err & 0x01) printk("AddrMarkNotFound ");
570 printk("}\n");
571 }
572 }
573}
574
575/**
576 * ata_to_sense_error - convert ATA error to SCSI error
Randy Dunlap8e8b77d2005-11-01 21:29:27 -0800577 * @id: ATA device number
Jeff Garzikb0955182005-05-12 15:45:22 -0400578 * @drv_stat: value contained in ATA status register
579 * @drv_err: value contained in ATA error register
580 * @sk: the sense key we'll fill out
581 * @asc: the additional sense code we'll fill out
582 * @ascq: the additional sense code qualifier we'll fill out
Tejun Heo246619d2006-05-15 20:58:16 +0900583 * @verbose: be verbose
Jeff Garzikb0955182005-05-12 15:45:22 -0400584 *
585 * Converts an ATA error into a SCSI error. Fill out pointers to
586 * SK, ASC, and ASCQ bytes for later use in fixed or descriptor
587 * format sense blocks.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 *
589 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400590 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591 */
Adrian Bunk7102d232007-01-04 00:09:36 +0100592static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
593 u8 *asc, u8 *ascq, int verbose)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594{
Jeff Garzikb0955182005-05-12 15:45:22 -0400595 int i;
Jeff Garzikffe75ef2005-10-09 10:40:44 -0400596
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597 /* Based on the 3ware driver translation table */
Arjan van de Ven98ac62d2005-11-28 10:06:23 +0100598 static const unsigned char sense_table[][4] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 /* BBD|ECC|ID|MAR */
600 {0xd1, ABORTED_COMMAND, 0x00, 0x00}, // Device busy Aborted command
601 /* BBD|ECC|ID */
602 {0xd0, ABORTED_COMMAND, 0x00, 0x00}, // Device busy Aborted command
603 /* ECC|MC|MARK */
604 {0x61, HARDWARE_ERROR, 0x00, 0x00}, // Device fault Hardware error
605 /* ICRC|ABRT */ /* NB: ICRC & !ABRT is BBD */
606 {0x84, ABORTED_COMMAND, 0x47, 0x00}, // Data CRC error SCSI parity error
607 /* MC|ID|ABRT|TRK0|MARK */
608 {0x37, NOT_READY, 0x04, 0x00}, // Unit offline Not ready
609 /* MCR|MARK */
610 {0x09, NOT_READY, 0x04, 0x00}, // Unrecovered disk error Not ready
611 /* Bad address mark */
612 {0x01, MEDIUM_ERROR, 0x13, 0x00}, // Address mark not found Address mark not found for data field
613 /* TRK0 */
614 {0x02, HARDWARE_ERROR, 0x00, 0x00}, // Track 0 not found Hardware error
615 /* Abort & !ICRC */
616 {0x04, ABORTED_COMMAND, 0x00, 0x00}, // Aborted command Aborted command
617 /* Media change request */
618 {0x08, NOT_READY, 0x04, 0x00}, // Media change request FIXME: faking offline
619 /* SRV */
620 {0x10, ABORTED_COMMAND, 0x14, 0x00}, // ID not found Recorded entity not found
621 /* Media change */
622 {0x08, NOT_READY, 0x04, 0x00}, // Media change FIXME: faking offline
623 /* ECC */
624 {0x40, MEDIUM_ERROR, 0x11, 0x04}, // Uncorrectable ECC error Unrecovered read error
625 /* BBD - block marked bad */
626 {0x80, MEDIUM_ERROR, 0x11, 0x04}, // Block marked bad Medium error, unrecovered read error
627 {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
628 };
Arjan van de Ven98ac62d2005-11-28 10:06:23 +0100629 static const unsigned char stat_table[][4] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 /* Must be first because BUSY means no other bits valid */
631 {0x80, ABORTED_COMMAND, 0x47, 0x00}, // Busy, fake parity for now
632 {0x20, HARDWARE_ERROR, 0x00, 0x00}, // Device fault
633 {0x08, ABORTED_COMMAND, 0x47, 0x00}, // Timed out in xfer, fake parity for now
634 {0x04, RECOVERED_ERROR, 0x11, 0x00}, // Recovered ECC error Medium error, recovered
635 {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
636 };
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 /*
639 * Is this an error we can process/parse
640 */
Jeff Garzikb0955182005-05-12 15:45:22 -0400641 if (drv_stat & ATA_BUSY) {
642 drv_err = 0; /* Ignore the err bits, they're invalid */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644
Jeff Garzikb0955182005-05-12 15:45:22 -0400645 if (drv_err) {
646 /* Look for drv_err */
647 for (i = 0; sense_table[i][0] != 0xFF; i++) {
648 /* Look for best matches first */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500649 if ((sense_table[i][0] & drv_err) ==
Jeff Garzikb0955182005-05-12 15:45:22 -0400650 sense_table[i][0]) {
651 *sk = sense_table[i][1];
652 *asc = sense_table[i][2];
653 *ascq = sense_table[i][3];
654 goto translate_done;
655 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400657 /* No immediate match */
Tejun Heo246619d2006-05-15 20:58:16 +0900658 if (verbose)
659 printk(KERN_WARNING "ata%u: no sense translation for "
660 "error 0x%02x\n", id, drv_err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 }
662
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663 /* Fall back to interpreting status bits */
Jeff Garzikb0955182005-05-12 15:45:22 -0400664 for (i = 0; stat_table[i][0] != 0xFF; i++) {
665 if (stat_table[i][0] & drv_stat) {
666 *sk = stat_table[i][1];
667 *asc = stat_table[i][2];
668 *ascq = stat_table[i][3];
669 goto translate_done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400672 /* No error? Undecoded? */
Tejun Heo246619d2006-05-15 20:58:16 +0900673 if (verbose)
674 printk(KERN_WARNING "ata%u: no sense translation for "
675 "status: 0x%02x\n", id, drv_stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
Alan Cox2d202022006-03-21 15:53:46 +0000677 /* We need a sensible error return here, which is tricky, and one
678 that won't cause people to do things like return a disk wrongly */
679 *sk = ABORTED_COMMAND;
680 *asc = 0x00;
681 *ascq = 0x00;
Jeff Garzikb0955182005-05-12 15:45:22 -0400682
683 translate_done:
Tejun Heo246619d2006-05-15 20:58:16 +0900684 if (verbose)
685 printk(KERN_ERR "ata%u: translated ATA stat/err 0x%02x/%02x "
686 "to SCSI SK/ASC/ASCQ 0x%x/%02x/%02x\n",
687 id, drv_stat, drv_err, *sk, *asc, *ascq);
Jeff Garzikb0955182005-05-12 15:45:22 -0400688 return;
689}
690
691/*
Tejun Heo750426a2006-11-14 22:37:35 +0900692 * ata_gen_passthru_sense - Generate check condition sense block.
Jeff Garzikb0955182005-05-12 15:45:22 -0400693 * @qc: Command that completed.
694 *
695 * This function is specific to the ATA descriptor format sense
696 * block specified for the ATA pass through commands. Regardless
697 * of whether the command errored or not, return a sense
698 * block. Copy all controller registers into the sense
699 * block. Clear sense key, ASC & ASCQ if there is no error.
700 *
701 * LOCKING:
Tejun Heo750426a2006-11-14 22:37:35 +0900702 * None.
Jeff Garzikb0955182005-05-12 15:45:22 -0400703 */
Tejun Heo750426a2006-11-14 22:37:35 +0900704static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -0400705{
706 struct scsi_cmnd *cmd = qc->scsicmd;
Tejun Heoe61e0672006-05-15 20:57:40 +0900707 struct ata_taskfile *tf = &qc->result_tf;
Jeff Garzikb0955182005-05-12 15:45:22 -0400708 unsigned char *sb = cmd->sense_buffer;
709 unsigned char *desc = sb + 8;
Tejun Heo246619d2006-05-15 20:58:16 +0900710 int verbose = qc->ap->ops->error_handler == NULL;
Jeff Garzikb0955182005-05-12 15:45:22 -0400711
712 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
713
Jeff Garzik0e5dec42005-10-06 09:40:20 -0400714 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
Jeff Garzikb0955182005-05-12 15:45:22 -0400715
716 /*
Jeff Garzikb0955182005-05-12 15:45:22 -0400717 * Use ata_to_sense_error() to map status register bits
718 * onto sense key, asc & ascq.
719 */
Tejun Heo058e55e2006-04-02 18:51:53 +0900720 if (qc->err_mask ||
721 tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
Tejun Heo44877b42007-02-21 01:06:51 +0900722 ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature,
Tejun Heo246619d2006-05-15 20:58:16 +0900723 &sb[1], &sb[2], &sb[3], verbose);
Jeff Garzikb0955182005-05-12 15:45:22 -0400724 sb[1] &= 0x0f;
725 }
726
727 /*
728 * Sense data is current and format is descriptor.
729 */
730 sb[0] = 0x72;
731
732 desc[0] = 0x09;
733
Tejun Heof38621b2006-11-14 22:37:35 +0900734 /* set length of additional sense data */
735 sb[7] = 14;
736 desc[1] = 12;
Jeff Garzikb0955182005-05-12 15:45:22 -0400737
738 /*
739 * Copy registers into sense buffer.
740 */
741 desc[2] = 0x00;
742 desc[3] = tf->feature; /* == error reg */
743 desc[5] = tf->nsect;
744 desc[7] = tf->lbal;
745 desc[9] = tf->lbam;
746 desc[11] = tf->lbah;
747 desc[12] = tf->device;
748 desc[13] = tf->command; /* == status reg */
749
750 /*
751 * Fill in Extend bit, and the high order bytes
752 * if applicable.
753 */
754 if (tf->flags & ATA_TFLAG_LBA48) {
755 desc[2] |= 0x01;
756 desc[4] = tf->hob_nsect;
757 desc[6] = tf->hob_lbal;
758 desc[8] = tf->hob_lbam;
759 desc[10] = tf->hob_lbah;
760 }
761}
762
763/**
Tejun Heo750426a2006-11-14 22:37:35 +0900764 * ata_gen_ata_sense - generate a SCSI fixed sense block
Jeff Garzikb0955182005-05-12 15:45:22 -0400765 * @qc: Command that we are erroring out
766 *
Tejun Heod25614b2006-11-14 22:37:35 +0900767 * Generate sense block for a failed ATA command @qc. Descriptor
768 * format is used to accomodate LBA48 block address.
Jeff Garzikb0955182005-05-12 15:45:22 -0400769 *
770 * LOCKING:
Tejun Heo750426a2006-11-14 22:37:35 +0900771 * None.
Jeff Garzikb0955182005-05-12 15:45:22 -0400772 */
Tejun Heo750426a2006-11-14 22:37:35 +0900773static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -0400774{
Tejun Heod25614b2006-11-14 22:37:35 +0900775 struct ata_device *dev = qc->dev;
Jeff Garzikb0955182005-05-12 15:45:22 -0400776 struct scsi_cmnd *cmd = qc->scsicmd;
Tejun Heoe61e0672006-05-15 20:57:40 +0900777 struct ata_taskfile *tf = &qc->result_tf;
Jeff Garzikb0955182005-05-12 15:45:22 -0400778 unsigned char *sb = cmd->sense_buffer;
Tejun Heod25614b2006-11-14 22:37:35 +0900779 unsigned char *desc = sb + 8;
Tejun Heo246619d2006-05-15 20:58:16 +0900780 int verbose = qc->ap->ops->error_handler == NULL;
Tejun Heod25614b2006-11-14 22:37:35 +0900781 u64 block;
Jeff Garzikb0955182005-05-12 15:45:22 -0400782
783 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
784
Jeff Garzik0e5dec42005-10-06 09:40:20 -0400785 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
Jeff Garzikb0955182005-05-12 15:45:22 -0400786
Tejun Heod25614b2006-11-14 22:37:35 +0900787 /* sense data is current and format is descriptor */
788 sb[0] = 0x72;
789
790 /* Use ata_to_sense_error() to map status register bits
Jeff Garzikb0955182005-05-12 15:45:22 -0400791 * onto sense key, asc & ascq.
792 */
Tejun Heo058e55e2006-04-02 18:51:53 +0900793 if (qc->err_mask ||
794 tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
Tejun Heo44877b42007-02-21 01:06:51 +0900795 ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature,
Tejun Heod25614b2006-11-14 22:37:35 +0900796 &sb[1], &sb[2], &sb[3], verbose);
797 sb[1] &= 0x0f;
Jeff Garzikb0955182005-05-12 15:45:22 -0400798 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799
Tejun Heod25614b2006-11-14 22:37:35 +0900800 block = ata_tf_read_block(&qc->result_tf, dev);
Jeff Garzik0274aa22005-06-22 13:50:56 -0400801
Tejun Heod25614b2006-11-14 22:37:35 +0900802 /* information sense data descriptor */
803 sb[7] = 12;
804 desc[0] = 0x00;
805 desc[1] = 10;
Jeff Garzika7dac442005-10-30 04:44:42 -0500806
Tejun Heod25614b2006-11-14 22:37:35 +0900807 desc[2] |= 0x80; /* valid */
808 desc[6] = block >> 40;
809 desc[7] = block >> 32;
810 desc[8] = block >> 24;
811 desc[9] = block >> 16;
812 desc[10] = block >> 8;
813 desc[11] = block;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814}
815
Brian Kinga6cce2a2006-03-17 17:04:15 -0600816static void ata_scsi_sdev_config(struct scsi_device *sdev)
817{
818 sdev->use_10_for_rw = 1;
819 sdev->use_10_for_ms = 1;
Tejun Heo31cc23b2007-09-23 13:14:12 +0900820
821 /* Schedule policy is determined by ->qc_defer() callback and
822 * it needs to see every deferred qc. Set dev_blocked to 1 to
823 * prevent SCSI midlayer from automatically deferring
824 * requests.
825 */
826 sdev->max_device_blocked = 1;
Brian Kinga6cce2a2006-03-17 17:04:15 -0600827}
828
829static void ata_scsi_dev_config(struct scsi_device *sdev,
830 struct ata_device *dev)
831{
Tejun Heo914ed352006-11-01 18:39:55 +0900832 /* configure max sectors */
833 blk_queue_max_sectors(sdev->request_queue, dev->max_sectors);
Brian Kinga6cce2a2006-03-17 17:04:15 -0600834
Tejun Heo914ed352006-11-01 18:39:55 +0900835 /* SATA DMA transfers must be multiples of 4 byte, so
Brian Kinga6cce2a2006-03-17 17:04:15 -0600836 * we need to pad ATAPI transfers using an extra sg.
837 * Decrement max hw segments accordingly.
838 */
839 if (dev->class == ATA_DEV_ATAPI) {
Jens Axboe165125e2007-07-24 09:28:11 +0200840 struct request_queue *q = sdev->request_queue;
Brian Kinga6cce2a2006-03-17 17:04:15 -0600841 blk_queue_max_hw_segments(q, q->max_hw_segments - 1);
842 }
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900843
844 if (dev->flags & ATA_DFLAG_NCQ) {
845 int depth;
846
847 depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id));
848 depth = min(ATA_MAX_QUEUE - 1, depth);
849 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth);
850 }
Brian Kinga6cce2a2006-03-17 17:04:15 -0600851}
852
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853/**
854 * ata_scsi_slave_config - Set SCSI device attributes
855 * @sdev: SCSI device to examine
856 *
857 * This is called before we actually start reading
858 * and writing to the device, to configure certain
859 * SCSI mid-layer behaviors.
860 *
861 * LOCKING:
862 * Defined by SCSI layer. We don't really care.
863 */
864
865int ata_scsi_slave_config(struct scsi_device *sdev)
866{
Tejun Heo31534362006-05-31 18:27:36 +0900867 struct ata_port *ap = ata_shost_to_port(sdev->host);
868 struct ata_device *dev = __ata_scsi_find_dev(ap, sdev);
869
Brian Kinga6cce2a2006-03-17 17:04:15 -0600870 ata_scsi_sdev_config(sdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871
Tejun Heo9666f402007-05-04 21:27:47 +0200872 sdev->manage_start_stop = 1;
873
Tejun Heo31534362006-05-31 18:27:36 +0900874 if (dev)
Brian Kinga6cce2a2006-03-17 17:04:15 -0600875 ata_scsi_dev_config(sdev, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876
877 return 0; /* scsi layer doesn't check return value, sigh */
878}
879
880/**
Tejun Heo83c47bc2006-05-31 18:28:07 +0900881 * ata_scsi_slave_destroy - SCSI device is about to be destroyed
882 * @sdev: SCSI device to be destroyed
883 *
884 * @sdev is about to be destroyed for hot/warm unplugging. If
885 * this unplugging was initiated by libata as indicated by NULL
886 * dev->sdev, this function doesn't have to do anything.
887 * Otherwise, SCSI layer initiated warm-unplug is in progress.
888 * Clear dev->sdev, schedule the device for ATA detach and invoke
889 * EH.
890 *
891 * LOCKING:
892 * Defined by SCSI layer. We don't really care.
893 */
894void ata_scsi_slave_destroy(struct scsi_device *sdev)
895{
896 struct ata_port *ap = ata_shost_to_port(sdev->host);
897 unsigned long flags;
898 struct ata_device *dev;
899
900 if (!ap->ops->error_handler)
901 return;
902
Jeff Garzikba6a1302006-06-22 23:46:10 -0400903 spin_lock_irqsave(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +0900904 dev = __ata_scsi_find_dev(ap, sdev);
905 if (dev && dev->sdev) {
906 /* SCSI device already in CANCEL state, no need to offline it */
907 dev->sdev = NULL;
908 dev->flags |= ATA_DFLAG_DETACH;
909 ata_port_schedule_eh(ap);
910 }
Jeff Garzikba6a1302006-06-22 23:46:10 -0400911 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +0900912}
913
914/**
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900915 * ata_scsi_change_queue_depth - SCSI callback for queue depth config
916 * @sdev: SCSI device to configure queue depth for
917 * @queue_depth: new queue depth
918 *
919 * This is libata standard hostt->change_queue_depth callback.
920 * SCSI will call into this callback when user tries to set queue
921 * depth via sysfs.
922 *
923 * LOCKING:
924 * SCSI layer (we don't care)
925 *
926 * RETURNS:
927 * Newly configured queue depth.
928 */
929int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
930{
931 struct ata_port *ap = ata_shost_to_port(sdev->host);
932 struct ata_device *dev;
Tejun Heo360f6542006-09-30 19:45:00 +0900933 unsigned long flags;
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900934
Tejun Heoc3c70c42007-02-20 23:31:22 +0900935 if (queue_depth < 1 || queue_depth == sdev->queue_depth)
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900936 return sdev->queue_depth;
937
938 dev = ata_scsi_find_dev(ap, sdev);
939 if (!dev || !ata_dev_enabled(dev))
940 return sdev->queue_depth;
941
Tejun Heoc3c70c42007-02-20 23:31:22 +0900942 /* NCQ enabled? */
Tejun Heo360f6542006-09-30 19:45:00 +0900943 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc3c70c42007-02-20 23:31:22 +0900944 dev->flags &= ~ATA_DFLAG_NCQ_OFF;
945 if (queue_depth == 1 || !ata_ncq_enabled(dev)) {
Tejun Heo360f6542006-09-30 19:45:00 +0900946 dev->flags |= ATA_DFLAG_NCQ_OFF;
Tejun Heoc3c70c42007-02-20 23:31:22 +0900947 queue_depth = 1;
948 }
Tejun Heo360f6542006-09-30 19:45:00 +0900949 spin_unlock_irqrestore(ap->lock, flags);
950
Tejun Heoc3c70c42007-02-20 23:31:22 +0900951 /* limit and apply queue depth */
952 queue_depth = min(queue_depth, sdev->host->can_queue);
953 queue_depth = min(queue_depth, ata_id_queue_depth(dev->id));
954 queue_depth = min(queue_depth, ATA_MAX_QUEUE - 1);
955
956 if (sdev->queue_depth == queue_depth)
957 return -EINVAL;
958
959 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth);
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900960 return queue_depth;
961}
962
Tejun Heod9aca222007-05-17 16:43:26 +0200963/* XXX: for spindown warning */
Tejun Heoda071b42007-05-14 17:26:18 +0200964static void ata_delayed_done_timerfn(unsigned long arg)
965{
966 struct scsi_cmnd *scmd = (void *)arg;
967
968 scmd->scsi_done(scmd);
969}
970
Tejun Heod9aca222007-05-17 16:43:26 +0200971/* XXX: for spindown warning */
Tejun Heoda071b42007-05-14 17:26:18 +0200972static void ata_delayed_done(struct scsi_cmnd *scmd)
973{
974 static struct timer_list timer;
975
976 setup_timer(&timer, ata_delayed_done_timerfn, (unsigned long)scmd);
977 mod_timer(&timer, jiffies + 5 * HZ);
978}
979
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900980/**
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400981 * ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
982 * @qc: Storage for translated ATA taskfile
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400983 *
984 * Sets up an ATA taskfile to issue STANDBY (to stop) or READ VERIFY
985 * (to start). Perhaps these commands should be preceded by
986 * CHECK POWER MODE to see what power mode the device is already in.
987 * [See SAT revision 5 at www.t10.org]
988 *
989 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400990 * spin_lock_irqsave(host lock)
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400991 *
992 * RETURNS:
993 * Zero on success, non-zero on error.
994 */
Tejun Heoad706992006-12-17 10:45:57 +0900995static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400996{
Tejun Heo542b1442006-12-17 10:45:08 +0900997 struct scsi_cmnd *scmd = qc->scsicmd;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400998 struct ata_taskfile *tf = &qc->tf;
Tejun Heoad706992006-12-17 10:45:57 +0900999 const u8 *cdb = scmd->cmnd;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001000
Tejun Heo2e5704f2006-12-17 10:46:33 +09001001 if (scmd->cmd_len < 5)
1002 goto invalid_fld;
1003
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001004 tf->flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
1005 tf->protocol = ATA_PROT_NODATA;
Tejun Heo542b1442006-12-17 10:45:08 +09001006 if (cdb[1] & 0x1) {
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001007 ; /* ignore IMMED bit, violates sat-r05 */
1008 }
Tejun Heo542b1442006-12-17 10:45:08 +09001009 if (cdb[4] & 0x2)
Douglas Gilbertae006512005-10-09 09:09:35 -04001010 goto invalid_fld; /* LOEJ bit set not supported */
Tejun Heo542b1442006-12-17 10:45:08 +09001011 if (((cdb[4] >> 4) & 0xf) != 0)
Douglas Gilbertae006512005-10-09 09:09:35 -04001012 goto invalid_fld; /* power conditions not supported */
Tejun Heoe31e85312007-09-23 13:14:13 +09001013
1014 if (qc->dev->horkage & ATA_HORKAGE_SKIP_PM) {
1015 /* the device lacks PM support, finish without doing anything */
1016 scmd->result = SAM_STAT_GOOD;
1017 return 1;
1018 }
1019
Tejun Heo542b1442006-12-17 10:45:08 +09001020 if (cdb[4] & 0x1) {
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001021 tf->nsect = 1; /* 1 sector, lba=0 */
Albert Lee9d5b1302005-10-04 08:48:17 -04001022
1023 if (qc->dev->flags & ATA_DFLAG_LBA) {
Tejun Heoc44078c2006-05-15 20:57:21 +09001024 tf->flags |= ATA_TFLAG_LBA;
Albert Lee9d5b1302005-10-04 08:48:17 -04001025
1026 tf->lbah = 0x0;
1027 tf->lbam = 0x0;
1028 tf->lbal = 0x0;
1029 tf->device |= ATA_LBA;
1030 } else {
1031 /* CHS */
1032 tf->lbal = 0x1; /* sect */
1033 tf->lbam = 0x0; /* cyl low */
1034 tf->lbah = 0x0; /* cyl high */
1035 }
1036
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001037 tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
Tejun Heo920a4b12007-05-04 21:28:48 +02001038 } else {
1039 /* XXX: This is for backward compatibility, will be
1040 * removed. Read Documentation/feature-removal-schedule.txt
1041 * for more info.
1042 */
Tejun Heod9aca222007-05-17 16:43:26 +02001043 if ((qc->dev->flags & ATA_DFLAG_SPUNDOWN) &&
Tejun Heo920a4b12007-05-04 21:28:48 +02001044 (system_state == SYSTEM_HALT ||
1045 system_state == SYSTEM_POWER_OFF)) {
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001046 static unsigned long warned;
Tejun Heo920a4b12007-05-04 21:28:48 +02001047
Tejun Heoda071b42007-05-14 17:26:18 +02001048 if (!test_and_set_bit(0, &warned)) {
Tejun Heo920a4b12007-05-04 21:28:48 +02001049 ata_dev_printk(qc->dev, KERN_WARNING,
1050 "DISK MIGHT NOT BE SPUN DOWN PROPERLY. "
1051 "UPDATE SHUTDOWN UTILITY\n");
1052 ata_dev_printk(qc->dev, KERN_WARNING,
1053 "For more info, visit "
1054 "http://linux-ata.org/shutdown.html\n");
Tejun Heoda071b42007-05-14 17:26:18 +02001055
1056 /* ->scsi_done is not used, use it for
1057 * delayed completion.
1058 */
1059 scmd->scsi_done = qc->scsidone;
1060 qc->scsidone = ata_delayed_done;
Tejun Heo920a4b12007-05-04 21:28:48 +02001061 }
1062 scmd->result = SAM_STAT_GOOD;
1063 return 1;
1064 }
1065
Robert Hancock78981a72007-01-30 00:59:18 -08001066 /* Issue ATA STANDBY IMMEDIATE command */
1067 tf->command = ATA_CMD_STANDBYNOW1;
Tejun Heo920a4b12007-05-04 21:28:48 +02001068 }
Robert Hancock78981a72007-01-30 00:59:18 -08001069
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001070 /*
1071 * Standby and Idle condition timers could be implemented but that
1072 * would require libata to implement the Power condition mode page
1073 * and allow the user to change it. Changing mode pages requires
1074 * MODE SELECT to be implemented.
1075 */
1076
1077 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001078
1079invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001080 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001081 /* "Invalid field in cbd" */
1082 return 1;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001083}
1084
1085
1086/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 * ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command
1088 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089 *
1090 * Sets up an ATA taskfile to issue FLUSH CACHE or
1091 * FLUSH CACHE EXT.
1092 *
1093 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001094 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001095 *
1096 * RETURNS:
1097 * Zero on success, non-zero on error.
1098 */
Tejun Heoad706992006-12-17 10:45:57 +09001099static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100{
1101 struct ata_taskfile *tf = &qc->tf;
1102
1103 tf->flags |= ATA_TFLAG_DEVICE;
1104 tf->protocol = ATA_PROT_NODATA;
1105
Tejun Heo6fc49ad2006-11-11 20:10:45 +09001106 if (qc->dev->flags & ATA_DFLAG_FLUSH_EXT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 tf->command = ATA_CMD_FLUSH_EXT;
1108 else
1109 tf->command = ATA_CMD_FLUSH;
1110
Tejun Heob666da32007-10-26 15:53:59 +09001111 /* flush is critical for IO integrity, consider it an IO command */
1112 qc->flags |= ATA_QCFLAG_IO;
1113
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114 return 0;
1115}
1116
1117/**
Albert Lee3aef5232005-10-04 08:47:43 -04001118 * scsi_6_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001119 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001120 *
1121 * Calculate LBA and transfer length for 6-byte commands.
1122 *
1123 * RETURNS:
1124 * @plba: the LBA
1125 * @plen: the transfer length
1126 */
Tejun Heo542b1442006-12-17 10:45:08 +09001127static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001128{
1129 u64 lba = 0;
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001130 u32 len;
Albert Lee3aef5232005-10-04 08:47:43 -04001131
1132 VPRINTK("six-byte command\n");
1133
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001134 lba |= ((u64)(cdb[1] & 0x1f)) << 16;
Tejun Heo542b1442006-12-17 10:45:08 +09001135 lba |= ((u64)cdb[2]) << 8;
1136 lba |= ((u64)cdb[3]);
Albert Lee3aef5232005-10-04 08:47:43 -04001137
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001138 len = cdb[4];
Albert Lee3aef5232005-10-04 08:47:43 -04001139
1140 *plba = lba;
1141 *plen = len;
1142}
1143
1144/**
1145 * scsi_10_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001146 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001147 *
1148 * Calculate LBA and transfer length for 10-byte commands.
1149 *
1150 * RETURNS:
1151 * @plba: the LBA
1152 * @plen: the transfer length
1153 */
Tejun Heo542b1442006-12-17 10:45:08 +09001154static void scsi_10_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001155{
1156 u64 lba = 0;
1157 u32 len = 0;
1158
1159 VPRINTK("ten-byte command\n");
1160
Tejun Heo542b1442006-12-17 10:45:08 +09001161 lba |= ((u64)cdb[2]) << 24;
1162 lba |= ((u64)cdb[3]) << 16;
1163 lba |= ((u64)cdb[4]) << 8;
1164 lba |= ((u64)cdb[5]);
Albert Lee3aef5232005-10-04 08:47:43 -04001165
Tejun Heo542b1442006-12-17 10:45:08 +09001166 len |= ((u32)cdb[7]) << 8;
1167 len |= ((u32)cdb[8]);
Albert Lee3aef5232005-10-04 08:47:43 -04001168
1169 *plba = lba;
1170 *plen = len;
1171}
1172
1173/**
1174 * scsi_16_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001175 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001176 *
1177 * Calculate LBA and transfer length for 16-byte commands.
1178 *
1179 * RETURNS:
1180 * @plba: the LBA
1181 * @plen: the transfer length
1182 */
Tejun Heo542b1442006-12-17 10:45:08 +09001183static void scsi_16_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001184{
1185 u64 lba = 0;
1186 u32 len = 0;
1187
1188 VPRINTK("sixteen-byte command\n");
1189
Tejun Heo542b1442006-12-17 10:45:08 +09001190 lba |= ((u64)cdb[2]) << 56;
1191 lba |= ((u64)cdb[3]) << 48;
1192 lba |= ((u64)cdb[4]) << 40;
1193 lba |= ((u64)cdb[5]) << 32;
1194 lba |= ((u64)cdb[6]) << 24;
1195 lba |= ((u64)cdb[7]) << 16;
1196 lba |= ((u64)cdb[8]) << 8;
1197 lba |= ((u64)cdb[9]);
Albert Lee3aef5232005-10-04 08:47:43 -04001198
Tejun Heo542b1442006-12-17 10:45:08 +09001199 len |= ((u32)cdb[10]) << 24;
1200 len |= ((u32)cdb[11]) << 16;
1201 len |= ((u32)cdb[12]) << 8;
1202 len |= ((u32)cdb[13]);
Albert Lee3aef5232005-10-04 08:47:43 -04001203
1204 *plba = lba;
1205 *plen = len;
1206}
1207
1208/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 * ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one
1210 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 *
1212 * Converts SCSI VERIFY command to an ATA READ VERIFY command.
1213 *
1214 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001215 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216 *
1217 * RETURNS:
1218 * Zero on success, non-zero on error.
1219 */
Tejun Heoad706992006-12-17 10:45:57 +09001220static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221{
Tejun Heo542b1442006-12-17 10:45:08 +09001222 struct scsi_cmnd *scmd = qc->scsicmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 struct ata_taskfile *tf = &qc->tf;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001224 struct ata_device *dev = qc->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225 u64 dev_sectors = qc->dev->n_sectors;
Tejun Heoad706992006-12-17 10:45:57 +09001226 const u8 *cdb = scmd->cmnd;
Albert Lee3aef5232005-10-04 08:47:43 -04001227 u64 block;
1228 u32 n_block;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229
1230 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
1231 tf->protocol = ATA_PROT_NODATA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232
Tejun Heo2e5704f2006-12-17 10:46:33 +09001233 if (cdb[0] == VERIFY) {
1234 if (scmd->cmd_len < 10)
1235 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001236 scsi_10_lba_len(cdb, &block, &n_block);
Tejun Heo2e5704f2006-12-17 10:46:33 +09001237 } else if (cdb[0] == VERIFY_16) {
1238 if (scmd->cmd_len < 16)
1239 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001240 scsi_16_lba_len(cdb, &block, &n_block);
Tejun Heo2e5704f2006-12-17 10:46:33 +09001241 } else
Douglas Gilbertae006512005-10-09 09:09:35 -04001242 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243
Albert Lee8bf62ece2005-05-12 15:29:42 -04001244 if (!n_block)
Douglas Gilbertae006512005-10-09 09:09:35 -04001245 goto nothing_to_do;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001246 if (block >= dev_sectors)
Douglas Gilbertae006512005-10-09 09:09:35 -04001247 goto out_of_range;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001248 if ((block + n_block) > dev_sectors)
Douglas Gilbertae006512005-10-09 09:09:35 -04001249 goto out_of_range;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250
Albert Lee07506692005-10-12 15:04:18 +08001251 if (dev->flags & ATA_DFLAG_LBA) {
1252 tf->flags |= ATA_TFLAG_LBA;
1253
Albert Leec6a33e22005-10-12 15:12:26 +08001254 if (lba_28_ok(block, n_block)) {
1255 /* use LBA28 */
1256 tf->command = ATA_CMD_VERIFY;
1257 tf->device |= (block >> 24) & 0xf;
1258 } else if (lba_48_ok(block, n_block)) {
1259 if (!(dev->flags & ATA_DFLAG_LBA48))
1260 goto out_of_range;
Albert Lee07506692005-10-12 15:04:18 +08001261
1262 /* use LBA48 */
1263 tf->flags |= ATA_TFLAG_LBA48;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001264 tf->command = ATA_CMD_VERIFY_EXT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265
Albert Lee8bf62ece2005-05-12 15:29:42 -04001266 tf->hob_nsect = (n_block >> 8) & 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267
Albert Lee8bf62ece2005-05-12 15:29:42 -04001268 tf->hob_lbah = (block >> 40) & 0xff;
1269 tf->hob_lbam = (block >> 32) & 0xff;
1270 tf->hob_lbal = (block >> 24) & 0xff;
Albert Leec6a33e22005-10-12 15:12:26 +08001271 } else
1272 /* request too large even for LBA48 */
1273 goto out_of_range;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001274
1275 tf->nsect = n_block & 0xff;
1276
1277 tf->lbah = (block >> 16) & 0xff;
1278 tf->lbam = (block >> 8) & 0xff;
1279 tf->lbal = block & 0xff;
1280
1281 tf->device |= ATA_LBA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 } else {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001283 /* CHS */
1284 u32 sect, head, cyl, track;
1285
Albert Leec6a33e22005-10-12 15:12:26 +08001286 if (!lba_28_ok(block, n_block))
1287 goto out_of_range;
Albert Lee07506692005-10-12 15:04:18 +08001288
Albert Lee8bf62ece2005-05-12 15:29:42 -04001289 /* Convert LBA to CHS */
1290 track = (u32)block / dev->sectors;
1291 cyl = track / dev->heads;
1292 head = track % dev->heads;
1293 sect = (u32)block % dev->sectors + 1;
1294
Albert Leec187c4b2005-10-04 08:46:51 -04001295 DPRINTK("block %u track %u cyl %u head %u sect %u\n",
1296 (u32)block, track, cyl, head, sect);
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001297
1298 /* Check whether the converted CHS can fit.
1299 Cylinder: 0-65535
Albert Lee8bf62ece2005-05-12 15:29:42 -04001300 Head: 0-15
1301 Sector: 1-255*/
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001302 if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect))
Douglas Gilbertae006512005-10-09 09:09:35 -04001303 goto out_of_range;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001304
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 tf->command = ATA_CMD_VERIFY;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001306 tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */
1307 tf->lbal = sect;
1308 tf->lbam = cyl;
1309 tf->lbah = cyl >> 8;
1310 tf->device |= head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001311 }
1312
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001314
1315invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001316 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001317 /* "Invalid field in cbd" */
1318 return 1;
1319
1320out_of_range:
Tejun Heo542b1442006-12-17 10:45:08 +09001321 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001322 /* "Logical Block Address out of range" */
1323 return 1;
1324
1325nothing_to_do:
Tejun Heo542b1442006-12-17 10:45:08 +09001326 scmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001327 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328}
1329
1330/**
1331 * ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
1332 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 *
1334 * Converts any of six SCSI read/write commands into the
1335 * ATA counterpart, including starting sector (LBA),
1336 * sector count, and taking into account the device's LBA48
1337 * support.
1338 *
1339 * Commands %READ_6, %READ_10, %READ_16, %WRITE_6, %WRITE_10, and
1340 * %WRITE_16 are currently supported.
1341 *
1342 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001343 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001344 *
1345 * RETURNS:
1346 * Zero on success, non-zero on error.
1347 */
Tejun Heoad706992006-12-17 10:45:57 +09001348static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349{
Tejun Heo542b1442006-12-17 10:45:08 +09001350 struct scsi_cmnd *scmd = qc->scsicmd;
Tejun Heoad706992006-12-17 10:45:57 +09001351 const u8 *cdb = scmd->cmnd;
Tejun Heobd056d72006-11-14 22:47:10 +09001352 unsigned int tf_flags = 0;
Albert Lee3aef5232005-10-04 08:47:43 -04001353 u64 block;
1354 u32 n_block;
Tejun Heobd056d72006-11-14 22:47:10 +09001355 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356
Tejun Heo542b1442006-12-17 10:45:08 +09001357 if (cdb[0] == WRITE_10 || cdb[0] == WRITE_6 || cdb[0] == WRITE_16)
Tejun Heobd056d72006-11-14 22:47:10 +09001358 tf_flags |= ATA_TFLAG_WRITE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
Tejun Heo9a3dccc2006-01-06 09:56:18 +01001360 /* Calculate the SCSI LBA, transfer length and FUA. */
Tejun Heo542b1442006-12-17 10:45:08 +09001361 switch (cdb[0]) {
Albert Lee3aef5232005-10-04 08:47:43 -04001362 case READ_10:
1363 case WRITE_10:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001364 if (unlikely(scmd->cmd_len < 10))
1365 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001366 scsi_10_lba_len(cdb, &block, &n_block);
1367 if (unlikely(cdb[1] & (1 << 3)))
Tejun Heobd056d72006-11-14 22:47:10 +09001368 tf_flags |= ATA_TFLAG_FUA;
Albert Lee3aef5232005-10-04 08:47:43 -04001369 break;
1370 case READ_6:
1371 case WRITE_6:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001372 if (unlikely(scmd->cmd_len < 6))
1373 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001374 scsi_6_lba_len(cdb, &block, &n_block);
Albert Leec187c4b2005-10-04 08:46:51 -04001375
1376 /* for 6-byte r/w commands, transfer length 0
1377 * means 256 blocks of data, not 0 block.
1378 */
Jeff Garzik76b2bf92005-08-29 19:24:43 -04001379 if (!n_block)
1380 n_block = 256;
Albert Lee3aef5232005-10-04 08:47:43 -04001381 break;
1382 case READ_16:
1383 case WRITE_16:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001384 if (unlikely(scmd->cmd_len < 16))
1385 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001386 scsi_16_lba_len(cdb, &block, &n_block);
1387 if (unlikely(cdb[1] & (1 << 3)))
Tejun Heobd056d72006-11-14 22:47:10 +09001388 tf_flags |= ATA_TFLAG_FUA;
Albert Lee3aef5232005-10-04 08:47:43 -04001389 break;
1390 default:
Albert Lee8bf62ece2005-05-12 15:29:42 -04001391 DPRINTK("no-byte command\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04001392 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001393 }
1394
Albert Lee8bf62ece2005-05-12 15:29:42 -04001395 /* Check and compose ATA command */
1396 if (!n_block)
Albert Leec187c4b2005-10-04 08:46:51 -04001397 /* For 10-byte and 16-byte SCSI R/W commands, transfer
1398 * length 0 means transfer 0 block of data.
1399 * However, for ATA R/W commands, sector count 0 means
1400 * 256 or 65536 sectors, not 0 sectors as in SCSI.
Alan Coxf51750d2005-11-07 17:06:33 +00001401 *
1402 * WARNING: one or two older ATA drives treat 0 as 0...
Albert Leec187c4b2005-10-04 08:46:51 -04001403 */
Douglas Gilbertae006512005-10-09 09:09:35 -04001404 goto nothing_to_do;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001405
Tejun Heobd056d72006-11-14 22:47:10 +09001406 qc->flags |= ATA_QCFLAG_IO;
Tejun Heo726f0782007-01-03 17:30:39 +09001407 qc->nbytes = n_block * ATA_SECT_SIZE;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001408
Tejun Heobd056d72006-11-14 22:47:10 +09001409 rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
1410 qc->tag);
1411 if (likely(rc == 0))
1412 return 0;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001413
Tejun Heobd056d72006-11-14 22:47:10 +09001414 if (rc == -ERANGE)
1415 goto out_of_range;
1416 /* treat all other errors as -EINVAL, fall through */
Douglas Gilbertae006512005-10-09 09:09:35 -04001417invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001418 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001419 /* "Invalid field in cbd" */
1420 return 1;
1421
1422out_of_range:
Tejun Heo542b1442006-12-17 10:45:08 +09001423 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001424 /* "Logical Block Address out of range" */
1425 return 1;
1426
1427nothing_to_do:
Tejun Heo542b1442006-12-17 10:45:08 +09001428 scmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001429 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430}
1431
Tejun Heo77853bf2006-01-23 13:09:36 +09001432static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433{
Tejun Heoc31f5712006-11-22 12:39:43 +09001434 struct ata_port *ap = qc->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzika7dac442005-10-30 04:44:42 -05001436 u8 *cdb = cmd->cmnd;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001437 int need_sense = (qc->err_mask != 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438
Jeff Garzikb0955182005-05-12 15:45:22 -04001439 /* For ATA pass thru (SAT) commands, generate a sense block if
1440 * user mandated it or if there's an error. Note that if we
1441 * generate because the user forced us to, a check condition
1442 * is generated and the ATA register values are returned
1443 * whether the command completed successfully or not. If there
1444 * was no error, SK, ASC and ASCQ will all be zero.
1445 */
Jeff Garzika7dac442005-10-30 04:44:42 -05001446 if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001447 ((cdb[2] & 0x20) || need_sense)) {
Tejun Heo750426a2006-11-14 22:37:35 +09001448 ata_gen_passthru_sense(qc);
Jeff Garzikb0955182005-05-12 15:45:22 -04001449 } else {
1450 if (!need_sense) {
1451 cmd->result = SAM_STAT_GOOD;
1452 } else {
1453 /* TODO: decide which descriptor format to use
1454 * for 48b LBA devices and call that here
1455 * instead of the fixed desc, which is only
1456 * good for smaller LBA (and maybe CHS?)
1457 * devices.
1458 */
Tejun Heo750426a2006-11-14 22:37:35 +09001459 ata_gen_ata_sense(qc);
Jeff Garzikb0955182005-05-12 15:45:22 -04001460 }
1461 }
1462
Tejun Heod9aca222007-05-17 16:43:26 +02001463 /* XXX: track spindown state for spindown skipping and warning */
Tejun Heo13b8d092007-05-15 12:29:22 +02001464 if (unlikely(qc->tf.command == ATA_CMD_STANDBY ||
1465 qc->tf.command == ATA_CMD_STANDBYNOW1))
1466 qc->dev->flags |= ATA_DFLAG_SPUNDOWN;
1467 else if (likely(system_state != SYSTEM_HALT &&
1468 system_state != SYSTEM_POWER_OFF))
1469 qc->dev->flags &= ~ATA_DFLAG_SPUNDOWN;
1470
Tejun Heoc31f5712006-11-22 12:39:43 +09001471 if (need_sense && !ap->ops->error_handler)
Tejun Heo44877b42007-02-21 01:06:51 +09001472 ata_dump_status(ap->print_id, &qc->result_tf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473
1474 qc->scsidone(cmd);
1475
Tejun Heo77853bf2006-01-23 13:09:36 +09001476 ata_qc_free(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477}
1478
1479/**
1480 * ata_scsi_translate - Translate then issue SCSI command to ATA device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 * @dev: ATA device to which the command is addressed
1482 * @cmd: SCSI command to execute
1483 * @done: SCSI command completion function
1484 * @xlat_func: Actor which translates @cmd to an ATA taskfile
1485 *
1486 * Our ->queuecommand() function has decided that the SCSI
1487 * command issued can be directly translated into an ATA
1488 * command, rather than handled internally.
1489 *
1490 * This function sets up an ata_queued_cmd structure for the
1491 * SCSI command, and sends that ata_queued_cmd to the hardware.
1492 *
Douglas Gilbertae006512005-10-09 09:09:35 -04001493 * The xlat_func argument (actor) returns 0 if ready to execute
1494 * ATA command, else 1 to finish translation. If 1 is returned
1495 * then cmd->result (and possibly cmd->sense_buffer) are assumed
1496 * to be set reflecting an error condition or clean (early)
1497 * termination.
1498 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001500 * spin_lock_irqsave(host lock)
Tejun Heo2115ea92006-05-15 21:03:39 +09001501 *
1502 * RETURNS:
1503 * 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command
1504 * needs to be deferred.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001505 */
Tejun Heo2115ea92006-05-15 21:03:39 +09001506static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
1507 void (*done)(struct scsi_cmnd *),
1508 ata_xlat_func_t xlat_func)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509{
Tejun Heo31cc23b2007-09-23 13:14:12 +09001510 struct ata_port *ap = dev->link->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 struct ata_queued_cmd *qc;
Tejun Heo31cc23b2007-09-23 13:14:12 +09001512 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513
1514 VPRINTK("ENTER\n");
1515
Tejun Heo3373efd2006-05-15 20:57:53 +09001516 qc = ata_scsi_qc_new(dev, cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 if (!qc)
Douglas Gilbertae006512005-10-09 09:09:35 -04001518 goto err_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519
1520 /* data is present; dma-map it */
be7db052005-04-17 15:26:13 -05001521 if (cmd->sc_data_direction == DMA_FROM_DEVICE ||
1522 cmd->sc_data_direction == DMA_TO_DEVICE) {
Boaz Harrosh71201652007-09-18 17:48:50 +02001523 if (unlikely(scsi_bufflen(cmd) < 1)) {
Tejun Heof15a1da2006-05-15 20:57:56 +09001524 ata_dev_printk(dev, KERN_WARNING,
1525 "WARNING: zero len r/w req\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04001526 goto err_did;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 }
1528
Boaz Harrosh71201652007-09-18 17:48:50 +02001529 ata_sg_init(qc, scsi_sglist(cmd), scsi_sg_count(cmd));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530
1531 qc->dma_dir = cmd->sc_data_direction;
1532 }
1533
1534 qc->complete_fn = ata_scsi_qc_complete;
1535
Tejun Heoad706992006-12-17 10:45:57 +09001536 if (xlat_func(qc))
Douglas Gilbertae006512005-10-09 09:09:35 -04001537 goto early_finish;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538
Tejun Heo31cc23b2007-09-23 13:14:12 +09001539 if (ap->ops->qc_defer) {
1540 if ((rc = ap->ops->qc_defer(qc)))
1541 goto defer;
1542 }
1543
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544 /* select device, send command to hardware */
Tejun Heo8e0e6942006-03-31 20:41:11 +09001545 ata_qc_issue(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546
1547 VPRINTK("EXIT\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001548 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549
Douglas Gilbertae006512005-10-09 09:09:35 -04001550early_finish:
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001551 ata_qc_free(qc);
Tejun Heoda071b42007-05-14 17:26:18 +02001552 qc->scsidone(cmd);
Douglas Gilbertae006512005-10-09 09:09:35 -04001553 DPRINTK("EXIT - early finish (good or error)\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001554 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001555
1556err_did:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557 ata_qc_free(qc);
Douglas Gilbertae006512005-10-09 09:09:35 -04001558 cmd->result = (DID_ERROR << 16);
Tejun Heoda071b42007-05-14 17:26:18 +02001559 qc->scsidone(cmd);
Darrick J. Wong253b92e2006-11-14 09:55:41 -05001560err_mem:
Douglas Gilbertae006512005-10-09 09:09:35 -04001561 DPRINTK("EXIT - internal\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001562 return 0;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001563
1564defer:
Tejun Heo31cc23b2007-09-23 13:14:12 +09001565 ata_qc_free(qc);
Tejun Heo3dc1d882006-05-15 21:03:45 +09001566 DPRINTK("EXIT - defer\n");
Tejun Heo31cc23b2007-09-23 13:14:12 +09001567 if (rc == ATA_DEFER_LINK)
1568 return SCSI_MLQUEUE_DEVICE_BUSY;
1569 else
1570 return SCSI_MLQUEUE_HOST_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571}
1572
1573/**
1574 * ata_scsi_rbuf_get - Map response buffer.
1575 * @cmd: SCSI command containing buffer to be mapped.
1576 * @buf_out: Pointer to mapped area.
1577 *
1578 * Maps buffer contained within SCSI command @cmd.
1579 *
1580 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001581 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 *
1583 * RETURNS:
1584 * Length of response buffer.
1585 */
1586
1587static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
1588{
1589 u8 *buf;
1590 unsigned int buflen;
1591
Boaz Harrosh71201652007-09-18 17:48:50 +02001592 struct scatterlist *sg = scsi_sglist(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001594 if (sg) {
Jens Axboe45711f12007-10-22 21:19:53 +02001595 buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596 buflen = sg->length;
1597 } else {
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001598 buf = NULL;
1599 buflen = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 }
1601
1602 *buf_out = buf;
1603 return buflen;
1604}
1605
1606/**
1607 * ata_scsi_rbuf_put - Unmap response buffer.
1608 * @cmd: SCSI command containing buffer to be unmapped.
1609 * @buf: buffer to unmap
1610 *
1611 * Unmaps response buffer contained within @cmd.
1612 *
1613 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001614 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001615 */
1616
1617static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
1618{
Boaz Harrosh71201652007-09-18 17:48:50 +02001619 struct scatterlist *sg = scsi_sglist(cmd);
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001620 if (sg)
Jeff Garzikda02d2a2006-12-11 11:05:53 -05001621 kunmap_atomic(buf - sg->offset, KM_IRQ0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622}
1623
1624/**
1625 * ata_scsi_rbuf_fill - wrapper for SCSI command simulators
1626 * @args: device IDENTIFY data / SCSI command of interest.
1627 * @actor: Callback hook for desired SCSI command simulator
1628 *
1629 * Takes care of the hard work of simulating a SCSI command...
1630 * Mapping the response buffer, calling the command's handler,
1631 * and handling the handler's return value. This return value
1632 * indicates whether the handler wishes the SCSI command to be
Douglas Gilbertae006512005-10-09 09:09:35 -04001633 * completed successfully (0), or not (in which case cmd->result
1634 * and sense buffer are assumed to be set).
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635 *
1636 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001637 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638 */
1639
1640void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001641 unsigned int (*actor) (struct ata_scsi_args *args,
1642 u8 *rbuf, unsigned int buflen))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001643{
1644 u8 *rbuf;
1645 unsigned int buflen, rc;
1646 struct scsi_cmnd *cmd = args->cmd;
1647
1648 buflen = ata_scsi_rbuf_get(cmd, &rbuf);
1649 memset(rbuf, 0, buflen);
1650 rc = actor(args, rbuf, buflen);
1651 ata_scsi_rbuf_put(cmd, rbuf);
1652
Douglas Gilbertae006512005-10-09 09:09:35 -04001653 if (rc == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654 cmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001655 args->done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001656}
1657
1658/**
Tejun Heo6a362612006-11-20 11:15:47 +09001659 * ATA_SCSI_RBUF_SET - helper to set values in SCSI response buffer
1660 * @idx: byte index into SCSI response buffer
1661 * @val: value to set
1662 *
1663 * To be used by SCSI command simulator functions. This macros
1664 * expects two local variables, u8 *rbuf and unsigned int buflen,
1665 * are in scope.
1666 *
1667 * LOCKING:
1668 * None.
1669 */
1670#define ATA_SCSI_RBUF_SET(idx, val) do { \
1671 if ((idx) < buflen) rbuf[(idx)] = (u8)(val); \
1672 } while (0)
1673
1674/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001675 * ata_scsiop_inq_std - Simulate INQUIRY command
1676 * @args: device IDENTIFY data / SCSI command of interest.
1677 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1678 * @buflen: Response buffer length.
1679 *
1680 * Returns standard device identification data associated
Jeff Garzikb142eb62006-03-21 20:37:47 -05001681 * with non-VPD INQUIRY command output.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682 *
1683 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001684 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685 */
1686
1687unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
1688 unsigned int buflen)
1689{
1690 u8 hdr[] = {
1691 TYPE_DISK,
1692 0,
1693 0x5, /* claim SPC-3 version compatibility */
1694 2,
1695 95 - 4
1696 };
1697
1698 /* set scsi removeable (RMB) bit per ata bit */
1699 if (ata_id_removeable(args->id))
1700 hdr[1] |= (1 << 7);
1701
1702 VPRINTK("ENTER\n");
1703
1704 memcpy(rbuf, hdr, sizeof(hdr));
1705
1706 if (buflen > 35) {
1707 memcpy(&rbuf[8], "ATA ", 8);
Tejun Heoa0cf7332007-01-02 20:18:49 +09001708 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
1709 ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001710 if (rbuf[32] == 0 || rbuf[32] == ' ')
1711 memcpy(&rbuf[32], "n/a ", 4);
1712 }
1713
1714 if (buflen > 63) {
1715 const u8 versions[] = {
1716 0x60, /* SAM-3 (no version claimed) */
1717
1718 0x03,
1719 0x20, /* SBC-2 (no version claimed) */
1720
1721 0x02,
1722 0x60 /* SPC-3 (no version claimed) */
1723 };
1724
1725 memcpy(rbuf + 59, versions, sizeof(versions));
1726 }
1727
1728 return 0;
1729}
1730
1731/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001732 * ata_scsiop_inq_00 - Simulate INQUIRY VPD page 0, list of pages
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733 * @args: device IDENTIFY data / SCSI command of interest.
1734 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1735 * @buflen: Response buffer length.
1736 *
Jeff Garzikb142eb62006-03-21 20:37:47 -05001737 * Returns list of inquiry VPD pages available.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738 *
1739 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001740 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741 */
1742
1743unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf,
1744 unsigned int buflen)
1745{
1746 const u8 pages[] = {
1747 0x00, /* page 0x00, this page */
1748 0x80, /* page 0x80, unit serial no page */
1749 0x83 /* page 0x83, device ident page */
1750 };
Jeff Garzikb142eb62006-03-21 20:37:47 -05001751 rbuf[3] = sizeof(pages); /* number of supported VPD pages */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752
1753 if (buflen > 6)
1754 memcpy(rbuf + 4, pages, sizeof(pages));
1755
1756 return 0;
1757}
1758
1759/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001760 * ata_scsiop_inq_80 - Simulate INQUIRY VPD page 80, device serial number
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 * @args: device IDENTIFY data / SCSI command of interest.
1762 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1763 * @buflen: Response buffer length.
1764 *
1765 * Returns ATA device serial number.
1766 *
1767 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001768 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 */
1770
1771unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
1772 unsigned int buflen)
1773{
1774 const u8 hdr[] = {
1775 0,
1776 0x80, /* this page code */
1777 0,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001778 ATA_ID_SERNO_LEN, /* page len */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 };
1780 memcpy(rbuf, hdr, sizeof(hdr));
1781
Tejun Heoa0cf7332007-01-02 20:18:49 +09001782 if (buflen > (ATA_ID_SERNO_LEN + 4 - 1))
Tejun Heo6a62a042006-02-13 10:02:46 +09001783 ata_id_string(args->id, (unsigned char *) &rbuf[4],
Tejun Heoa0cf7332007-01-02 20:18:49 +09001784 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785
1786 return 0;
1787}
1788
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001790 * ata_scsiop_inq_83 - Simulate INQUIRY VPD page 83, device identity
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 * @args: device IDENTIFY data / SCSI command of interest.
1792 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1793 * @buflen: Response buffer length.
1794 *
Jeff Garzikb142eb62006-03-21 20:37:47 -05001795 * Yields two logical unit device identification designators:
1796 * - vendor specific ASCII containing the ATA serial number
1797 * - SAT defined "t10 vendor id based" containing ASCII vendor
1798 * name ("ATA "), model and serial numbers.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 *
1800 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001801 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802 */
1803
1804unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
1805 unsigned int buflen)
1806{
Jeff Garzikb142eb62006-03-21 20:37:47 -05001807 int num;
1808 const int sat_model_serial_desc_len = 68;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001809
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 rbuf[1] = 0x83; /* this page code */
Jeff Garzikb142eb62006-03-21 20:37:47 -05001811 num = 4;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812
Tejun Heoa0cf7332007-01-02 20:18:49 +09001813 if (buflen > (ATA_ID_SERNO_LEN + num + 3)) {
Jeff Garzikb142eb62006-03-21 20:37:47 -05001814 /* piv=0, assoc=lu, code_set=ACSII, designator=vendor */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001815 rbuf[num + 0] = 2;
Tejun Heoa0cf7332007-01-02 20:18:49 +09001816 rbuf[num + 3] = ATA_ID_SERNO_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001817 num += 4;
1818 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001819 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1820 num += ATA_ID_SERNO_LEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821 }
Jeff Garzikb142eb62006-03-21 20:37:47 -05001822 if (buflen > (sat_model_serial_desc_len + num + 3)) {
1823 /* SAT defined lu model and serial numbers descriptor */
1824 /* piv=0, assoc=lu, code_set=ACSII, designator=t10 vendor id */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001825 rbuf[num + 0] = 2;
1826 rbuf[num + 1] = 1;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001827 rbuf[num + 3] = sat_model_serial_desc_len;
1828 num += 4;
1829 memcpy(rbuf + num, "ATA ", 8);
1830 num += 8;
1831 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001832 ATA_ID_PROD, ATA_ID_PROD_LEN);
1833 num += ATA_ID_PROD_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001834 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001835 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1836 num += ATA_ID_SERNO_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001837 }
1838 rbuf[3] = num - 4; /* page len (assume less than 256 bytes) */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001839 return 0;
1840}
1841
1842/**
Jeff Garzikad355b42007-09-21 20:38:03 -04001843 * ata_scsiop_inq_89 - Simulate INQUIRY VPD page 89, ATA info
1844 * @args: device IDENTIFY data / SCSI command of interest.
1845 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1846 * @buflen: Response buffer length.
1847 *
1848 * Yields SAT-specified ATA VPD page.
1849 *
1850 * LOCKING:
1851 * spin_lock_irqsave(host lock)
1852 */
1853
1854unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf,
1855 unsigned int buflen)
1856{
1857 u8 pbuf[60];
1858 struct ata_taskfile tf;
1859 unsigned int i;
1860
1861 if (!buflen)
1862 return 0;
1863
1864 memset(&pbuf, 0, sizeof(pbuf));
1865 memset(&tf, 0, sizeof(tf));
1866
1867 pbuf[1] = 0x89; /* our page code */
1868 pbuf[2] = (0x238 >> 8); /* page size fixed at 238h */
1869 pbuf[3] = (0x238 & 0xff);
1870
Jeff Garzikc78968b2007-09-21 21:03:28 -04001871 memcpy(&pbuf[8], "linux ", 8);
1872 memcpy(&pbuf[16], "libata ", 16);
1873 memcpy(&pbuf[32], DRV_VERSION, 4);
Jeff Garzikad355b42007-09-21 20:38:03 -04001874 ata_id_string(args->id, &pbuf[32], ATA_ID_FW_REV, 4);
1875
1876 /* we don't store the ATA device signature, so we fake it */
1877
1878 tf.command = ATA_DRDY; /* really, this is Status reg */
1879 tf.lbal = 0x1;
1880 tf.nsect = 0x1;
1881
1882 ata_tf_to_fis(&tf, 0, 1, &pbuf[36]); /* TODO: PMP? */
1883 pbuf[36] = 0x34; /* force D2H Reg FIS (34h) */
1884
1885 pbuf[56] = ATA_CMD_ID_ATA;
1886
1887 i = min(buflen, 60U);
1888 memcpy(rbuf, &pbuf[0], i);
1889 buflen -= i;
1890
1891 if (!buflen)
1892 return 0;
1893
1894 memcpy(&rbuf[60], &args->id[0], min(buflen, 512U));
1895 return 0;
1896}
1897
1898/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04001899 * ata_scsiop_noop - Command handler that simply returns success.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001900 * @args: device IDENTIFY data / SCSI command of interest.
1901 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1902 * @buflen: Response buffer length.
1903 *
1904 * No operation. Simply returns success to caller, to indicate
1905 * that the caller should successfully complete this SCSI command.
1906 *
1907 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001908 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001909 */
1910
1911unsigned int ata_scsiop_noop(struct ata_scsi_args *args, u8 *rbuf,
1912 unsigned int buflen)
1913{
1914 VPRINTK("ENTER\n");
1915 return 0;
1916}
1917
1918/**
1919 * ata_msense_push - Push data onto MODE SENSE data output buffer
1920 * @ptr_io: (input/output) Location to store more output data
1921 * @last: End of output data buffer
1922 * @buf: Pointer to BLOB being added to output buffer
1923 * @buflen: Length of BLOB
1924 *
1925 * Store MODE SENSE data on an output buffer.
1926 *
1927 * LOCKING:
1928 * None.
1929 */
1930
1931static void ata_msense_push(u8 **ptr_io, const u8 *last,
1932 const u8 *buf, unsigned int buflen)
1933{
1934 u8 *ptr = *ptr_io;
1935
1936 if ((ptr + buflen - 1) > last)
1937 return;
1938
1939 memcpy(ptr, buf, buflen);
1940
1941 ptr += buflen;
1942
1943 *ptr_io = ptr;
1944}
1945
1946/**
1947 * ata_msense_caching - Simulate MODE SENSE caching info page
1948 * @id: device IDENTIFY data
1949 * @ptr_io: (input/output) Location to store more output data
1950 * @last: End of output data buffer
1951 *
1952 * Generate a caching info page, which conditionally indicates
1953 * write caching to the SCSI layer, depending on device
1954 * capabilities.
1955 *
1956 * LOCKING:
1957 * None.
1958 */
1959
1960static unsigned int ata_msense_caching(u16 *id, u8 **ptr_io,
1961 const u8 *last)
1962{
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001963 u8 page[CACHE_MPAGE_LEN];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001965 memcpy(page, def_cache_mpage, sizeof(page));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001966 if (ata_id_wcache_enabled(id))
1967 page[2] |= (1 << 2); /* write cache enable */
1968 if (!ata_id_rahead_enabled(id))
1969 page[12] |= (1 << 5); /* disable read ahead */
1970
1971 ata_msense_push(ptr_io, last, page, sizeof(page));
1972 return sizeof(page);
1973}
1974
1975/**
1976 * ata_msense_ctl_mode - Simulate MODE SENSE control mode page
1977 * @dev: Device associated with this MODE SENSE command
1978 * @ptr_io: (input/output) Location to store more output data
1979 * @last: End of output data buffer
1980 *
1981 * Generate a generic MODE SENSE control mode page.
1982 *
1983 * LOCKING:
1984 * None.
1985 */
1986
1987static unsigned int ata_msense_ctl_mode(u8 **ptr_io, const u8 *last)
1988{
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001989 ata_msense_push(ptr_io, last, def_control_mpage,
1990 sizeof(def_control_mpage));
1991 return sizeof(def_control_mpage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992}
1993
1994/**
1995 * ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page
1996 * @dev: Device associated with this MODE SENSE command
1997 * @ptr_io: (input/output) Location to store more output data
1998 * @last: End of output data buffer
1999 *
2000 * Generate a generic MODE SENSE r/w error recovery page.
2001 *
2002 * LOCKING:
2003 * None.
2004 */
2005
2006static unsigned int ata_msense_rw_recovery(u8 **ptr_io, const u8 *last)
2007{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002009 ata_msense_push(ptr_io, last, def_rw_recovery_mpage,
2010 sizeof(def_rw_recovery_mpage));
2011 return sizeof(def_rw_recovery_mpage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002012}
2013
Jens Axboe48bdc8e2006-01-30 16:09:35 +01002014/*
2015 * We can turn this into a real blacklist if it's needed, for now just
2016 * blacklist any Maxtor BANC1G10 revision firmware
2017 */
2018static int ata_dev_supports_fua(u16 *id)
2019{
Tejun Heoa0cf7332007-01-02 20:18:49 +09002020 unsigned char model[ATA_ID_PROD_LEN + 1], fw[ATA_ID_FW_REV_LEN + 1];
Jens Axboe48bdc8e2006-01-30 16:09:35 +01002021
Jeff Garzikc3c013a2006-02-27 22:31:19 -05002022 if (!libata_fua)
2023 return 0;
Jens Axboe48bdc8e2006-01-30 16:09:35 +01002024 if (!ata_id_has_fua(id))
2025 return 0;
2026
Tejun Heoa0cf7332007-01-02 20:18:49 +09002027 ata_id_c_string(id, model, ATA_ID_PROD, sizeof(model));
2028 ata_id_c_string(id, fw, ATA_ID_FW_REV, sizeof(fw));
Jens Axboe48bdc8e2006-01-30 16:09:35 +01002029
Tejun Heo2e026712006-02-12 22:47:04 +09002030 if (strcmp(model, "Maxtor"))
Jens Axboe48bdc8e2006-01-30 16:09:35 +01002031 return 1;
Tejun Heo2e026712006-02-12 22:47:04 +09002032 if (strcmp(fw, "BANC1G10"))
Jens Axboe48bdc8e2006-01-30 16:09:35 +01002033 return 1;
2034
2035 return 0; /* blacklisted */
2036}
2037
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038/**
2039 * ata_scsiop_mode_sense - Simulate MODE SENSE 6, 10 commands
2040 * @args: device IDENTIFY data / SCSI command of interest.
2041 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2042 * @buflen: Response buffer length.
2043 *
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002044 * Simulate MODE SENSE commands. Assume this is invoked for direct
2045 * access devices (e.g. disks) only. There should be no block
2046 * descriptor for other device types.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002047 *
2048 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002049 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002050 */
2051
2052unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf,
2053 unsigned int buflen)
2054{
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002055 struct ata_device *dev = args->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056 u8 *scsicmd = args->cmd->cmnd, *p, *last;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002057 const u8 sat_blk_desc[] = {
2058 0, 0, 0, 0, /* number of blocks: sat unspecified */
2059 0,
2060 0, 0x2, 0x0 /* block length: 512 bytes */
2061 };
2062 u8 pg, spg;
2063 unsigned int ebd, page_control, six_byte, output_len, alloc_len, minlen;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002064 u8 dpofua;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065
2066 VPRINTK("ENTER\n");
2067
2068 six_byte = (scsicmd[0] == MODE_SENSE);
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002069 ebd = !(scsicmd[1] & 0x8); /* dbd bit inverted == edb */
2070 /*
2071 * LLBA bit in msense(10) ignored (compliant)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072 */
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002073
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074 page_control = scsicmd[2] >> 6;
Douglas Gilbertae006512005-10-09 09:09:35 -04002075 switch (page_control) {
2076 case 0: /* current */
2077 break; /* supported */
2078 case 3: /* saved */
2079 goto saving_not_supp;
2080 case 1: /* changeable */
2081 case 2: /* defaults */
2082 default:
2083 goto invalid_fld;
2084 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002086 if (six_byte) {
2087 output_len = 4 + (ebd ? 8 : 0);
2088 alloc_len = scsicmd[4];
2089 } else {
2090 output_len = 8 + (ebd ? 8 : 0);
2091 alloc_len = (scsicmd[7] << 8) + scsicmd[8];
2092 }
2093 minlen = (alloc_len < buflen) ? alloc_len : buflen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094
2095 p = rbuf + output_len;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002096 last = rbuf + minlen - 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002098 pg = scsicmd[2] & 0x3f;
2099 spg = scsicmd[3];
2100 /*
2101 * No mode subpages supported (yet) but asking for _all_
2102 * subpages may be valid
2103 */
2104 if (spg && (spg != ALL_SUB_MPAGES))
2105 goto invalid_fld;
2106
2107 switch(pg) {
2108 case RW_RECOVERY_MPAGE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 output_len += ata_msense_rw_recovery(&p, last);
2110 break;
2111
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002112 case CACHE_MPAGE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113 output_len += ata_msense_caching(args->id, &p, last);
2114 break;
2115
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002116 case CONTROL_MPAGE: {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 output_len += ata_msense_ctl_mode(&p, last);
2118 break;
2119 }
2120
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002121 case ALL_MPAGES:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122 output_len += ata_msense_rw_recovery(&p, last);
2123 output_len += ata_msense_caching(args->id, &p, last);
2124 output_len += ata_msense_ctl_mode(&p, last);
2125 break;
2126
2127 default: /* invalid page code */
Douglas Gilbertae006512005-10-09 09:09:35 -04002128 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129 }
2130
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002131 if (minlen < 1)
2132 return 0;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002133
2134 dpofua = 0;
Alan Coxf79d4092006-05-22 16:55:11 +01002135 if (ata_dev_supports_fua(args->id) && (dev->flags & ATA_DFLAG_LBA48) &&
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002136 (!(dev->flags & ATA_DFLAG_PIO) || dev->multi_count))
2137 dpofua = 1 << 4;
2138
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139 if (six_byte) {
2140 output_len--;
2141 rbuf[0] = output_len;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002142 if (minlen > 2)
2143 rbuf[2] |= dpofua;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002144 if (ebd) {
2145 if (minlen > 3)
2146 rbuf[3] = sizeof(sat_blk_desc);
2147 if (minlen > 11)
2148 memcpy(rbuf + 4, sat_blk_desc,
2149 sizeof(sat_blk_desc));
2150 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 } else {
2152 output_len -= 2;
2153 rbuf[0] = output_len >> 8;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002154 if (minlen > 1)
2155 rbuf[1] = output_len;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002156 if (minlen > 3)
2157 rbuf[3] |= dpofua;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002158 if (ebd) {
2159 if (minlen > 7)
2160 rbuf[7] = sizeof(sat_blk_desc);
2161 if (minlen > 15)
2162 memcpy(rbuf + 8, sat_blk_desc,
2163 sizeof(sat_blk_desc));
2164 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002165 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04002167
2168invalid_fld:
2169 ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x24, 0x0);
2170 /* "Invalid field in cbd" */
2171 return 1;
2172
2173saving_not_supp:
2174 ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x39, 0x0);
2175 /* "Saving parameters not supported" */
2176 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177}
2178
2179/**
2180 * ata_scsiop_read_cap - Simulate READ CAPACITY[ 16] commands
2181 * @args: device IDENTIFY data / SCSI command of interest.
2182 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2183 * @buflen: Response buffer length.
2184 *
2185 * Simulate READ CAPACITY commands.
2186 *
2187 * LOCKING:
Tejun Heo6a362612006-11-20 11:15:47 +09002188 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002191 unsigned int buflen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192{
Tejun Heo6a362612006-11-20 11:15:47 +09002193 u64 last_lba = args->dev->n_sectors - 1; /* LBA of the last block */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002194
2195 VPRINTK("ENTER\n");
2196
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197 if (args->cmd->cmnd[0] == READ_CAPACITY) {
Tejun Heo6a362612006-11-20 11:15:47 +09002198 if (last_lba >= 0xffffffffULL)
2199 last_lba = 0xffffffff;
Philip Pokorny0c144d02005-05-28 01:24:47 -07002200
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 /* sector count, 32-bit */
Tejun Heo6a362612006-11-20 11:15:47 +09002202 ATA_SCSI_RBUF_SET(0, last_lba >> (8 * 3));
2203 ATA_SCSI_RBUF_SET(1, last_lba >> (8 * 2));
2204 ATA_SCSI_RBUF_SET(2, last_lba >> (8 * 1));
2205 ATA_SCSI_RBUF_SET(3, last_lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206
2207 /* sector size */
Tejun Heo6a362612006-11-20 11:15:47 +09002208 ATA_SCSI_RBUF_SET(6, ATA_SECT_SIZE >> 8);
2209 ATA_SCSI_RBUF_SET(7, ATA_SECT_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210 } else {
2211 /* sector count, 64-bit */
Tejun Heo6a362612006-11-20 11:15:47 +09002212 ATA_SCSI_RBUF_SET(0, last_lba >> (8 * 7));
2213 ATA_SCSI_RBUF_SET(1, last_lba >> (8 * 6));
2214 ATA_SCSI_RBUF_SET(2, last_lba >> (8 * 5));
2215 ATA_SCSI_RBUF_SET(3, last_lba >> (8 * 4));
2216 ATA_SCSI_RBUF_SET(4, last_lba >> (8 * 3));
2217 ATA_SCSI_RBUF_SET(5, last_lba >> (8 * 2));
2218 ATA_SCSI_RBUF_SET(6, last_lba >> (8 * 1));
2219 ATA_SCSI_RBUF_SET(7, last_lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220
2221 /* sector size */
Tejun Heo6a362612006-11-20 11:15:47 +09002222 ATA_SCSI_RBUF_SET(10, ATA_SECT_SIZE >> 8);
2223 ATA_SCSI_RBUF_SET(11, ATA_SECT_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224 }
2225
2226 return 0;
2227}
2228
2229/**
2230 * ata_scsiop_report_luns - Simulate REPORT LUNS command
2231 * @args: device IDENTIFY data / SCSI command of interest.
2232 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2233 * @buflen: Response buffer length.
2234 *
2235 * Simulate REPORT LUNS command.
2236 *
2237 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002238 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239 */
2240
2241unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
2242 unsigned int buflen)
2243{
2244 VPRINTK("ENTER\n");
2245 rbuf[3] = 8; /* just one lun, LUN 0, size 8 bytes */
2246
2247 return 0;
2248}
2249
2250/**
Douglas Gilbert845c5832005-10-09 08:55:41 -04002251 * ata_scsi_set_sense - Set SCSI sense data and status
2252 * @cmd: SCSI request to be handled
2253 * @sk: SCSI-defined sense key
2254 * @asc: SCSI-defined additional sense code
2255 * @ascq: SCSI-defined additional sense code qualifier
2256 *
2257 * Helper function that builds a valid fixed format, current
2258 * response code and the given sense key (sk), additional sense
2259 * code (asc) and additional sense code qualifier (ascq) with
2260 * a SCSI command status of %SAM_STAT_CHECK_CONDITION and
2261 * DRIVER_SENSE set in the upper bits of scsi_cmnd::result .
2262 *
2263 * LOCKING:
2264 * Not required
2265 */
2266
2267void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
2268{
2269 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
2270
2271 cmd->sense_buffer[0] = 0x70; /* fixed format, current */
2272 cmd->sense_buffer[2] = sk;
2273 cmd->sense_buffer[7] = 18 - 8; /* additional sense length */
2274 cmd->sense_buffer[12] = asc;
2275 cmd->sense_buffer[13] = ascq;
2276}
2277
2278/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279 * ata_scsi_badcmd - End a SCSI request with an error
2280 * @cmd: SCSI request to be handled
2281 * @done: SCSI command completion function
2282 * @asc: SCSI-defined additional sense code
2283 * @ascq: SCSI-defined additional sense code qualifier
2284 *
2285 * Helper function that completes a SCSI command with
2286 * %SAM_STAT_CHECK_CONDITION, with a sense key %ILLEGAL_REQUEST
2287 * and the specified additional sense codes.
2288 *
2289 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002290 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 */
2292
2293void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq)
2294{
2295 DPRINTK("ENTER\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04002296 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, asc, ascq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002297
2298 done(cmd);
2299}
2300
Tejun Heo77853bf2006-01-23 13:09:36 +09002301static void atapi_sense_complete(struct ata_queued_cmd *qc)
Jeff Garzika939c962005-10-05 17:09:16 -04002302{
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002303 if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0)) {
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002304 /* FIXME: not quite right; we don't want the
2305 * translation of taskfile registers into
2306 * a sense descriptors, since that's only
2307 * correct for ATA, not ATAPI
2308 */
Tejun Heo750426a2006-11-14 22:37:35 +09002309 ata_gen_passthru_sense(qc);
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002310 }
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002311
2312 qc->scsidone(qc->scsicmd);
Tejun Heo77853bf2006-01-23 13:09:36 +09002313 ata_qc_free(qc);
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002314}
2315
2316/* is it pointless to prefer PIO for "safety reasons"? */
2317static inline int ata_pio_use_silly(struct ata_port *ap)
2318{
2319 return (ap->flags & ATA_FLAG_PIO_DMA);
2320}
2321
2322static void atapi_request_sense(struct ata_queued_cmd *qc)
2323{
2324 struct ata_port *ap = qc->ap;
2325 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzika939c962005-10-05 17:09:16 -04002326
2327 DPRINTK("ATAPI request sense\n");
2328
Jeff Garzika939c962005-10-05 17:09:16 -04002329 /* FIXME: is this needed? */
2330 memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
2331
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002332 ap->ops->tf_read(ap, &qc->tf);
2333
2334 /* fill these in, for the case where they are -not- overwritten */
2335 cmd->sense_buffer[0] = 0x70;
2336 cmd->sense_buffer[2] = qc->tf.feature >> 4;
2337
2338 ata_qc_reinit(qc);
2339
Jeff Garzika939c962005-10-05 17:09:16 -04002340 ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer));
2341 qc->dma_dir = DMA_FROM_DEVICE;
2342
Tejun Heo6e7846e2006-02-12 23:32:58 +09002343 memset(&qc->cdb, 0, qc->dev->cdb_len);
Jeff Garzika939c962005-10-05 17:09:16 -04002344 qc->cdb[0] = REQUEST_SENSE;
2345 qc->cdb[4] = SCSI_SENSE_BUFFERSIZE;
2346
2347 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
2348 qc->tf.command = ATA_CMD_PACKET;
2349
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002350 if (ata_pio_use_silly(ap)) {
2351 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
2352 qc->tf.feature |= ATAPI_PKT_DMA;
2353 } else {
2354 qc->tf.protocol = ATA_PROT_ATAPI;
Alan Cox2db78dd2007-10-02 13:53:04 -07002355 qc->tf.lbam = SCSI_SENSE_BUFFERSIZE;
2356 qc->tf.lbah = 0;
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002357 }
Jeff Garzika939c962005-10-05 17:09:16 -04002358 qc->nbytes = SCSI_SENSE_BUFFERSIZE;
2359
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002360 qc->complete_fn = atapi_sense_complete;
Jeff Garzika939c962005-10-05 17:09:16 -04002361
Tejun Heo8e0e6942006-03-31 20:41:11 +09002362 ata_qc_issue(qc);
Jeff Garzika939c962005-10-05 17:09:16 -04002363
2364 DPRINTK("EXIT\n");
2365}
2366
Tejun Heo77853bf2006-01-23 13:09:36 +09002367static void atapi_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368{
2369 struct scsi_cmnd *cmd = qc->scsicmd;
Albert Leea22e2eb2005-12-05 15:38:02 +08002370 unsigned int err_mask = qc->err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371
Jeff Garzika7dac442005-10-30 04:44:42 -05002372 VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
Jeff Garzike12669e2005-10-05 18:39:23 -04002373
Tejun Heo246619d2006-05-15 20:58:16 +09002374 /* handle completion from new EH */
2375 if (unlikely(qc->ap->ops->error_handler &&
2376 (err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) {
2377
2378 if (!(qc->flags & ATA_QCFLAG_SENSE_VALID)) {
2379 /* FIXME: not quite right; we don't want the
2380 * translation of taskfile registers into a
2381 * sense descriptors, since that's only
2382 * correct for ATA, not ATAPI
2383 */
Tejun Heo750426a2006-11-14 22:37:35 +09002384 ata_gen_passthru_sense(qc);
Tejun Heo246619d2006-05-15 20:58:16 +09002385 }
2386
Tejun Heo22aac082006-08-08 14:08:59 +09002387 /* SCSI EH automatically locks door if sdev->locked is
2388 * set. Sometimes door lock request continues to
2389 * fail, for example, when no media is present. This
2390 * creates a loop - SCSI EH issues door lock which
2391 * fails and gets invoked again to acquire sense data
2392 * for the failed command.
2393 *
2394 * If door lock fails, always clear sdev->locked to
2395 * avoid this infinite loop.
2396 */
2397 if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL)
2398 qc->dev->sdev->locked = 0;
2399
Tejun Heo246619d2006-05-15 20:58:16 +09002400 qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
2401 qc->scsidone(cmd);
2402 ata_qc_free(qc);
2403 return;
2404 }
2405
2406 /* successful completion or old EH failure path */
Jeff Garzika7dac442005-10-30 04:44:42 -05002407 if (unlikely(err_mask & AC_ERR_DEV)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002408 cmd->result = SAM_STAT_CHECK_CONDITION;
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002409 atapi_request_sense(qc);
Tejun Heo77853bf2006-01-23 13:09:36 +09002410 return;
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002411 } else if (unlikely(err_mask)) {
Jeff Garzika7dac442005-10-30 04:44:42 -05002412 /* FIXME: not quite right; we don't want the
2413 * translation of taskfile registers into
2414 * a sense descriptors, since that's only
2415 * correct for ATA, not ATAPI
2416 */
Tejun Heo750426a2006-11-14 22:37:35 +09002417 ata_gen_passthru_sense(qc);
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002418 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002419 u8 *scsicmd = cmd->cmnd;
2420
Tony Battersbyfd71da42005-12-21 16:35:44 -05002421 if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422 u8 *buf = NULL;
2423 unsigned int buflen;
2424
2425 buflen = ata_scsi_rbuf_get(cmd, &buf);
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002426
2427 /* ATAPI devices typically report zero for their SCSI version,
2428 * and sometimes deviate from the spec WRT response data
2429 * format. If SCSI version is reported as zero like normal,
2430 * then we make the following fixups: 1) Fake MMC-5 version,
2431 * to indicate to the Linux scsi midlayer this is a modern
2432 * device. 2) Ensure response data format / ATAPI information
2433 * are always correct.
2434 */
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002435 if (buf[2] == 0) {
2436 buf[2] = 0x5;
2437 buf[3] = 0x32;
2438 }
2439
Linus Torvalds1da177e2005-04-16 15:20:36 -07002440 ata_scsi_rbuf_put(cmd, buf);
2441 }
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002442
Linus Torvalds1da177e2005-04-16 15:20:36 -07002443 cmd->result = SAM_STAT_GOOD;
2444 }
2445
2446 qc->scsidone(cmd);
Tejun Heo77853bf2006-01-23 13:09:36 +09002447 ata_qc_free(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002448}
2449/**
2450 * atapi_xlat - Initialize PACKET taskfile
2451 * @qc: command structure to be initialized
Linus Torvalds1da177e2005-04-16 15:20:36 -07002452 *
2453 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002454 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455 *
2456 * RETURNS:
2457 * Zero on success, non-zero on failure.
2458 */
Tejun Heoad706992006-12-17 10:45:57 +09002459static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002460{
Tejun Heo542b1442006-12-17 10:45:08 +09002461 struct scsi_cmnd *scmd = qc->scsicmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002462 struct ata_device *dev = qc->dev;
2463 int using_pio = (dev->flags & ATA_DFLAG_PIO);
Tejun Heo542b1442006-12-17 10:45:08 +09002464 int nodata = (scmd->sc_data_direction == DMA_NONE);
Alan Cox2db78dd2007-10-02 13:53:04 -07002465 unsigned int nbytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002466
Tejun Heo2e5704f2006-12-17 10:46:33 +09002467 memset(qc->cdb, 0, dev->cdb_len);
2468 memcpy(qc->cdb, scmd->cmnd, scmd->cmd_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002469
2470 qc->complete_fn = atapi_qc_complete;
2471
2472 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
Tejun Heo542b1442006-12-17 10:45:08 +09002473 if (scmd->sc_data_direction == DMA_TO_DEVICE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002474 qc->tf.flags |= ATA_TFLAG_WRITE;
2475 DPRINTK("direction: write\n");
2476 }
2477
2478 qc->tf.command = ATA_CMD_PACKET;
Boaz Harrosh71201652007-09-18 17:48:50 +02002479 qc->nbytes = scsi_bufflen(scmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002480
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002481 /* check whether ATAPI DMA is safe */
2482 if (!using_pio && ata_check_atapi_dma(qc))
2483 using_pio = 1;
2484
Alan Cox2db78dd2007-10-02 13:53:04 -07002485 /* Some controller variants snoop this value for Packet transfers
2486 to do state machine and FIFO management. Thus we want to set it
2487 properly, and for DMA where it is effectively meaningless */
2488 nbytes = min(qc->nbytes, (unsigned int)63 * 1024);
2489
2490 qc->tf.lbam = (nbytes & 0xFF);
2491 qc->tf.lbah = (nbytes >> 8);
2492
Linus Torvalds1da177e2005-04-16 15:20:36 -07002493 if (using_pio || nodata) {
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002494 /* no data, or PIO data xfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002495 if (nodata)
2496 qc->tf.protocol = ATA_PROT_ATAPI_NODATA;
2497 else
2498 qc->tf.protocol = ATA_PROT_ATAPI;
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002499 } else {
2500 /* DMA data xfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002501 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
2502 qc->tf.feature |= ATAPI_PKT_DMA;
2503
Tejun Heo542b1442006-12-17 10:45:08 +09002504 if (atapi_dmadir && (scmd->sc_data_direction != DMA_TO_DEVICE))
Albert Lee95de7192006-04-04 10:57:18 +08002505 /* some SATA bridges need us to indicate data xfer direction */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506 qc->tf.feature |= ATAPI_DMADIR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002507 }
2508
Alan Cox2db78dd2007-10-02 13:53:04 -07002509
2510 /* FIXME: We need to translate 0x05 READ_BLOCK_LIMITS to a MODE_SENSE
2511 as ATAPI tape drives don't get this right otherwise */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002512 return 0;
2513}
2514
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002515static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
Tejun Heoab5b3a52006-05-31 18:27:34 +09002516{
Tejun Heo41bda9c2007-08-06 18:36:24 +09002517 if (ap->nr_pmp_links == 0) {
2518 if (likely(devno < ata_link_max_devices(&ap->link)))
2519 return &ap->link.device[devno];
2520 } else {
2521 if (likely(devno < ap->nr_pmp_links))
2522 return &ap->pmp_link[devno].device[0];
2523 }
2524
Tejun Heoab5b3a52006-05-31 18:27:34 +09002525 return NULL;
2526}
2527
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002528static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
2529 const struct scsi_device *scsidev)
Tejun Heoab5b3a52006-05-31 18:27:34 +09002530{
Tejun Heo41bda9c2007-08-06 18:36:24 +09002531 int devno;
Tejun Heoab5b3a52006-05-31 18:27:34 +09002532
Tejun Heo41bda9c2007-08-06 18:36:24 +09002533 /* skip commands not addressed to targets we simulate */
2534 if (ap->nr_pmp_links == 0) {
2535 if (unlikely(scsidev->channel || scsidev->lun))
2536 return NULL;
2537 devno = scsidev->id;
2538 } else {
2539 if (unlikely(scsidev->id || scsidev->lun))
2540 return NULL;
2541 devno = scsidev->channel;
2542 }
2543
2544 return ata_find_dev(ap, devno);
Tejun Heoab5b3a52006-05-31 18:27:34 +09002545}
2546
Linus Torvalds1da177e2005-04-16 15:20:36 -07002547/**
Brian King99ba9e02006-06-12 14:54:17 -05002548 * ata_scsi_dev_enabled - determine if device is enabled
2549 * @dev: ATA device
2550 *
2551 * Determine if commands should be sent to the specified device.
2552 *
2553 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002554 * spin_lock_irqsave(host lock)
Brian King99ba9e02006-06-12 14:54:17 -05002555 *
2556 * RETURNS:
2557 * 0 if commands are not allowed / 1 if commands are allowed
2558 */
2559
2560static int ata_scsi_dev_enabled(struct ata_device *dev)
2561{
2562 if (unlikely(!ata_dev_enabled(dev)))
2563 return 0;
2564
Tejun Heo9af5c9c2007-08-06 18:36:22 +09002565 if (!atapi_enabled || (dev->link->ap->flags & ATA_FLAG_NO_ATAPI)) {
Brian King99ba9e02006-06-12 14:54:17 -05002566 if (unlikely(dev->class == ATA_DEV_ATAPI)) {
2567 ata_dev_printk(dev, KERN_WARNING,
2568 "WARNING: ATAPI is %s, device ignored.\n",
2569 atapi_enabled ? "not supported with this driver" : "disabled");
2570 return 0;
2571 }
2572 }
2573
2574 return 1;
2575}
2576
2577/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002578 * ata_scsi_find_dev - lookup ata_device from scsi_cmnd
2579 * @ap: ATA port to which the device is attached
2580 * @scsidev: SCSI device from which we derive the ATA device
2581 *
2582 * Given various information provided in struct scsi_cmnd,
2583 * map that onto an ATA bus, and using that mapping
2584 * determine which ata_device is associated with the
2585 * SCSI command to be sent.
2586 *
2587 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002588 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002589 *
2590 * RETURNS:
2591 * Associated ATA device, or %NULL if not found.
2592 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002593static struct ata_device *
Jeff Garzik057ace52005-10-22 14:27:05 -04002594ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002595{
Tejun Heoab5b3a52006-05-31 18:27:34 +09002596 struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597
Brian King99ba9e02006-06-12 14:54:17 -05002598 if (unlikely(!dev || !ata_scsi_dev_enabled(dev)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002599 return NULL;
2600
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601 return dev;
2602}
2603
Jeff Garzikb0955182005-05-12 15:45:22 -04002604/*
2605 * ata_scsi_map_proto - Map pass-thru protocol value to taskfile value.
2606 * @byte1: Byte 1 from pass-thru CDB.
2607 *
2608 * RETURNS:
2609 * ATA_PROT_UNKNOWN if mapping failed/unimplemented, protocol otherwise.
2610 */
2611static u8
2612ata_scsi_map_proto(u8 byte1)
2613{
2614 switch((byte1 & 0x1e) >> 1) {
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002615 case 3: /* Non-data */
2616 return ATA_PROT_NODATA;
Jeff Garzikb0955182005-05-12 15:45:22 -04002617
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002618 case 6: /* DMA */
2619 case 10: /* UDMA Data-in */
2620 case 11: /* UDMA Data-Out */
2621 return ATA_PROT_DMA;
Jeff Garzikb0955182005-05-12 15:45:22 -04002622
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002623 case 4: /* PIO Data-in */
2624 case 5: /* PIO Data-out */
2625 return ATA_PROT_PIO;
Jeff Garzikb0955182005-05-12 15:45:22 -04002626
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002627 case 0: /* Hard Reset */
2628 case 1: /* SRST */
2629 case 8: /* Device Diagnostic */
2630 case 9: /* Device Reset */
2631 case 7: /* DMA Queued */
2632 case 12: /* FPDMA */
2633 case 15: /* Return Response Info */
2634 default: /* Reserved */
2635 break;
Jeff Garzikb0955182005-05-12 15:45:22 -04002636 }
2637
2638 return ATA_PROT_UNKNOWN;
2639}
2640
2641/**
2642 * ata_scsi_pass_thru - convert ATA pass-thru CDB to taskfile
2643 * @qc: command structure to be initialized
Jeff Garzikb0955182005-05-12 15:45:22 -04002644 *
2645 * Handles either 12 or 16-byte versions of the CDB.
2646 *
2647 * RETURNS:
2648 * Zero on success, non-zero on failure.
2649 */
Tejun Heoad706992006-12-17 10:45:57 +09002650static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -04002651{
2652 struct ata_taskfile *tf = &(qc->tf);
Tejun Heo542b1442006-12-17 10:45:08 +09002653 struct scsi_cmnd *scmd = qc->scsicmd;
Alan Coxf79d4092006-05-22 16:55:11 +01002654 struct ata_device *dev = qc->dev;
Tejun Heoad706992006-12-17 10:45:57 +09002655 const u8 *cdb = scmd->cmnd;
Jeff Garzikb0955182005-05-12 15:45:22 -04002656
Tejun Heo542b1442006-12-17 10:45:08 +09002657 if ((tf->protocol = ata_scsi_map_proto(cdb[1])) == ATA_PROT_UNKNOWN)
Tejun Heo9a405252005-12-02 11:49:11 +09002658 goto invalid_fld;
Jeff Garzik8190bdb2006-05-24 01:53:39 -04002659
Alan Coxf79d4092006-05-22 16:55:11 +01002660 /* We may not issue DMA commands if no DMA mode is set */
2661 if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
2662 goto invalid_fld;
Jeff Garzikb0955182005-05-12 15:45:22 -04002663
2664 /*
2665 * 12 and 16 byte CDBs use different offsets to
2666 * provide the various register values.
2667 */
Tejun Heo542b1442006-12-17 10:45:08 +09002668 if (cdb[0] == ATA_16) {
Jeff Garzikb0955182005-05-12 15:45:22 -04002669 /*
2670 * 16-byte CDB - may contain extended commands.
2671 *
2672 * If that is the case, copy the upper byte register values.
2673 */
Tejun Heo542b1442006-12-17 10:45:08 +09002674 if (cdb[1] & 0x01) {
2675 tf->hob_feature = cdb[3];
2676 tf->hob_nsect = cdb[5];
2677 tf->hob_lbal = cdb[7];
2678 tf->hob_lbam = cdb[9];
2679 tf->hob_lbah = cdb[11];
Jeff Garzikb0955182005-05-12 15:45:22 -04002680 tf->flags |= ATA_TFLAG_LBA48;
2681 } else
2682 tf->flags &= ~ATA_TFLAG_LBA48;
2683
2684 /*
2685 * Always copy low byte, device and command registers.
2686 */
Tejun Heo542b1442006-12-17 10:45:08 +09002687 tf->feature = cdb[4];
2688 tf->nsect = cdb[6];
2689 tf->lbal = cdb[8];
2690 tf->lbam = cdb[10];
2691 tf->lbah = cdb[12];
2692 tf->device = cdb[13];
2693 tf->command = cdb[14];
Jeff Garzikb0955182005-05-12 15:45:22 -04002694 } else {
2695 /*
2696 * 12-byte CDB - incapable of extended commands.
2697 */
2698 tf->flags &= ~ATA_TFLAG_LBA48;
2699
Tejun Heo542b1442006-12-17 10:45:08 +09002700 tf->feature = cdb[3];
2701 tf->nsect = cdb[4];
2702 tf->lbal = cdb[5];
2703 tf->lbam = cdb[6];
2704 tf->lbah = cdb[7];
2705 tf->device = cdb[8];
2706 tf->command = cdb[9];
Jeff Garzikb0955182005-05-12 15:45:22 -04002707 }
Albert Leefa4453c2007-06-07 15:52:07 +08002708
2709 /* enforce correct master/slave bit */
2710 tf->device = dev->devno ?
2711 tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
Jeff Garzikb0955182005-05-12 15:45:22 -04002712
Albert Lee1dce5892007-06-07 15:49:22 +08002713 /* sanity check for pio multi commands */
2714 if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf))
2715 goto invalid_fld;
2716
2717 if (is_multi_taskfile(tf)) {
2718 unsigned int multi_count = 1 << (cdb[1] >> 5);
2719
2720 /* compare the passed through multi_count
2721 * with the cached multi_count of libata
2722 */
2723 if (multi_count != dev->multi_count)
2724 ata_dev_printk(dev, KERN_WARNING,
2725 "invalid multi_count %u ignored\n",
2726 multi_count);
Alan Coxd26fc952007-07-06 19:13:52 -04002727 }
Albert Lee1dce5892007-06-07 15:49:22 +08002728
Mark Lord5a5dbd12007-03-16 10:22:26 -04002729 /* READ/WRITE LONG use a non-standard sect_size */
2730 qc->sect_size = ATA_SECT_SIZE;
2731 switch (tf->command) {
2732 case ATA_CMD_READ_LONG:
2733 case ATA_CMD_READ_LONG_ONCE:
2734 case ATA_CMD_WRITE_LONG:
2735 case ATA_CMD_WRITE_LONG_ONCE:
2736 if (tf->protocol != ATA_PROT_PIO || tf->nsect != 1)
2737 goto invalid_fld;
Boaz Harrosh71201652007-09-18 17:48:50 +02002738 qc->sect_size = scsi_bufflen(scmd);
Mark Lord5a5dbd12007-03-16 10:22:26 -04002739 }
2740
Jeff Garzikb0955182005-05-12 15:45:22 -04002741 /*
2742 * Filter SET_FEATURES - XFER MODE command -- otherwise,
2743 * SET_FEATURES - XFER MODE must be preceded/succeeded
2744 * by an update to hardware-specific registers for each
2745 * controller (i.e. the reason for ->set_piomode(),
2746 * ->set_dmamode(), and ->post_set_mode() hooks).
2747 */
2748 if ((tf->command == ATA_CMD_SET_FEATURES)
2749 && (tf->feature == SETFEATURES_XFER))
Tejun Heo9a405252005-12-02 11:49:11 +09002750 goto invalid_fld;
Jeff Garzikb0955182005-05-12 15:45:22 -04002751
2752 /*
2753 * Set flags so that all registers will be written,
2754 * and pass on write indication (used for PIO/DMA
2755 * setup.)
2756 */
2757 tf->flags |= (ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE);
2758
Tejun Heo542b1442006-12-17 10:45:08 +09002759 if (scmd->sc_data_direction == DMA_TO_DEVICE)
Jeff Garzikb0955182005-05-12 15:45:22 -04002760 tf->flags |= ATA_TFLAG_WRITE;
2761
2762 /*
2763 * Set transfer length.
2764 *
2765 * TODO: find out if we need to do more here to
2766 * cover scatter/gather case.
2767 */
Boaz Harrosh71201652007-09-18 17:48:50 +02002768 qc->nbytes = scsi_bufflen(scmd);
Jeff Garzikb0955182005-05-12 15:45:22 -04002769
Tejun Heoe61e0672006-05-15 20:57:40 +09002770 /* request result TF */
2771 qc->flags |= ATA_QCFLAG_RESULT_TF;
2772
Jeff Garzikb0955182005-05-12 15:45:22 -04002773 return 0;
Tejun Heo9a405252005-12-02 11:49:11 +09002774
2775 invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09002776 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x00);
Tejun Heo9a405252005-12-02 11:49:11 +09002777 /* "Invalid field in cdb" */
2778 return 1;
Jeff Garzikb0955182005-05-12 15:45:22 -04002779}
2780
Linus Torvalds1da177e2005-04-16 15:20:36 -07002781/**
2782 * ata_get_xlat_func - check if SCSI to ATA translation is possible
2783 * @dev: ATA device
2784 * @cmd: SCSI command opcode to consider
2785 *
2786 * Look up the SCSI command given, and determine whether the
2787 * SCSI command is to be translated or simulated.
2788 *
2789 * RETURNS:
2790 * Pointer to translation function if possible, %NULL if not.
2791 */
2792
2793static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
2794{
2795 switch (cmd) {
2796 case READ_6:
2797 case READ_10:
2798 case READ_16:
2799
2800 case WRITE_6:
2801 case WRITE_10:
2802 case WRITE_16:
2803 return ata_scsi_rw_xlat;
2804
2805 case SYNCHRONIZE_CACHE:
2806 if (ata_try_flush_cache(dev))
2807 return ata_scsi_flush_xlat;
2808 break;
2809
2810 case VERIFY:
2811 case VERIFY_16:
2812 return ata_scsi_verify_xlat;
Jeff Garzikb0955182005-05-12 15:45:22 -04002813
2814 case ATA_12:
2815 case ATA_16:
2816 return ata_scsi_pass_thru;
Jeff Garzikda613962005-08-29 19:01:43 -04002817
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04002818 case START_STOP:
2819 return ata_scsi_start_stop_xlat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820 }
2821
2822 return NULL;
2823}
2824
2825/**
2826 * ata_scsi_dump_cdb - dump SCSI command contents to dmesg
2827 * @ap: ATA port to which the command was being sent
2828 * @cmd: SCSI command to dump
2829 *
2830 * Prints the contents of a SCSI command via printk().
2831 */
2832
2833static inline void ata_scsi_dump_cdb(struct ata_port *ap,
2834 struct scsi_cmnd *cmd)
2835{
2836#ifdef ATA_DEBUG
2837 struct scsi_device *scsidev = cmd->device;
2838 u8 *scsicmd = cmd->cmnd;
2839
2840 DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
Tejun Heo44877b42007-02-21 01:06:51 +09002841 ap->print_id,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002842 scsidev->channel, scsidev->id, scsidev->lun,
2843 scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
2844 scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
2845 scsicmd[8]);
2846#endif
2847}
2848
Tejun Heo542b1442006-12-17 10:45:08 +09002849static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
Tejun Heo2115ea92006-05-15 21:03:39 +09002850 void (*done)(struct scsi_cmnd *),
2851 struct ata_device *dev)
Brian Kingeb3f0f92006-03-23 17:30:02 -06002852{
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002853 u8 scsi_op = scmd->cmnd[0];
2854 ata_xlat_func_t xlat_func;
Tejun Heo2115ea92006-05-15 21:03:39 +09002855 int rc = 0;
2856
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002857 if (dev->class == ATA_DEV_ATA) {
2858 if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len))
2859 goto bad_cdb_len;
2860
2861 xlat_func = ata_get_xlat_func(dev, scsi_op);
2862 } else {
2863 if (unlikely(!scmd->cmd_len))
2864 goto bad_cdb_len;
2865
2866 xlat_func = NULL;
2867 if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
2868 /* relay SCSI command to ATAPI device */
2869 if (unlikely(scmd->cmd_len > dev->cdb_len))
2870 goto bad_cdb_len;
2871
2872 xlat_func = atapi_xlat;
2873 } else {
2874 /* ATA_16 passthru, treat as an ATA command */
2875 if (unlikely(scmd->cmd_len > 16))
2876 goto bad_cdb_len;
2877
2878 xlat_func = ata_get_xlat_func(dev, scsi_op);
2879 }
Tejun Heo2e5704f2006-12-17 10:46:33 +09002880 }
2881
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002882 if (xlat_func)
2883 rc = ata_scsi_translate(dev, scmd, done, xlat_func);
2884 else
2885 ata_scsi_simulate(dev, scmd, done);
Tejun Heo2115ea92006-05-15 21:03:39 +09002886
2887 return rc;
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002888
2889 bad_cdb_len:
2890 DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n",
2891 scmd->cmd_len, scsi_op, dev->cdb_len);
2892 scmd->result = DID_ERROR << 16;
2893 done(scmd);
2894 return 0;
Brian Kingeb3f0f92006-03-23 17:30:02 -06002895}
2896
Linus Torvalds1da177e2005-04-16 15:20:36 -07002897/**
2898 * ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device
2899 * @cmd: SCSI command to be sent
2900 * @done: Completion function, called when command is complete
2901 *
2902 * In some cases, this function translates SCSI commands into
2903 * ATA taskfiles, and queues the taskfiles to be sent to
2904 * hardware. In other cases, this function simulates a
2905 * SCSI device by evaluating and responding to certain
2906 * SCSI commands. This creates the overall effect of
2907 * ATA and ATAPI devices appearing as SCSI devices.
2908 *
2909 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002910 * Releases scsi-layer-held lock, and obtains host lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911 *
2912 * RETURNS:
Tejun Heo2115ea92006-05-15 21:03:39 +09002913 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
2914 * 0 otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
2917{
2918 struct ata_port *ap;
2919 struct ata_device *dev;
2920 struct scsi_device *scsidev = cmd->device;
Jeff Garzik005a5a02005-10-30 23:31:48 -05002921 struct Scsi_Host *shost = scsidev->host;
Tejun Heo2115ea92006-05-15 21:03:39 +09002922 int rc = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002923
Jeff Garzik35bb94b2006-04-11 13:12:34 -04002924 ap = ata_shost_to_port(shost);
Jeff Garzik005a5a02005-10-30 23:31:48 -05002925
2926 spin_unlock(shost->host_lock);
Jeff Garzikba6a1302006-06-22 23:46:10 -04002927 spin_lock(ap->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002928
2929 ata_scsi_dump_cdb(ap, cmd);
2930
2931 dev = ata_scsi_find_dev(ap, scsidev);
Brian Kingeb3f0f92006-03-23 17:30:02 -06002932 if (likely(dev))
Tejun Heo2115ea92006-05-15 21:03:39 +09002933 rc = __ata_scsi_queuecmd(cmd, done, dev);
Brian Kingeb3f0f92006-03-23 17:30:02 -06002934 else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935 cmd->result = (DID_BAD_TARGET << 16);
2936 done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002937 }
2938
Jeff Garzikba6a1302006-06-22 23:46:10 -04002939 spin_unlock(ap->lock);
Jeff Garzik005a5a02005-10-30 23:31:48 -05002940 spin_lock(shost->host_lock);
Tejun Heo2115ea92006-05-15 21:03:39 +09002941 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942}
2943
2944/**
2945 * ata_scsi_simulate - simulate SCSI command on ATA device
Randy Dunlapc893a3a2006-01-28 13:15:32 -05002946 * @dev: the target device
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947 * @cmd: SCSI command being sent to device.
2948 * @done: SCSI command completion function.
2949 *
2950 * Interprets and directly executes a select list of SCSI commands
2951 * that can be handled internally.
2952 *
2953 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002954 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955 */
2956
Tejun Heo3373efd2006-05-15 20:57:53 +09002957void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002958 void (*done)(struct scsi_cmnd *))
2959{
2960 struct ata_scsi_args args;
Jeff Garzik057ace52005-10-22 14:27:05 -04002961 const u8 *scsicmd = cmd->cmnd;
Jeff Garzik45394142007-09-21 06:23:42 -04002962 u8 tmp8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002963
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002964 args.dev = dev;
2965 args.id = dev->id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002966 args.cmd = cmd;
2967 args.done = done;
2968
2969 switch(scsicmd[0]) {
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002970 /* TODO: worth improving? */
2971 case FORMAT_UNIT:
2972 ata_scsi_invalid_field(cmd, done);
2973 break;
2974
2975 case INQUIRY:
2976 if (scsicmd[1] & 2) /* is CmdDt set? */
Jeff Garzik00bd0202007-09-21 07:26:08 -04002977 ata_scsi_invalid_field(cmd, done);
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002978 else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
2979 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
2980 else switch (scsicmd[2]) {
2981 case 0x00:
2982 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002983 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002984 case 0x80:
2985 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002986 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002987 case 0x83:
2988 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002989 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002990 case 0x89:
2991 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002992 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002993 default:
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002994 ata_scsi_invalid_field(cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002995 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002996 }
2997 break;
2998
2999 case MODE_SENSE:
3000 case MODE_SENSE_10:
3001 ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
3002 break;
3003
3004 case MODE_SELECT: /* unconditionally return */
3005 case MODE_SELECT_10: /* bad-field-in-cdb */
3006 ata_scsi_invalid_field(cmd, done);
3007 break;
3008
3009 case READ_CAPACITY:
3010 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
3011 break;
3012
3013 case SERVICE_ACTION_IN:
3014 if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
3015 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
3016 else
3017 ata_scsi_invalid_field(cmd, done);
3018 break;
3019
3020 case REPORT_LUNS:
3021 ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
3022 break;
3023
3024 case REQUEST_SENSE:
3025 ata_scsi_set_sense(cmd, 0, 0, 0);
3026 cmd->result = (DRIVER_SENSE << 24);
3027 done(cmd);
3028 break;
3029
3030 /* if we reach this, then writeback caching is disabled,
3031 * turning this into a no-op.
3032 */
3033 case SYNCHRONIZE_CACHE:
3034 /* fall through */
3035
3036 /* no-op's, complete with success */
3037 case REZERO_UNIT:
3038 case SEEK_6:
3039 case SEEK_10:
3040 case TEST_UNIT_READY:
3041 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
3042 break;
3043
3044 case SEND_DIAGNOSTIC:
3045 tmp8 = scsicmd[1] & ~(1 << 3);
3046 if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
3047 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
3048 else
3049 ata_scsi_invalid_field(cmd, done);
3050 break;
3051
3052 /* all other commands */
3053 default:
3054 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
3055 /* "Invalid command operation code" */
3056 done(cmd);
3057 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003058 }
3059}
3060
Tejun Heof3187192007-04-17 23:44:07 +09003061int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
3062{
3063 int i, rc;
3064
3065 for (i = 0; i < host->n_ports; i++) {
3066 struct ata_port *ap = host->ports[i];
3067 struct Scsi_Host *shost;
3068
3069 rc = -ENOMEM;
3070 shost = scsi_host_alloc(sht, sizeof(struct ata_port *));
3071 if (!shost)
3072 goto err_alloc;
3073
3074 *(struct ata_port **)&shost->hostdata[0] = ap;
3075 ap->scsi_host = shost;
3076
3077 shost->transportt = &ata_scsi_transport_template;
3078 shost->unique_id = ap->print_id;
3079 shost->max_id = 16;
3080 shost->max_lun = 1;
3081 shost->max_channel = 1;
3082 shost->max_cmd_len = 16;
3083
Tejun Heo31cc23b2007-09-23 13:14:12 +09003084 /* Schedule policy is determined by ->qc_defer()
3085 * callback and it needs to see every deferred qc.
3086 * Set host_blocked to 1 to prevent SCSI midlayer from
3087 * automatically deferring requests.
3088 */
3089 shost->max_host_blocked = 1;
3090
Tejun Heof3187192007-04-17 23:44:07 +09003091 rc = scsi_add_host(ap->scsi_host, ap->host->dev);
3092 if (rc)
3093 goto err_add;
3094 }
3095
3096 return 0;
3097
3098 err_add:
3099 scsi_host_put(host->ports[i]->scsi_host);
3100 err_alloc:
3101 while (--i >= 0) {
3102 struct Scsi_Host *shost = host->ports[i]->scsi_host;
3103
3104 scsi_remove_host(shost);
3105 scsi_host_put(shost);
3106 }
3107 return rc;
3108}
3109
Tejun Heo1ae46312007-07-16 14:29:40 +09003110void ata_scsi_scan_host(struct ata_port *ap, int sync)
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003111{
Tejun Heo1ae46312007-07-16 14:29:40 +09003112 int tries = 5;
3113 struct ata_device *last_failed_dev = NULL;
Tejun Heo41bda9c2007-08-06 18:36:24 +09003114 struct ata_link *link;
Tejun Heo1ae46312007-07-16 14:29:40 +09003115 struct ata_device *dev;
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003116
Tejun Heo198e0fe2006-04-02 18:51:52 +09003117 if (ap->flags & ATA_FLAG_DISABLED)
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003118 return;
3119
Tejun Heo1ae46312007-07-16 14:29:40 +09003120 repeat:
Tejun Heo41bda9c2007-08-06 18:36:24 +09003121 ata_port_for_each_link(link, ap) {
3122 ata_link_for_each_dev(dev, link) {
3123 struct scsi_device *sdev;
3124 int channel = 0, id = 0;
Jeff Garzik3f19ee82005-10-03 21:36:41 -04003125
Tejun Heo41bda9c2007-08-06 18:36:24 +09003126 if (!ata_dev_enabled(dev) || dev->sdev)
3127 continue;
Tejun Heo3edebac2006-05-31 18:27:40 +09003128
Tejun Heo41bda9c2007-08-06 18:36:24 +09003129 if (ata_is_host_link(link))
3130 id = dev->devno;
3131 else
3132 channel = link->pmp;
3133
3134 sdev = __scsi_add_device(ap->scsi_host, channel, id, 0,
3135 NULL);
3136 if (!IS_ERR(sdev)) {
3137 dev->sdev = sdev;
3138 scsi_device_put(sdev);
3139 }
Tejun Heo3edebac2006-05-31 18:27:40 +09003140 }
Jeff Garzik3f19ee82005-10-03 21:36:41 -04003141 }
Tejun Heo1ae46312007-07-16 14:29:40 +09003142
3143 /* If we scanned while EH was in progress or allocation
3144 * failure occurred, scan would have failed silently. Check
3145 * whether all devices are attached.
3146 */
Tejun Heo41bda9c2007-08-06 18:36:24 +09003147 ata_port_for_each_link(link, ap) {
3148 ata_link_for_each_dev(dev, link) {
3149 if (ata_dev_enabled(dev) && !dev->sdev)
3150 goto exit_loop;
3151 }
Tejun Heo1ae46312007-07-16 14:29:40 +09003152 }
Tejun Heo41bda9c2007-08-06 18:36:24 +09003153 exit_loop:
3154 if (!link)
Tejun Heo1ae46312007-07-16 14:29:40 +09003155 return;
3156
3157 /* we're missing some SCSI devices */
3158 if (sync) {
3159 /* If caller requested synchrnous scan && we've made
3160 * any progress, sleep briefly and repeat.
3161 */
3162 if (dev != last_failed_dev) {
3163 msleep(100);
3164 last_failed_dev = dev;
3165 goto repeat;
3166 }
3167
3168 /* We might be failing to detect boot device, give it
3169 * a few more chances.
3170 */
3171 if (--tries) {
3172 msleep(100);
3173 goto repeat;
3174 }
3175
3176 ata_port_printk(ap, KERN_ERR, "WARNING: synchronous SCSI scan "
3177 "failed without making any progress,\n"
3178 " switching to async\n");
3179 }
3180
3181 queue_delayed_work(ata_aux_wq, &ap->hotplug_task,
3182 round_jiffies_relative(HZ));
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003183}
Tejun Heo0ea035a2006-05-31 18:28:01 +09003184
3185/**
3186 * ata_scsi_offline_dev - offline attached SCSI device
3187 * @dev: ATA device to offline attached SCSI device for
3188 *
3189 * This function is called from ata_eh_hotplug() and responsible
3190 * for taking the SCSI device attached to @dev offline. This
Jeff Garzikcca39742006-08-24 03:19:22 -04003191 * function is called with host lock which protects dev->sdev
Tejun Heo0ea035a2006-05-31 18:28:01 +09003192 * against clearing.
3193 *
3194 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003195 * spin_lock_irqsave(host lock)
Tejun Heo0ea035a2006-05-31 18:28:01 +09003196 *
3197 * RETURNS:
3198 * 1 if attached SCSI device exists, 0 otherwise.
3199 */
3200int ata_scsi_offline_dev(struct ata_device *dev)
3201{
3202 if (dev->sdev) {
3203 scsi_device_set_state(dev->sdev, SDEV_OFFLINE);
3204 return 1;
3205 }
3206 return 0;
3207}
Tejun Heo580b21022006-05-31 18:28:05 +09003208
3209/**
3210 * ata_scsi_remove_dev - remove attached SCSI device
3211 * @dev: ATA device to remove attached SCSI device for
3212 *
3213 * This function is called from ata_eh_scsi_hotplug() and
3214 * responsible for removing the SCSI device attached to @dev.
3215 *
3216 * LOCKING:
3217 * Kernel thread context (may sleep).
3218 */
3219static void ata_scsi_remove_dev(struct ata_device *dev)
3220{
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003221 struct ata_port *ap = dev->link->ap;
Tejun Heo580b21022006-05-31 18:28:05 +09003222 struct scsi_device *sdev;
3223 unsigned long flags;
3224
3225 /* Alas, we need to grab scan_mutex to ensure SCSI device
3226 * state doesn't change underneath us and thus
3227 * scsi_device_get() always succeeds. The mutex locking can
3228 * be removed if there is __scsi_device_get() interface which
3229 * increments reference counts regardless of device state.
3230 */
Jeff Garzikcca39742006-08-24 03:19:22 -04003231 mutex_lock(&ap->scsi_host->scan_mutex);
Jeff Garzikba6a1302006-06-22 23:46:10 -04003232 spin_lock_irqsave(ap->lock, flags);
Tejun Heo580b21022006-05-31 18:28:05 +09003233
Jeff Garzikcca39742006-08-24 03:19:22 -04003234 /* clearing dev->sdev is protected by host lock */
Tejun Heo580b21022006-05-31 18:28:05 +09003235 sdev = dev->sdev;
3236 dev->sdev = NULL;
3237
3238 if (sdev) {
3239 /* If user initiated unplug races with us, sdev can go
Jeff Garzikcca39742006-08-24 03:19:22 -04003240 * away underneath us after the host lock and
Tejun Heo580b21022006-05-31 18:28:05 +09003241 * scan_mutex are released. Hold onto it.
3242 */
3243 if (scsi_device_get(sdev) == 0) {
3244 /* The following ensures the attached sdev is
3245 * offline on return from ata_scsi_offline_dev()
3246 * regardless it wins or loses the race
3247 * against this function.
3248 */
3249 scsi_device_set_state(sdev, SDEV_OFFLINE);
3250 } else {
3251 WARN_ON(1);
3252 sdev = NULL;
3253 }
3254 }
3255
Jeff Garzikba6a1302006-06-22 23:46:10 -04003256 spin_unlock_irqrestore(ap->lock, flags);
Jeff Garzikcca39742006-08-24 03:19:22 -04003257 mutex_unlock(&ap->scsi_host->scan_mutex);
Tejun Heo580b21022006-05-31 18:28:05 +09003258
3259 if (sdev) {
3260 ata_dev_printk(dev, KERN_INFO, "detaching (SCSI %s)\n",
3261 sdev->sdev_gendev.bus_id);
3262
3263 scsi_remove_device(sdev);
3264 scsi_device_put(sdev);
3265 }
3266}
3267
Tejun Heo41bda9c2007-08-06 18:36:24 +09003268static void ata_scsi_handle_link_detach(struct ata_link *link)
3269{
3270 struct ata_port *ap = link->ap;
3271 struct ata_device *dev;
3272
3273 ata_link_for_each_dev(dev, link) {
3274 unsigned long flags;
3275
3276 if (!(dev->flags & ATA_DFLAG_DETACHED))
3277 continue;
3278
3279 spin_lock_irqsave(ap->lock, flags);
3280 dev->flags &= ~ATA_DFLAG_DETACHED;
3281 spin_unlock_irqrestore(ap->lock, flags);
3282
3283 ata_scsi_remove_dev(dev);
3284 }
3285}
3286
Tejun Heo580b21022006-05-31 18:28:05 +09003287/**
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003288 * ata_scsi_media_change_notify - send media change event
Randy Dunlapc5d0e6a2007-10-15 17:29:46 -07003289 * @dev: Pointer to the disk device with media change event
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003290 *
3291 * Tell the block layer to send a media change notification
3292 * event.
3293 *
3294 * LOCKING:
Tejun Heo854c73a2007-09-23 13:14:11 +09003295 * spin_lock_irqsave(host lock)
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003296 */
Tejun Heo854c73a2007-09-23 13:14:11 +09003297void ata_scsi_media_change_notify(struct ata_device *dev)
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003298{
3299#ifdef OTHER_AN_PATCHES_HAVE_BEEN_APPLIED
Tejun Heo854c73a2007-09-23 13:14:11 +09003300 if (dev->sdev)
3301 scsi_device_event_notify(dev->sdev, SDEV_MEDIA_CHANGE);
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003302#endif
3303}
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003304
3305/**
Tejun Heo580b21022006-05-31 18:28:05 +09003306 * ata_scsi_hotplug - SCSI part of hotplug
David Howells65f27f32006-11-22 14:55:48 +00003307 * @work: Pointer to ATA port to perform SCSI hotplug on
Tejun Heo580b21022006-05-31 18:28:05 +09003308 *
3309 * Perform SCSI part of hotplug. It's executed from a separate
3310 * workqueue after EH completes. This is necessary because SCSI
3311 * hot plugging requires working EH and hot unplugging is
3312 * synchronized with hot plugging with a mutex.
3313 *
3314 * LOCKING:
3315 * Kernel thread context (may sleep).
3316 */
David Howells65f27f32006-11-22 14:55:48 +00003317void ata_scsi_hotplug(struct work_struct *work)
Tejun Heo580b21022006-05-31 18:28:05 +09003318{
David Howells65f27f32006-11-22 14:55:48 +00003319 struct ata_port *ap =
3320 container_of(work, struct ata_port, hotplug_task.work);
Tejun Heo41bda9c2007-08-06 18:36:24 +09003321 int i;
Tejun Heo580b21022006-05-31 18:28:05 +09003322
Tejun Heob51e9e52006-06-29 01:29:30 +09003323 if (ap->pflags & ATA_PFLAG_UNLOADING) {
Tejun Heo580b21022006-05-31 18:28:05 +09003324 DPRINTK("ENTER/EXIT - unloading\n");
3325 return;
3326 }
3327
3328 DPRINTK("ENTER\n");
3329
Tejun Heo41bda9c2007-08-06 18:36:24 +09003330 /* Unplug detached devices. We cannot use link iterator here
3331 * because PMP links have to be scanned even if PMP is
3332 * currently not attached. Iterate manually.
3333 */
3334 ata_scsi_handle_link_detach(&ap->link);
3335 if (ap->pmp_link)
3336 for (i = 0; i < SATA_PMP_MAX_PORTS; i++)
3337 ata_scsi_handle_link_detach(&ap->pmp_link[i]);
Tejun Heo580b21022006-05-31 18:28:05 +09003338
3339 /* scan for new ones */
Tejun Heo1ae46312007-07-16 14:29:40 +09003340 ata_scsi_scan_host(ap, 0);
Tejun Heo580b21022006-05-31 18:28:05 +09003341
3342 DPRINTK("EXIT\n");
3343}
Tejun Heo83c47bc2006-05-31 18:28:07 +09003344
3345/**
3346 * ata_scsi_user_scan - indication for user-initiated bus scan
3347 * @shost: SCSI host to scan
3348 * @channel: Channel to scan
3349 * @id: ID to scan
3350 * @lun: LUN to scan
3351 *
3352 * This function is called when user explicitly requests bus
3353 * scan. Set probe pending flag and invoke EH.
3354 *
3355 * LOCKING:
3356 * SCSI layer (we don't care)
3357 *
3358 * RETURNS:
3359 * Zero.
3360 */
3361static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
3362 unsigned int id, unsigned int lun)
3363{
3364 struct ata_port *ap = ata_shost_to_port(shost);
3365 unsigned long flags;
Tejun Heo41bda9c2007-08-06 18:36:24 +09003366 int devno, rc = 0;
Tejun Heo83c47bc2006-05-31 18:28:07 +09003367
3368 if (!ap->ops->error_handler)
3369 return -EOPNOTSUPP;
3370
Tejun Heo41bda9c2007-08-06 18:36:24 +09003371 if (lun != SCAN_WILD_CARD && lun)
Tejun Heo83c47bc2006-05-31 18:28:07 +09003372 return -EINVAL;
3373
Tejun Heo41bda9c2007-08-06 18:36:24 +09003374 if (ap->nr_pmp_links == 0) {
3375 if (channel != SCAN_WILD_CARD && channel)
3376 return -EINVAL;
3377 devno = id;
3378 } else {
3379 if (id != SCAN_WILD_CARD && id)
3380 return -EINVAL;
3381 devno = channel;
3382 }
3383
Jeff Garzikba6a1302006-06-22 23:46:10 -04003384 spin_lock_irqsave(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003385
Tejun Heo41bda9c2007-08-06 18:36:24 +09003386 if (devno == SCAN_WILD_CARD) {
3387 struct ata_link *link;
3388
3389 ata_port_for_each_link(link, ap) {
3390 struct ata_eh_info *ehi = &link->eh_info;
3391 ehi->probe_mask |= (1 << ata_link_max_devices(link)) - 1;
3392 ehi->action |= ATA_EH_SOFTRESET;
3393 }
Tejun Heo83c47bc2006-05-31 18:28:07 +09003394 } else {
Tejun Heo41bda9c2007-08-06 18:36:24 +09003395 struct ata_device *dev = ata_find_dev(ap, devno);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003396
3397 if (dev) {
Tejun Heo41bda9c2007-08-06 18:36:24 +09003398 struct ata_eh_info *ehi = &dev->link->eh_info;
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003399 ehi->probe_mask |= 1 << dev->devno;
3400 ehi->action |= ATA_EH_SOFTRESET;
3401 ehi->flags |= ATA_EHI_RESUME_LINK;
Tejun Heo83c47bc2006-05-31 18:28:07 +09003402 } else
3403 rc = -EINVAL;
3404 }
3405
Tejun Heo309afcb2006-09-30 18:07:17 +09003406 if (rc == 0) {
Tejun Heo83c47bc2006-05-31 18:28:07 +09003407 ata_port_schedule_eh(ap);
Tejun Heo309afcb2006-09-30 18:07:17 +09003408 spin_unlock_irqrestore(ap->lock, flags);
3409 ata_port_wait_eh(ap);
3410 } else
3411 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003412
3413 return rc;
3414}
zhao, forrest3057ac32006-06-12 12:01:34 +08003415
3416/**
Tejun Heod0171262006-06-12 22:51:14 +09003417 * ata_scsi_dev_rescan - initiate scsi_rescan_device()
David Howells65f27f32006-11-22 14:55:48 +00003418 * @work: Pointer to ATA port to perform scsi_rescan_device()
zhao, forrest3057ac32006-06-12 12:01:34 +08003419 *
Tejun Heod0171262006-06-12 22:51:14 +09003420 * After ATA pass thru (SAT) commands are executed successfully,
3421 * libata need to propagate the changes to SCSI layer. This
3422 * function must be executed from ata_aux_wq such that sdev
3423 * attach/detach don't race with rescan.
zhao, forrest3057ac32006-06-12 12:01:34 +08003424 *
Tejun Heod0171262006-06-12 22:51:14 +09003425 * LOCKING:
3426 * Kernel thread context (may sleep).
zhao, forrest3057ac32006-06-12 12:01:34 +08003427 */
David Howells65f27f32006-11-22 14:55:48 +00003428void ata_scsi_dev_rescan(struct work_struct *work)
zhao, forrest3057ac32006-06-12 12:01:34 +08003429{
David Howells65f27f32006-11-22 14:55:48 +00003430 struct ata_port *ap =
3431 container_of(work, struct ata_port, scsi_rescan_task);
Tejun Heo41bda9c2007-08-06 18:36:24 +09003432 struct ata_link *link;
Tejun Heof58229f2007-08-06 18:36:23 +09003433 struct ata_device *dev;
Tejun Heof84e7e42006-11-22 11:21:31 +09003434 unsigned long flags;
zhao, forrest3057ac32006-06-12 12:01:34 +08003435
Tejun Heof84e7e42006-11-22 11:21:31 +09003436 spin_lock_irqsave(ap->lock, flags);
zhao, forrest3057ac32006-06-12 12:01:34 +08003437
Tejun Heo41bda9c2007-08-06 18:36:24 +09003438 ata_port_for_each_link(link, ap) {
3439 ata_link_for_each_dev(dev, link) {
3440 struct scsi_device *sdev = dev->sdev;
Tejun Heof84e7e42006-11-22 11:21:31 +09003441
Tejun Heo41bda9c2007-08-06 18:36:24 +09003442 if (!ata_dev_enabled(dev) || !sdev)
3443 continue;
3444 if (scsi_device_get(sdev))
3445 continue;
Tejun Heof84e7e42006-11-22 11:21:31 +09003446
Tejun Heo41bda9c2007-08-06 18:36:24 +09003447 spin_unlock_irqrestore(ap->lock, flags);
3448 scsi_rescan_device(&(sdev->sdev_gendev));
3449 scsi_device_put(sdev);
3450 spin_lock_irqsave(ap->lock, flags);
3451 }
zhao, forrest3057ac32006-06-12 12:01:34 +08003452 }
Tejun Heof84e7e42006-11-22 11:21:31 +09003453
3454 spin_unlock_irqrestore(ap->lock, flags);
zhao, forrest3057ac32006-06-12 12:01:34 +08003455}
Brian King80289162006-08-07 14:27:31 -05003456
3457/**
3458 * ata_sas_port_alloc - Allocate port for a SAS attached SATA device
Jeff Garzik4f931372006-09-29 05:07:25 -04003459 * @host: ATA host container for all SAS ports
Brian King80289162006-08-07 14:27:31 -05003460 * @port_info: Information from low-level host driver
Jeff Garzikcca39742006-08-24 03:19:22 -04003461 * @shost: SCSI host that the scsi device is attached to
Brian King80289162006-08-07 14:27:31 -05003462 *
3463 * LOCKING:
3464 * PCI/etc. bus probe sem.
3465 *
3466 * RETURNS:
3467 * ata_port pointer on success / NULL on failure.
3468 */
3469
Jeff Garzikcca39742006-08-24 03:19:22 -04003470struct ata_port *ata_sas_port_alloc(struct ata_host *host,
Brian King80289162006-08-07 14:27:31 -05003471 struct ata_port_info *port_info,
Jeff Garzikcca39742006-08-24 03:19:22 -04003472 struct Scsi_Host *shost)
Brian King80289162006-08-07 14:27:31 -05003473{
Tejun Heof3187192007-04-17 23:44:07 +09003474 struct ata_port *ap;
Brian King80289162006-08-07 14:27:31 -05003475
Tejun Heof3187192007-04-17 23:44:07 +09003476 ap = ata_port_alloc(host);
Brian King80289162006-08-07 14:27:31 -05003477 if (!ap)
3478 return NULL;
3479
Tejun Heof3187192007-04-17 23:44:07 +09003480 ap->port_no = 0;
Jeff Garzikcca39742006-08-24 03:19:22 -04003481 ap->lock = shost->host_lock;
Tejun Heof3187192007-04-17 23:44:07 +09003482 ap->pio_mask = port_info->pio_mask;
3483 ap->mwdma_mask = port_info->mwdma_mask;
3484 ap->udma_mask = port_info->udma_mask;
3485 ap->flags |= port_info->flags;
3486 ap->ops = port_info->port_ops;
3487 ap->cbl = ATA_CBL_SATA;
3488
Brian King80289162006-08-07 14:27:31 -05003489 return ap;
3490}
3491EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
3492
3493/**
3494 * ata_sas_port_start - Set port up for dma.
3495 * @ap: Port to initialize
3496 *
3497 * Called just after data structures for each port are
3498 * initialized. Allocates DMA pad.
3499 *
3500 * May be used as the port_start() entry in ata_port_operations.
3501 *
3502 * LOCKING:
3503 * Inherited from caller.
3504 */
3505int ata_sas_port_start(struct ata_port *ap)
3506{
3507 return ata_pad_alloc(ap, ap->dev);
3508}
3509EXPORT_SYMBOL_GPL(ata_sas_port_start);
3510
3511/**
3512 * ata_port_stop - Undo ata_sas_port_start()
3513 * @ap: Port to shut down
3514 *
3515 * Frees the DMA pad.
3516 *
3517 * May be used as the port_stop() entry in ata_port_operations.
3518 *
3519 * LOCKING:
3520 * Inherited from caller.
3521 */
3522
3523void ata_sas_port_stop(struct ata_port *ap)
3524{
3525 ata_pad_free(ap, ap->dev);
3526}
3527EXPORT_SYMBOL_GPL(ata_sas_port_stop);
3528
3529/**
3530 * ata_sas_port_init - Initialize a SATA device
3531 * @ap: SATA port to initialize
3532 *
3533 * LOCKING:
3534 * PCI/etc. bus probe sem.
3535 *
3536 * RETURNS:
3537 * Zero on success, non-zero on error.
3538 */
3539
3540int ata_sas_port_init(struct ata_port *ap)
3541{
3542 int rc = ap->ops->port_start(ap);
3543
Tejun Heof3187192007-04-17 23:44:07 +09003544 if (!rc) {
3545 ap->print_id = ata_print_id++;
Brian King80289162006-08-07 14:27:31 -05003546 rc = ata_bus_probe(ap);
Tejun Heof3187192007-04-17 23:44:07 +09003547 }
Brian King80289162006-08-07 14:27:31 -05003548
3549 return rc;
3550}
3551EXPORT_SYMBOL_GPL(ata_sas_port_init);
3552
3553/**
3554 * ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
3555 * @ap: SATA port to destroy
3556 *
3557 */
3558
3559void ata_sas_port_destroy(struct ata_port *ap)
3560{
Tejun Heof0d36ef2007-01-20 16:00:28 +09003561 if (ap->ops->port_stop)
3562 ap->ops->port_stop(ap);
Brian King80289162006-08-07 14:27:31 -05003563 kfree(ap);
3564}
3565EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
3566
3567/**
3568 * ata_sas_slave_configure - Default slave_config routine for libata devices
3569 * @sdev: SCSI device to configure
3570 * @ap: ATA port to which SCSI device is attached
3571 *
3572 * RETURNS:
3573 * Zero.
3574 */
3575
3576int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
3577{
3578 ata_scsi_sdev_config(sdev);
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003579 ata_scsi_dev_config(sdev, ap->link.device);
Brian King80289162006-08-07 14:27:31 -05003580 return 0;
3581}
3582EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
3583
3584/**
3585 * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
3586 * @cmd: SCSI command to be sent
3587 * @done: Completion function, called when command is complete
3588 * @ap: ATA port to which the command is being sent
3589 *
3590 * RETURNS:
Brian King08475a12006-11-20 13:51:56 -06003591 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
3592 * 0 otherwise.
Brian King80289162006-08-07 14:27:31 -05003593 */
3594
3595int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
3596 struct ata_port *ap)
3597{
Brian King08475a12006-11-20 13:51:56 -06003598 int rc = 0;
3599
Brian King80289162006-08-07 14:27:31 -05003600 ata_scsi_dump_cdb(ap, cmd);
3601
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003602 if (likely(ata_scsi_dev_enabled(ap->link.device)))
3603 rc = __ata_scsi_queuecmd(cmd, done, ap->link.device);
Brian King80289162006-08-07 14:27:31 -05003604 else {
3605 cmd->result = (DID_BAD_TARGET << 16);
3606 done(cmd);
3607 }
Brian King08475a12006-11-20 13:51:56 -06003608 return rc;
Brian King80289162006-08-07 14:27:31 -05003609}
3610EXPORT_SYMBOL_GPL(ata_sas_queuecmd);