blob: ea53e6a570b428e88cef5018c1318923c2d75667 [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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070048#include <asm/uaccess.h>
49
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
56static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap,
57 const struct scsi_device *scsidev);
58static struct ata_device * ata_scsi_find_dev(struct ata_port *ap,
59 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
Douglas Gilbertae006512005-10-09 09:09:35 -0400113static void ata_scsi_invalid_field(struct scsi_cmnd *cmd,
114 void (*done)(struct scsi_cmnd *))
115{
116 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x24, 0x0);
117 /* "Invalid field in cbd" */
118 done(cmd);
119}
120
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121/**
122 * ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd.
123 * @sdev: SCSI device for which BIOS geometry is to be determined
124 * @bdev: block device associated with @sdev
125 * @capacity: capacity of SCSI device
126 * @geom: location to which geometry will be output
127 *
128 * Generic bios head/sector/cylinder calculator
129 * used by sd. Most BIOSes nowadays expect a XXX/255/16 (CHS)
130 * mapping. Some situations may arise where the disk is not
131 * bootable if this is not used.
132 *
133 * LOCKING:
134 * Defined by the SCSI layer. We don't really care.
135 *
136 * RETURNS:
137 * Zero.
138 */
139int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
140 sector_t capacity, int geom[])
141{
142 geom[0] = 255;
143 geom[1] = 63;
144 sector_div(capacity, 255*63);
145 geom[2] = capacity;
146
147 return 0;
148}
149
Jeff Garzikb0955182005-05-12 15:45:22 -0400150/**
Tejun Heo5924b742007-01-02 20:20:07 +0900151 * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
152 * @sdev: SCSI device to get identify data for
153 * @arg: User buffer area for identify data
154 *
155 * LOCKING:
156 * Defined by the SCSI layer. We don't really care.
157 *
158 * RETURNS:
159 * Zero on success, negative errno on error.
160 */
161static int ata_get_identity(struct scsi_device *sdev, void __user *arg)
162{
163 struct ata_port *ap = ata_shost_to_port(sdev->host);
164 struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
165 u16 __user *dst = arg;
166 char buf[40];
167
168 if (!dev)
169 return -ENOMSG;
170
171 if (copy_to_user(dst, dev->id, ATA_ID_WORDS * sizeof(u16)))
172 return -EFAULT;
173
174 ata_id_string(dev->id, buf, ATA_ID_PROD, ATA_ID_PROD_LEN);
175 if (copy_to_user(dst + ATA_ID_PROD, buf, ATA_ID_PROD_LEN))
176 return -EFAULT;
177
178 ata_id_string(dev->id, buf, ATA_ID_FW_REV, ATA_ID_FW_REV_LEN);
179 if (copy_to_user(dst + ATA_ID_FW_REV, buf, ATA_ID_FW_REV_LEN))
180 return -EFAULT;
181
182 ata_id_string(dev->id, buf, ATA_ID_SERNO, ATA_ID_SERNO_LEN);
183 if (copy_to_user(dst + ATA_ID_SERNO, buf, ATA_ID_SERNO_LEN))
184 return -EFAULT;
185
186 return 0;
187}
188
189/**
Jeff Garzikb0955182005-05-12 15:45:22 -0400190 * ata_cmd_ioctl - Handler for HDIO_DRIVE_CMD ioctl
Randy Dunlap8e8b77d2005-11-01 21:29:27 -0800191 * @scsidev: Device to which we are issuing command
Jeff Garzikb0955182005-05-12 15:45:22 -0400192 * @arg: User provided data for issuing command
193 *
194 * LOCKING:
195 * Defined by the SCSI layer. We don't really care.
196 *
197 * RETURNS:
198 * Zero on success, negative errno on error.
199 */
Jeff Garzikb0955182005-05-12 15:45:22 -0400200int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
201{
202 int rc = 0;
203 u8 scsi_cmd[MAX_COMMAND_SIZE];
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700204 u8 args[4], *argbuf = NULL, *sensebuf = NULL;
Jeff Garzikb0955182005-05-12 15:45:22 -0400205 int argsize = 0;
Mike Christie85837eb2005-11-11 16:38:53 -0600206 enum dma_data_direction data_dir;
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700207 int cmd_result;
Jeff Garzikb0955182005-05-12 15:45:22 -0400208
Randy Dunlapc893a3a2006-01-28 13:15:32 -0500209 if (arg == NULL)
Jeff Garzikb0955182005-05-12 15:45:22 -0400210 return -EINVAL;
211
212 if (copy_from_user(args, arg, sizeof(args)))
213 return -EFAULT;
214
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700215 sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
216 if (!sensebuf)
217 return -ENOMEM;
218
Jeff Garzikb0955182005-05-12 15:45:22 -0400219 memset(scsi_cmd, 0, sizeof(scsi_cmd));
220
221 if (args[3]) {
222 argsize = SECTOR_SIZE * args[3];
223 argbuf = kmalloc(argsize, GFP_KERNEL);
Jeff Raubitschek54dac832005-10-04 10:21:19 -0400224 if (argbuf == NULL) {
225 rc = -ENOMEM;
226 goto error;
227 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400228
229 scsi_cmd[1] = (4 << 1); /* PIO Data-in */
230 scsi_cmd[2] = 0x0e; /* no off.line or cc, read from dev,
231 block count in sector count field */
Mike Christie85837eb2005-11-11 16:38:53 -0600232 data_dir = DMA_FROM_DEVICE;
Jeff Garzikb0955182005-05-12 15:45:22 -0400233 } else {
234 scsi_cmd[1] = (3 << 1); /* Non-data */
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700235 scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */
Mike Christie85837eb2005-11-11 16:38:53 -0600236 data_dir = DMA_NONE;
Jeff Garzikb0955182005-05-12 15:45:22 -0400237 }
238
239 scsi_cmd[0] = ATA_16;
240
241 scsi_cmd[4] = args[2];
242 if (args[0] == WIN_SMART) { /* hack -- ide driver does this too... */
243 scsi_cmd[6] = args[3];
244 scsi_cmd[8] = args[1];
245 scsi_cmd[10] = 0x4f;
246 scsi_cmd[12] = 0xc2;
247 } else {
248 scsi_cmd[6] = args[1];
249 }
250 scsi_cmd[14] = args[0];
251
252 /* Good values for timeout and retries? Values below
253 from scsi_ioctl_send_command() for default case... */
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700254 cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
255 sensebuf, (10*HZ), 5, 0);
256
257 if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
258 u8 *desc = sensebuf + 8;
259 cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
260
261 /* If we set cc then ATA pass-through will cause a
262 * check condition even if no error. Filter that. */
263 if (cmd_result & SAM_STAT_CHECK_CONDITION) {
264 struct scsi_sense_hdr sshdr;
265 scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
266 &sshdr);
267 if (sshdr.sense_key==0 &&
268 sshdr.asc==0 && sshdr.ascq==0)
269 cmd_result &= ~SAM_STAT_CHECK_CONDITION;
270 }
271
272 /* Send userspace a few ATA registers (same as drivers/ide) */
273 if (sensebuf[0] == 0x72 && /* format is "descriptor" */
274 desc[0] == 0x09 ) { /* code is "ATA Descriptor" */
275 args[0] = desc[13]; /* status */
276 args[1] = desc[3]; /* error */
277 args[2] = desc[5]; /* sector count (0:7) */
278 if (copy_to_user(arg, args, sizeof(args)))
279 rc = -EFAULT;
280 }
281 }
282
283
284 if (cmd_result) {
Jeff Garzikb0955182005-05-12 15:45:22 -0400285 rc = -EIO;
286 goto error;
287 }
288
Jeff Garzikb0955182005-05-12 15:45:22 -0400289 if ((argbuf)
Randy Dunlapc893a3a2006-01-28 13:15:32 -0500290 && copy_to_user(arg + sizeof(args), argbuf, argsize))
Jeff Garzikb0955182005-05-12 15:45:22 -0400291 rc = -EFAULT;
292error:
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700293 kfree(sensebuf);
Jesper Juhl8f760782006-06-27 02:55:06 -0700294 kfree(argbuf);
Jeff Garzikb0955182005-05-12 15:45:22 -0400295 return rc;
296}
297
298/**
299 * ata_task_ioctl - Handler for HDIO_DRIVE_TASK ioctl
Randy Dunlap8e8b77d2005-11-01 21:29:27 -0800300 * @scsidev: Device to which we are issuing command
Jeff Garzikb0955182005-05-12 15:45:22 -0400301 * @arg: User provided data for issuing command
302 *
303 * LOCKING:
304 * Defined by the SCSI layer. We don't really care.
305 *
306 * RETURNS:
307 * Zero on success, negative errno on error.
308 */
309int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
310{
311 int rc = 0;
312 u8 scsi_cmd[MAX_COMMAND_SIZE];
David Milburnaf068bd2007-01-30 00:59:15 -0800313 u8 args[7], *sensebuf = NULL;
314 int cmd_result;
Jeff Garzikb0955182005-05-12 15:45:22 -0400315
Randy Dunlapc893a3a2006-01-28 13:15:32 -0500316 if (arg == NULL)
Jeff Garzikb0955182005-05-12 15:45:22 -0400317 return -EINVAL;
318
319 if (copy_from_user(args, arg, sizeof(args)))
320 return -EFAULT;
321
David Milburnaf068bd2007-01-30 00:59:15 -0800322 sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
323 if (!sensebuf)
324 return -ENOMEM;
325
Jeff Garzikb0955182005-05-12 15:45:22 -0400326 memset(scsi_cmd, 0, sizeof(scsi_cmd));
327 scsi_cmd[0] = ATA_16;
328 scsi_cmd[1] = (3 << 1); /* Non-data */
David Milburnaf068bd2007-01-30 00:59:15 -0800329 scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */
Jeff Garzikb0955182005-05-12 15:45:22 -0400330 scsi_cmd[4] = args[1];
331 scsi_cmd[6] = args[2];
332 scsi_cmd[8] = args[3];
333 scsi_cmd[10] = args[4];
334 scsi_cmd[12] = args[5];
Mark Lord277239f2007-03-30 17:45:52 -0400335 scsi_cmd[13] = args[6] & 0x4f;
Jeff Garzikb0955182005-05-12 15:45:22 -0400336 scsi_cmd[14] = args[0];
337
Jeff Garzikb0955182005-05-12 15:45:22 -0400338 /* Good values for timeout and retries? Values below
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500339 from scsi_ioctl_send_command() for default case... */
David Milburnaf068bd2007-01-30 00:59:15 -0800340 cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
341 sensebuf, (10*HZ), 5, 0);
Jeff Garzikb0955182005-05-12 15:45:22 -0400342
David Milburnaf068bd2007-01-30 00:59:15 -0800343 if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
344 u8 *desc = sensebuf + 8;
345 cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
346
347 /* If we set cc then ATA pass-through will cause a
348 * check condition even if no error. Filter that. */
349 if (cmd_result & SAM_STAT_CHECK_CONDITION) {
350 struct scsi_sense_hdr sshdr;
351 scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
352 &sshdr);
353 if (sshdr.sense_key==0 &&
354 sshdr.asc==0 && sshdr.ascq==0)
355 cmd_result &= ~SAM_STAT_CHECK_CONDITION;
356 }
357
358 /* Send userspace ATA registers */
359 if (sensebuf[0] == 0x72 && /* format is "descriptor" */
360 desc[0] == 0x09) {/* code is "ATA Descriptor" */
361 args[0] = desc[13]; /* status */
362 args[1] = desc[3]; /* error */
363 args[2] = desc[5]; /* sector count (0:7) */
364 args[3] = desc[7]; /* lbal */
365 args[4] = desc[9]; /* lbam */
366 args[5] = desc[11]; /* lbah */
367 args[6] = desc[12]; /* select */
368 if (copy_to_user(arg, args, sizeof(args)))
369 rc = -EFAULT;
370 }
371 }
372
373 if (cmd_result) {
374 rc = -EIO;
375 goto error;
376 }
377
378 error:
379 kfree(sensebuf);
Jeff Garzikb0955182005-05-12 15:45:22 -0400380 return rc;
381}
382
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
384{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 int val = -EINVAL, rc = -EINVAL;
386
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 switch (cmd) {
388 case ATA_IOC_GET_IO32:
389 val = 0;
390 if (copy_to_user(arg, &val, 1))
391 return -EFAULT;
392 return 0;
393
394 case ATA_IOC_SET_IO32:
395 val = (unsigned long) arg;
396 if (val != 0)
397 return -EINVAL;
398 return 0;
399
Tejun Heo5924b742007-01-02 20:20:07 +0900400 case HDIO_GET_IDENTITY:
401 return ata_get_identity(scsidev, arg);
402
Jeff Garzikb0955182005-05-12 15:45:22 -0400403 case HDIO_DRIVE_CMD:
404 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
405 return -EACCES;
406 return ata_cmd_ioctl(scsidev, arg);
407
408 case HDIO_DRIVE_TASK:
409 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
410 return -EACCES;
411 return ata_task_ioctl(scsidev, arg);
412
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 default:
414 rc = -ENOTTY;
415 break;
416 }
417
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418 return rc;
419}
420
421/**
422 * ata_scsi_qc_new - acquire new ata_queued_cmd reference
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 * @dev: ATA device to which the new command is attached
424 * @cmd: SCSI command that originated this ATA command
425 * @done: SCSI command completion function
426 *
427 * Obtain a reference to an unused ata_queued_cmd structure,
428 * which is the basic libata structure representing a single
429 * ATA command sent to the hardware.
430 *
431 * If a command was available, fill in the SCSI-specific
432 * portions of the structure with information on the
433 * current command.
434 *
435 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400436 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437 *
438 * RETURNS:
439 * Command allocated, or %NULL if none available.
440 */
Adrian Bunk7102d232007-01-04 00:09:36 +0100441static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
442 struct scsi_cmnd *cmd,
443 void (*done)(struct scsi_cmnd *))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444{
445 struct ata_queued_cmd *qc;
446
Tejun Heo3373efd2006-05-15 20:57:53 +0900447 qc = ata_qc_new_init(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 if (qc) {
449 qc->scsicmd = cmd;
450 qc->scsidone = done;
451
Boaz Harrosh71201652007-09-18 17:48:50 +0200452 qc->__sg = scsi_sglist(cmd);
453 qc->n_elem = scsi_sg_count(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 } else {
455 cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
456 done(cmd);
457 }
458
459 return qc;
460}
461
462/**
Jeff Garzikb0955182005-05-12 15:45:22 -0400463 * ata_dump_status - user friendly display of error info
464 * @id: id of the port in question
465 * @tf: ptr to filled out taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466 *
Jeff Garzikb0955182005-05-12 15:45:22 -0400467 * Decode and dump the ATA error/status registers for the user so
468 * that they have some idea what really happened at the non
469 * make-believe layer.
470 *
471 * LOCKING:
472 * inherited from caller
473 */
Adrian Bunk7102d232007-01-04 00:09:36 +0100474static void ata_dump_status(unsigned id, struct ata_taskfile *tf)
Jeff Garzikb0955182005-05-12 15:45:22 -0400475{
476 u8 stat = tf->command, err = tf->feature;
477
478 printk(KERN_WARNING "ata%u: status=0x%02x { ", id, stat);
479 if (stat & ATA_BUSY) {
480 printk("Busy }\n"); /* Data is not valid in this case */
481 } else {
482 if (stat & 0x40) printk("DriveReady ");
483 if (stat & 0x20) printk("DeviceFault ");
484 if (stat & 0x10) printk("SeekComplete ");
485 if (stat & 0x08) printk("DataRequest ");
486 if (stat & 0x04) printk("CorrectedError ");
487 if (stat & 0x02) printk("Index ");
488 if (stat & 0x01) printk("Error ");
489 printk("}\n");
490
491 if (err) {
492 printk(KERN_WARNING "ata%u: error=0x%02x { ", id, err);
493 if (err & 0x04) printk("DriveStatusError ");
494 if (err & 0x80) {
495 if (err & 0x04) printk("BadCRC ");
496 else printk("Sector ");
497 }
498 if (err & 0x40) printk("UncorrectableError ");
499 if (err & 0x10) printk("SectorIdNotFound ");
500 if (err & 0x02) printk("TrackZeroNotFound ");
501 if (err & 0x01) printk("AddrMarkNotFound ");
502 printk("}\n");
503 }
504 }
505}
506
507/**
508 * ata_to_sense_error - convert ATA error to SCSI error
Randy Dunlap8e8b77d2005-11-01 21:29:27 -0800509 * @id: ATA device number
Jeff Garzikb0955182005-05-12 15:45:22 -0400510 * @drv_stat: value contained in ATA status register
511 * @drv_err: value contained in ATA error register
512 * @sk: the sense key we'll fill out
513 * @asc: the additional sense code we'll fill out
514 * @ascq: the additional sense code qualifier we'll fill out
Tejun Heo246619d2006-05-15 20:58:16 +0900515 * @verbose: be verbose
Jeff Garzikb0955182005-05-12 15:45:22 -0400516 *
517 * Converts an ATA error into a SCSI error. Fill out pointers to
518 * SK, ASC, and ASCQ bytes for later use in fixed or descriptor
519 * format sense blocks.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 *
521 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400522 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523 */
Adrian Bunk7102d232007-01-04 00:09:36 +0100524static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
525 u8 *asc, u8 *ascq, int verbose)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526{
Jeff Garzikb0955182005-05-12 15:45:22 -0400527 int i;
Jeff Garzikffe75ef2005-10-09 10:40:44 -0400528
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 /* Based on the 3ware driver translation table */
Arjan van de Ven98ac62d2005-11-28 10:06:23 +0100530 static const unsigned char sense_table[][4] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 /* BBD|ECC|ID|MAR */
532 {0xd1, ABORTED_COMMAND, 0x00, 0x00}, // Device busy Aborted command
533 /* BBD|ECC|ID */
534 {0xd0, ABORTED_COMMAND, 0x00, 0x00}, // Device busy Aborted command
535 /* ECC|MC|MARK */
536 {0x61, HARDWARE_ERROR, 0x00, 0x00}, // Device fault Hardware error
537 /* ICRC|ABRT */ /* NB: ICRC & !ABRT is BBD */
538 {0x84, ABORTED_COMMAND, 0x47, 0x00}, // Data CRC error SCSI parity error
539 /* MC|ID|ABRT|TRK0|MARK */
540 {0x37, NOT_READY, 0x04, 0x00}, // Unit offline Not ready
541 /* MCR|MARK */
542 {0x09, NOT_READY, 0x04, 0x00}, // Unrecovered disk error Not ready
543 /* Bad address mark */
544 {0x01, MEDIUM_ERROR, 0x13, 0x00}, // Address mark not found Address mark not found for data field
545 /* TRK0 */
546 {0x02, HARDWARE_ERROR, 0x00, 0x00}, // Track 0 not found Hardware error
547 /* Abort & !ICRC */
548 {0x04, ABORTED_COMMAND, 0x00, 0x00}, // Aborted command Aborted command
549 /* Media change request */
550 {0x08, NOT_READY, 0x04, 0x00}, // Media change request FIXME: faking offline
551 /* SRV */
552 {0x10, ABORTED_COMMAND, 0x14, 0x00}, // ID not found Recorded entity not found
553 /* Media change */
554 {0x08, NOT_READY, 0x04, 0x00}, // Media change FIXME: faking offline
555 /* ECC */
556 {0x40, MEDIUM_ERROR, 0x11, 0x04}, // Uncorrectable ECC error Unrecovered read error
557 /* BBD - block marked bad */
558 {0x80, MEDIUM_ERROR, 0x11, 0x04}, // Block marked bad Medium error, unrecovered read error
559 {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
560 };
Arjan van de Ven98ac62d2005-11-28 10:06:23 +0100561 static const unsigned char stat_table[][4] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 /* Must be first because BUSY means no other bits valid */
563 {0x80, ABORTED_COMMAND, 0x47, 0x00}, // Busy, fake parity for now
564 {0x20, HARDWARE_ERROR, 0x00, 0x00}, // Device fault
565 {0x08, ABORTED_COMMAND, 0x47, 0x00}, // Timed out in xfer, fake parity for now
566 {0x04, RECOVERED_ERROR, 0x11, 0x00}, // Recovered ECC error Medium error, recovered
567 {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
568 };
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 /*
571 * Is this an error we can process/parse
572 */
Jeff Garzikb0955182005-05-12 15:45:22 -0400573 if (drv_stat & ATA_BUSY) {
574 drv_err = 0; /* Ignore the err bits, they're invalid */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576
Jeff Garzikb0955182005-05-12 15:45:22 -0400577 if (drv_err) {
578 /* Look for drv_err */
579 for (i = 0; sense_table[i][0] != 0xFF; i++) {
580 /* Look for best matches first */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500581 if ((sense_table[i][0] & drv_err) ==
Jeff Garzikb0955182005-05-12 15:45:22 -0400582 sense_table[i][0]) {
583 *sk = sense_table[i][1];
584 *asc = sense_table[i][2];
585 *ascq = sense_table[i][3];
586 goto translate_done;
587 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400589 /* No immediate match */
Tejun Heo246619d2006-05-15 20:58:16 +0900590 if (verbose)
591 printk(KERN_WARNING "ata%u: no sense translation for "
592 "error 0x%02x\n", id, drv_err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593 }
594
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 /* Fall back to interpreting status bits */
Jeff Garzikb0955182005-05-12 15:45:22 -0400596 for (i = 0; stat_table[i][0] != 0xFF; i++) {
597 if (stat_table[i][0] & drv_stat) {
598 *sk = stat_table[i][1];
599 *asc = stat_table[i][2];
600 *ascq = stat_table[i][3];
601 goto translate_done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400604 /* No error? Undecoded? */
Tejun Heo246619d2006-05-15 20:58:16 +0900605 if (verbose)
606 printk(KERN_WARNING "ata%u: no sense translation for "
607 "status: 0x%02x\n", id, drv_stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608
Alan Cox2d202022006-03-21 15:53:46 +0000609 /* We need a sensible error return here, which is tricky, and one
610 that won't cause people to do things like return a disk wrongly */
611 *sk = ABORTED_COMMAND;
612 *asc = 0x00;
613 *ascq = 0x00;
Jeff Garzikb0955182005-05-12 15:45:22 -0400614
615 translate_done:
Tejun Heo246619d2006-05-15 20:58:16 +0900616 if (verbose)
617 printk(KERN_ERR "ata%u: translated ATA stat/err 0x%02x/%02x "
618 "to SCSI SK/ASC/ASCQ 0x%x/%02x/%02x\n",
619 id, drv_stat, drv_err, *sk, *asc, *ascq);
Jeff Garzikb0955182005-05-12 15:45:22 -0400620 return;
621}
622
623/*
Tejun Heo750426a2006-11-14 22:37:35 +0900624 * ata_gen_passthru_sense - Generate check condition sense block.
Jeff Garzikb0955182005-05-12 15:45:22 -0400625 * @qc: Command that completed.
626 *
627 * This function is specific to the ATA descriptor format sense
628 * block specified for the ATA pass through commands. Regardless
629 * of whether the command errored or not, return a sense
630 * block. Copy all controller registers into the sense
631 * block. Clear sense key, ASC & ASCQ if there is no error.
632 *
633 * LOCKING:
Tejun Heo750426a2006-11-14 22:37:35 +0900634 * None.
Jeff Garzikb0955182005-05-12 15:45:22 -0400635 */
Tejun Heo750426a2006-11-14 22:37:35 +0900636static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -0400637{
638 struct scsi_cmnd *cmd = qc->scsicmd;
Tejun Heoe61e0672006-05-15 20:57:40 +0900639 struct ata_taskfile *tf = &qc->result_tf;
Jeff Garzikb0955182005-05-12 15:45:22 -0400640 unsigned char *sb = cmd->sense_buffer;
641 unsigned char *desc = sb + 8;
Tejun Heo246619d2006-05-15 20:58:16 +0900642 int verbose = qc->ap->ops->error_handler == NULL;
Jeff Garzikb0955182005-05-12 15:45:22 -0400643
644 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
645
Jeff Garzik0e5dec42005-10-06 09:40:20 -0400646 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
Jeff Garzikb0955182005-05-12 15:45:22 -0400647
648 /*
Jeff Garzikb0955182005-05-12 15:45:22 -0400649 * Use ata_to_sense_error() to map status register bits
650 * onto sense key, asc & ascq.
651 */
Tejun Heo058e55e2006-04-02 18:51:53 +0900652 if (qc->err_mask ||
653 tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
Tejun Heo44877b42007-02-21 01:06:51 +0900654 ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature,
Tejun Heo246619d2006-05-15 20:58:16 +0900655 &sb[1], &sb[2], &sb[3], verbose);
Jeff Garzikb0955182005-05-12 15:45:22 -0400656 sb[1] &= 0x0f;
657 }
658
659 /*
660 * Sense data is current and format is descriptor.
661 */
662 sb[0] = 0x72;
663
664 desc[0] = 0x09;
665
Tejun Heof38621b2006-11-14 22:37:35 +0900666 /* set length of additional sense data */
667 sb[7] = 14;
668 desc[1] = 12;
Jeff Garzikb0955182005-05-12 15:45:22 -0400669
670 /*
671 * Copy registers into sense buffer.
672 */
673 desc[2] = 0x00;
674 desc[3] = tf->feature; /* == error reg */
675 desc[5] = tf->nsect;
676 desc[7] = tf->lbal;
677 desc[9] = tf->lbam;
678 desc[11] = tf->lbah;
679 desc[12] = tf->device;
680 desc[13] = tf->command; /* == status reg */
681
682 /*
683 * Fill in Extend bit, and the high order bytes
684 * if applicable.
685 */
686 if (tf->flags & ATA_TFLAG_LBA48) {
687 desc[2] |= 0x01;
688 desc[4] = tf->hob_nsect;
689 desc[6] = tf->hob_lbal;
690 desc[8] = tf->hob_lbam;
691 desc[10] = tf->hob_lbah;
692 }
693}
694
695/**
Tejun Heo750426a2006-11-14 22:37:35 +0900696 * ata_gen_ata_sense - generate a SCSI fixed sense block
Jeff Garzikb0955182005-05-12 15:45:22 -0400697 * @qc: Command that we are erroring out
698 *
Tejun Heod25614b2006-11-14 22:37:35 +0900699 * Generate sense block for a failed ATA command @qc. Descriptor
700 * format is used to accomodate LBA48 block address.
Jeff Garzikb0955182005-05-12 15:45:22 -0400701 *
702 * LOCKING:
Tejun Heo750426a2006-11-14 22:37:35 +0900703 * None.
Jeff Garzikb0955182005-05-12 15:45:22 -0400704 */
Tejun Heo750426a2006-11-14 22:37:35 +0900705static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -0400706{
Tejun Heod25614b2006-11-14 22:37:35 +0900707 struct ata_device *dev = qc->dev;
Jeff Garzikb0955182005-05-12 15:45:22 -0400708 struct scsi_cmnd *cmd = qc->scsicmd;
Tejun Heoe61e0672006-05-15 20:57:40 +0900709 struct ata_taskfile *tf = &qc->result_tf;
Jeff Garzikb0955182005-05-12 15:45:22 -0400710 unsigned char *sb = cmd->sense_buffer;
Tejun Heod25614b2006-11-14 22:37:35 +0900711 unsigned char *desc = sb + 8;
Tejun Heo246619d2006-05-15 20:58:16 +0900712 int verbose = qc->ap->ops->error_handler == NULL;
Tejun Heod25614b2006-11-14 22:37:35 +0900713 u64 block;
Jeff Garzikb0955182005-05-12 15:45:22 -0400714
715 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
716
Jeff Garzik0e5dec42005-10-06 09:40:20 -0400717 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
Jeff Garzikb0955182005-05-12 15:45:22 -0400718
Tejun Heod25614b2006-11-14 22:37:35 +0900719 /* sense data is current and format is descriptor */
720 sb[0] = 0x72;
721
722 /* Use ata_to_sense_error() to map status register bits
Jeff Garzikb0955182005-05-12 15:45:22 -0400723 * onto sense key, asc & ascq.
724 */
Tejun Heo058e55e2006-04-02 18:51:53 +0900725 if (qc->err_mask ||
726 tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) {
Tejun Heo44877b42007-02-21 01:06:51 +0900727 ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature,
Tejun Heod25614b2006-11-14 22:37:35 +0900728 &sb[1], &sb[2], &sb[3], verbose);
729 sb[1] &= 0x0f;
Jeff Garzikb0955182005-05-12 15:45:22 -0400730 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731
Tejun Heod25614b2006-11-14 22:37:35 +0900732 block = ata_tf_read_block(&qc->result_tf, dev);
Jeff Garzik0274aa22005-06-22 13:50:56 -0400733
Tejun Heod25614b2006-11-14 22:37:35 +0900734 /* information sense data descriptor */
735 sb[7] = 12;
736 desc[0] = 0x00;
737 desc[1] = 10;
Jeff Garzika7dac442005-10-30 04:44:42 -0500738
Tejun Heod25614b2006-11-14 22:37:35 +0900739 desc[2] |= 0x80; /* valid */
740 desc[6] = block >> 40;
741 desc[7] = block >> 32;
742 desc[8] = block >> 24;
743 desc[9] = block >> 16;
744 desc[10] = block >> 8;
745 desc[11] = block;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746}
747
Brian Kinga6cce2a2006-03-17 17:04:15 -0600748static void ata_scsi_sdev_config(struct scsi_device *sdev)
749{
750 sdev->use_10_for_rw = 1;
751 sdev->use_10_for_ms = 1;
Tejun Heo31cc23b2007-09-23 13:14:12 +0900752
753 /* Schedule policy is determined by ->qc_defer() callback and
754 * it needs to see every deferred qc. Set dev_blocked to 1 to
755 * prevent SCSI midlayer from automatically deferring
756 * requests.
757 */
758 sdev->max_device_blocked = 1;
Brian Kinga6cce2a2006-03-17 17:04:15 -0600759}
760
761static void ata_scsi_dev_config(struct scsi_device *sdev,
762 struct ata_device *dev)
763{
Tejun Heo914ed352006-11-01 18:39:55 +0900764 /* configure max sectors */
765 blk_queue_max_sectors(sdev->request_queue, dev->max_sectors);
Brian Kinga6cce2a2006-03-17 17:04:15 -0600766
Tejun Heo914ed352006-11-01 18:39:55 +0900767 /* SATA DMA transfers must be multiples of 4 byte, so
Brian Kinga6cce2a2006-03-17 17:04:15 -0600768 * we need to pad ATAPI transfers using an extra sg.
769 * Decrement max hw segments accordingly.
770 */
771 if (dev->class == ATA_DEV_ATAPI) {
Jens Axboe165125e2007-07-24 09:28:11 +0200772 struct request_queue *q = sdev->request_queue;
Brian Kinga6cce2a2006-03-17 17:04:15 -0600773 blk_queue_max_hw_segments(q, q->max_hw_segments - 1);
774 }
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900775
776 if (dev->flags & ATA_DFLAG_NCQ) {
777 int depth;
778
779 depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id));
780 depth = min(ATA_MAX_QUEUE - 1, depth);
781 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth);
782 }
Brian Kinga6cce2a2006-03-17 17:04:15 -0600783}
784
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785/**
786 * ata_scsi_slave_config - Set SCSI device attributes
787 * @sdev: SCSI device to examine
788 *
789 * This is called before we actually start reading
790 * and writing to the device, to configure certain
791 * SCSI mid-layer behaviors.
792 *
793 * LOCKING:
794 * Defined by SCSI layer. We don't really care.
795 */
796
797int ata_scsi_slave_config(struct scsi_device *sdev)
798{
Tejun Heo31534362006-05-31 18:27:36 +0900799 struct ata_port *ap = ata_shost_to_port(sdev->host);
800 struct ata_device *dev = __ata_scsi_find_dev(ap, sdev);
801
Brian Kinga6cce2a2006-03-17 17:04:15 -0600802 ata_scsi_sdev_config(sdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
804 blk_queue_max_phys_segments(sdev->request_queue, LIBATA_MAX_PRD);
805
Tejun Heo9666f402007-05-04 21:27:47 +0200806 sdev->manage_start_stop = 1;
807
Tejun Heo31534362006-05-31 18:27:36 +0900808 if (dev)
Brian Kinga6cce2a2006-03-17 17:04:15 -0600809 ata_scsi_dev_config(sdev, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810
811 return 0; /* scsi layer doesn't check return value, sigh */
812}
813
814/**
Tejun Heo83c47bc2006-05-31 18:28:07 +0900815 * ata_scsi_slave_destroy - SCSI device is about to be destroyed
816 * @sdev: SCSI device to be destroyed
817 *
818 * @sdev is about to be destroyed for hot/warm unplugging. If
819 * this unplugging was initiated by libata as indicated by NULL
820 * dev->sdev, this function doesn't have to do anything.
821 * Otherwise, SCSI layer initiated warm-unplug is in progress.
822 * Clear dev->sdev, schedule the device for ATA detach and invoke
823 * EH.
824 *
825 * LOCKING:
826 * Defined by SCSI layer. We don't really care.
827 */
828void ata_scsi_slave_destroy(struct scsi_device *sdev)
829{
830 struct ata_port *ap = ata_shost_to_port(sdev->host);
831 unsigned long flags;
832 struct ata_device *dev;
833
834 if (!ap->ops->error_handler)
835 return;
836
Jeff Garzikba6a1302006-06-22 23:46:10 -0400837 spin_lock_irqsave(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +0900838 dev = __ata_scsi_find_dev(ap, sdev);
839 if (dev && dev->sdev) {
840 /* SCSI device already in CANCEL state, no need to offline it */
841 dev->sdev = NULL;
842 dev->flags |= ATA_DFLAG_DETACH;
843 ata_port_schedule_eh(ap);
844 }
Jeff Garzikba6a1302006-06-22 23:46:10 -0400845 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +0900846}
847
848/**
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900849 * ata_scsi_change_queue_depth - SCSI callback for queue depth config
850 * @sdev: SCSI device to configure queue depth for
851 * @queue_depth: new queue depth
852 *
853 * This is libata standard hostt->change_queue_depth callback.
854 * SCSI will call into this callback when user tries to set queue
855 * depth via sysfs.
856 *
857 * LOCKING:
858 * SCSI layer (we don't care)
859 *
860 * RETURNS:
861 * Newly configured queue depth.
862 */
863int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
864{
865 struct ata_port *ap = ata_shost_to_port(sdev->host);
866 struct ata_device *dev;
Tejun Heo360f6542006-09-30 19:45:00 +0900867 unsigned long flags;
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900868
Tejun Heoc3c70c42007-02-20 23:31:22 +0900869 if (queue_depth < 1 || queue_depth == sdev->queue_depth)
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900870 return sdev->queue_depth;
871
872 dev = ata_scsi_find_dev(ap, sdev);
873 if (!dev || !ata_dev_enabled(dev))
874 return sdev->queue_depth;
875
Tejun Heoc3c70c42007-02-20 23:31:22 +0900876 /* NCQ enabled? */
Tejun Heo360f6542006-09-30 19:45:00 +0900877 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc3c70c42007-02-20 23:31:22 +0900878 dev->flags &= ~ATA_DFLAG_NCQ_OFF;
879 if (queue_depth == 1 || !ata_ncq_enabled(dev)) {
Tejun Heo360f6542006-09-30 19:45:00 +0900880 dev->flags |= ATA_DFLAG_NCQ_OFF;
Tejun Heoc3c70c42007-02-20 23:31:22 +0900881 queue_depth = 1;
882 }
Tejun Heo360f6542006-09-30 19:45:00 +0900883 spin_unlock_irqrestore(ap->lock, flags);
884
Tejun Heoc3c70c42007-02-20 23:31:22 +0900885 /* limit and apply queue depth */
886 queue_depth = min(queue_depth, sdev->host->can_queue);
887 queue_depth = min(queue_depth, ata_id_queue_depth(dev->id));
888 queue_depth = min(queue_depth, ATA_MAX_QUEUE - 1);
889
890 if (sdev->queue_depth == queue_depth)
891 return -EINVAL;
892
893 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth);
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900894 return queue_depth;
895}
896
Tejun Heod9aca222007-05-17 16:43:26 +0200897/* XXX: for spindown warning */
Tejun Heoda071b42007-05-14 17:26:18 +0200898static void ata_delayed_done_timerfn(unsigned long arg)
899{
900 struct scsi_cmnd *scmd = (void *)arg;
901
902 scmd->scsi_done(scmd);
903}
904
Tejun Heod9aca222007-05-17 16:43:26 +0200905/* XXX: for spindown warning */
Tejun Heoda071b42007-05-14 17:26:18 +0200906static void ata_delayed_done(struct scsi_cmnd *scmd)
907{
908 static struct timer_list timer;
909
910 setup_timer(&timer, ata_delayed_done_timerfn, (unsigned long)scmd);
911 mod_timer(&timer, jiffies + 5 * HZ);
912}
913
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900914/**
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400915 * ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
916 * @qc: Storage for translated ATA taskfile
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400917 *
918 * Sets up an ATA taskfile to issue STANDBY (to stop) or READ VERIFY
919 * (to start). Perhaps these commands should be preceded by
920 * CHECK POWER MODE to see what power mode the device is already in.
921 * [See SAT revision 5 at www.t10.org]
922 *
923 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400924 * spin_lock_irqsave(host lock)
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400925 *
926 * RETURNS:
927 * Zero on success, non-zero on error.
928 */
Tejun Heoad706992006-12-17 10:45:57 +0900929static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400930{
Tejun Heo542b1442006-12-17 10:45:08 +0900931 struct scsi_cmnd *scmd = qc->scsicmd;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400932 struct ata_taskfile *tf = &qc->tf;
Tejun Heoad706992006-12-17 10:45:57 +0900933 const u8 *cdb = scmd->cmnd;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400934
Tejun Heo2e5704f2006-12-17 10:46:33 +0900935 if (scmd->cmd_len < 5)
936 goto invalid_fld;
937
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400938 tf->flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
939 tf->protocol = ATA_PROT_NODATA;
Tejun Heo542b1442006-12-17 10:45:08 +0900940 if (cdb[1] & 0x1) {
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400941 ; /* ignore IMMED bit, violates sat-r05 */
942 }
Tejun Heo542b1442006-12-17 10:45:08 +0900943 if (cdb[4] & 0x2)
Douglas Gilbertae006512005-10-09 09:09:35 -0400944 goto invalid_fld; /* LOEJ bit set not supported */
Tejun Heo542b1442006-12-17 10:45:08 +0900945 if (((cdb[4] >> 4) & 0xf) != 0)
Douglas Gilbertae006512005-10-09 09:09:35 -0400946 goto invalid_fld; /* power conditions not supported */
Tejun Heoe31e8532007-09-23 13:14:13 +0900947
948 if (qc->dev->horkage & ATA_HORKAGE_SKIP_PM) {
949 /* the device lacks PM support, finish without doing anything */
950 scmd->result = SAM_STAT_GOOD;
951 return 1;
952 }
953
Tejun Heo542b1442006-12-17 10:45:08 +0900954 if (cdb[4] & 0x1) {
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400955 tf->nsect = 1; /* 1 sector, lba=0 */
Albert Lee9d5b1302005-10-04 08:48:17 -0400956
957 if (qc->dev->flags & ATA_DFLAG_LBA) {
Tejun Heoc44078c2006-05-15 20:57:21 +0900958 tf->flags |= ATA_TFLAG_LBA;
Albert Lee9d5b1302005-10-04 08:48:17 -0400959
960 tf->lbah = 0x0;
961 tf->lbam = 0x0;
962 tf->lbal = 0x0;
963 tf->device |= ATA_LBA;
964 } else {
965 /* CHS */
966 tf->lbal = 0x1; /* sect */
967 tf->lbam = 0x0; /* cyl low */
968 tf->lbah = 0x0; /* cyl high */
969 }
970
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400971 tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
Tejun Heo920a4b12007-05-04 21:28:48 +0200972 } else {
973 /* XXX: This is for backward compatibility, will be
974 * removed. Read Documentation/feature-removal-schedule.txt
975 * for more info.
976 */
Tejun Heod9aca222007-05-17 16:43:26 +0200977 if ((qc->dev->flags & ATA_DFLAG_SPUNDOWN) &&
Tejun Heo920a4b12007-05-04 21:28:48 +0200978 (system_state == SYSTEM_HALT ||
979 system_state == SYSTEM_POWER_OFF)) {
Tejun Heoda071b42007-05-14 17:26:18 +0200980 static unsigned long warned = 0;
Tejun Heo920a4b12007-05-04 21:28:48 +0200981
Tejun Heoda071b42007-05-14 17:26:18 +0200982 if (!test_and_set_bit(0, &warned)) {
Tejun Heo920a4b12007-05-04 21:28:48 +0200983 ata_dev_printk(qc->dev, KERN_WARNING,
984 "DISK MIGHT NOT BE SPUN DOWN PROPERLY. "
985 "UPDATE SHUTDOWN UTILITY\n");
986 ata_dev_printk(qc->dev, KERN_WARNING,
987 "For more info, visit "
988 "http://linux-ata.org/shutdown.html\n");
Tejun Heoda071b42007-05-14 17:26:18 +0200989
990 /* ->scsi_done is not used, use it for
991 * delayed completion.
992 */
993 scmd->scsi_done = qc->scsidone;
994 qc->scsidone = ata_delayed_done;
Tejun Heo920a4b12007-05-04 21:28:48 +0200995 }
996 scmd->result = SAM_STAT_GOOD;
997 return 1;
998 }
999
Robert Hancock78981a72007-01-30 00:59:18 -08001000 /* Issue ATA STANDBY IMMEDIATE command */
1001 tf->command = ATA_CMD_STANDBYNOW1;
Tejun Heo920a4b12007-05-04 21:28:48 +02001002 }
Robert Hancock78981a72007-01-30 00:59:18 -08001003
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001004 /*
1005 * Standby and Idle condition timers could be implemented but that
1006 * would require libata to implement the Power condition mode page
1007 * and allow the user to change it. Changing mode pages requires
1008 * MODE SELECT to be implemented.
1009 */
1010
1011 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001012
1013invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001014 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001015 /* "Invalid field in cbd" */
1016 return 1;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001017}
1018
1019
1020/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021 * ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command
1022 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023 *
1024 * Sets up an ATA taskfile to issue FLUSH CACHE or
1025 * FLUSH CACHE EXT.
1026 *
1027 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001028 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 *
1030 * RETURNS:
1031 * Zero on success, non-zero on error.
1032 */
Tejun Heoad706992006-12-17 10:45:57 +09001033static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034{
1035 struct ata_taskfile *tf = &qc->tf;
1036
1037 tf->flags |= ATA_TFLAG_DEVICE;
1038 tf->protocol = ATA_PROT_NODATA;
1039
Tejun Heo6fc49ad2006-11-11 20:10:45 +09001040 if (qc->dev->flags & ATA_DFLAG_FLUSH_EXT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001041 tf->command = ATA_CMD_FLUSH_EXT;
1042 else
1043 tf->command = ATA_CMD_FLUSH;
1044
1045 return 0;
1046}
1047
1048/**
Albert Lee3aef5232005-10-04 08:47:43 -04001049 * scsi_6_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001050 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001051 *
1052 * Calculate LBA and transfer length for 6-byte commands.
1053 *
1054 * RETURNS:
1055 * @plba: the LBA
1056 * @plen: the transfer length
1057 */
Tejun Heo542b1442006-12-17 10:45:08 +09001058static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001059{
1060 u64 lba = 0;
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001061 u32 len;
Albert Lee3aef5232005-10-04 08:47:43 -04001062
1063 VPRINTK("six-byte command\n");
1064
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001065 lba |= ((u64)(cdb[1] & 0x1f)) << 16;
Tejun Heo542b1442006-12-17 10:45:08 +09001066 lba |= ((u64)cdb[2]) << 8;
1067 lba |= ((u64)cdb[3]);
Albert Lee3aef5232005-10-04 08:47:43 -04001068
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001069 len = cdb[4];
Albert Lee3aef5232005-10-04 08:47:43 -04001070
1071 *plba = lba;
1072 *plen = len;
1073}
1074
1075/**
1076 * scsi_10_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001077 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001078 *
1079 * Calculate LBA and transfer length for 10-byte commands.
1080 *
1081 * RETURNS:
1082 * @plba: the LBA
1083 * @plen: the transfer length
1084 */
Tejun Heo542b1442006-12-17 10:45:08 +09001085static void scsi_10_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001086{
1087 u64 lba = 0;
1088 u32 len = 0;
1089
1090 VPRINTK("ten-byte command\n");
1091
Tejun Heo542b1442006-12-17 10:45:08 +09001092 lba |= ((u64)cdb[2]) << 24;
1093 lba |= ((u64)cdb[3]) << 16;
1094 lba |= ((u64)cdb[4]) << 8;
1095 lba |= ((u64)cdb[5]);
Albert Lee3aef5232005-10-04 08:47:43 -04001096
Tejun Heo542b1442006-12-17 10:45:08 +09001097 len |= ((u32)cdb[7]) << 8;
1098 len |= ((u32)cdb[8]);
Albert Lee3aef5232005-10-04 08:47:43 -04001099
1100 *plba = lba;
1101 *plen = len;
1102}
1103
1104/**
1105 * scsi_16_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001106 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001107 *
1108 * Calculate LBA and transfer length for 16-byte commands.
1109 *
1110 * RETURNS:
1111 * @plba: the LBA
1112 * @plen: the transfer length
1113 */
Tejun Heo542b1442006-12-17 10:45:08 +09001114static void scsi_16_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001115{
1116 u64 lba = 0;
1117 u32 len = 0;
1118
1119 VPRINTK("sixteen-byte command\n");
1120
Tejun Heo542b1442006-12-17 10:45:08 +09001121 lba |= ((u64)cdb[2]) << 56;
1122 lba |= ((u64)cdb[3]) << 48;
1123 lba |= ((u64)cdb[4]) << 40;
1124 lba |= ((u64)cdb[5]) << 32;
1125 lba |= ((u64)cdb[6]) << 24;
1126 lba |= ((u64)cdb[7]) << 16;
1127 lba |= ((u64)cdb[8]) << 8;
1128 lba |= ((u64)cdb[9]);
Albert Lee3aef5232005-10-04 08:47:43 -04001129
Tejun Heo542b1442006-12-17 10:45:08 +09001130 len |= ((u32)cdb[10]) << 24;
1131 len |= ((u32)cdb[11]) << 16;
1132 len |= ((u32)cdb[12]) << 8;
1133 len |= ((u32)cdb[13]);
Albert Lee3aef5232005-10-04 08:47:43 -04001134
1135 *plba = lba;
1136 *plen = len;
1137}
1138
1139/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 * ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one
1141 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 *
1143 * Converts SCSI VERIFY command to an ATA READ VERIFY command.
1144 *
1145 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001146 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147 *
1148 * RETURNS:
1149 * Zero on success, non-zero on error.
1150 */
Tejun Heoad706992006-12-17 10:45:57 +09001151static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152{
Tejun Heo542b1442006-12-17 10:45:08 +09001153 struct scsi_cmnd *scmd = qc->scsicmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 struct ata_taskfile *tf = &qc->tf;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001155 struct ata_device *dev = qc->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 u64 dev_sectors = qc->dev->n_sectors;
Tejun Heoad706992006-12-17 10:45:57 +09001157 const u8 *cdb = scmd->cmnd;
Albert Lee3aef5232005-10-04 08:47:43 -04001158 u64 block;
1159 u32 n_block;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160
1161 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
1162 tf->protocol = ATA_PROT_NODATA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
Tejun Heo2e5704f2006-12-17 10:46:33 +09001164 if (cdb[0] == VERIFY) {
1165 if (scmd->cmd_len < 10)
1166 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001167 scsi_10_lba_len(cdb, &block, &n_block);
Tejun Heo2e5704f2006-12-17 10:46:33 +09001168 } else if (cdb[0] == VERIFY_16) {
1169 if (scmd->cmd_len < 16)
1170 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001171 scsi_16_lba_len(cdb, &block, &n_block);
Tejun Heo2e5704f2006-12-17 10:46:33 +09001172 } else
Douglas Gilbertae006512005-10-09 09:09:35 -04001173 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174
Albert Lee8bf62ece2005-05-12 15:29:42 -04001175 if (!n_block)
Douglas Gilbertae006512005-10-09 09:09:35 -04001176 goto nothing_to_do;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001177 if (block >= dev_sectors)
Douglas Gilbertae006512005-10-09 09:09:35 -04001178 goto out_of_range;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001179 if ((block + n_block) > dev_sectors)
Douglas Gilbertae006512005-10-09 09:09:35 -04001180 goto out_of_range;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181
Albert Lee07506692005-10-12 15:04:18 +08001182 if (dev->flags & ATA_DFLAG_LBA) {
1183 tf->flags |= ATA_TFLAG_LBA;
1184
Albert Leec6a33e22005-10-12 15:12:26 +08001185 if (lba_28_ok(block, n_block)) {
1186 /* use LBA28 */
1187 tf->command = ATA_CMD_VERIFY;
1188 tf->device |= (block >> 24) & 0xf;
1189 } else if (lba_48_ok(block, n_block)) {
1190 if (!(dev->flags & ATA_DFLAG_LBA48))
1191 goto out_of_range;
Albert Lee07506692005-10-12 15:04:18 +08001192
1193 /* use LBA48 */
1194 tf->flags |= ATA_TFLAG_LBA48;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001195 tf->command = ATA_CMD_VERIFY_EXT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196
Albert Lee8bf62ece2005-05-12 15:29:42 -04001197 tf->hob_nsect = (n_block >> 8) & 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198
Albert Lee8bf62ece2005-05-12 15:29:42 -04001199 tf->hob_lbah = (block >> 40) & 0xff;
1200 tf->hob_lbam = (block >> 32) & 0xff;
1201 tf->hob_lbal = (block >> 24) & 0xff;
Albert Leec6a33e22005-10-12 15:12:26 +08001202 } else
1203 /* request too large even for LBA48 */
1204 goto out_of_range;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001205
1206 tf->nsect = n_block & 0xff;
1207
1208 tf->lbah = (block >> 16) & 0xff;
1209 tf->lbam = (block >> 8) & 0xff;
1210 tf->lbal = block & 0xff;
1211
1212 tf->device |= ATA_LBA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 } else {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001214 /* CHS */
1215 u32 sect, head, cyl, track;
1216
Albert Leec6a33e22005-10-12 15:12:26 +08001217 if (!lba_28_ok(block, n_block))
1218 goto out_of_range;
Albert Lee07506692005-10-12 15:04:18 +08001219
Albert Lee8bf62ece2005-05-12 15:29:42 -04001220 /* Convert LBA to CHS */
1221 track = (u32)block / dev->sectors;
1222 cyl = track / dev->heads;
1223 head = track % dev->heads;
1224 sect = (u32)block % dev->sectors + 1;
1225
Albert Leec187c4b2005-10-04 08:46:51 -04001226 DPRINTK("block %u track %u cyl %u head %u sect %u\n",
1227 (u32)block, track, cyl, head, sect);
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001228
1229 /* Check whether the converted CHS can fit.
1230 Cylinder: 0-65535
Albert Lee8bf62ece2005-05-12 15:29:42 -04001231 Head: 0-15
1232 Sector: 1-255*/
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001233 if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect))
Douglas Gilbertae006512005-10-09 09:09:35 -04001234 goto out_of_range;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001235
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236 tf->command = ATA_CMD_VERIFY;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001237 tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */
1238 tf->lbal = sect;
1239 tf->lbam = cyl;
1240 tf->lbah = cyl >> 8;
1241 tf->device |= head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242 }
1243
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001245
1246invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001247 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001248 /* "Invalid field in cbd" */
1249 return 1;
1250
1251out_of_range:
Tejun Heo542b1442006-12-17 10:45:08 +09001252 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001253 /* "Logical Block Address out of range" */
1254 return 1;
1255
1256nothing_to_do:
Tejun Heo542b1442006-12-17 10:45:08 +09001257 scmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001258 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259}
1260
1261/**
1262 * ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
1263 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264 *
1265 * Converts any of six SCSI read/write commands into the
1266 * ATA counterpart, including starting sector (LBA),
1267 * sector count, and taking into account the device's LBA48
1268 * support.
1269 *
1270 * Commands %READ_6, %READ_10, %READ_16, %WRITE_6, %WRITE_10, and
1271 * %WRITE_16 are currently supported.
1272 *
1273 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001274 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275 *
1276 * RETURNS:
1277 * Zero on success, non-zero on error.
1278 */
Tejun Heoad706992006-12-17 10:45:57 +09001279static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280{
Tejun Heo542b1442006-12-17 10:45:08 +09001281 struct scsi_cmnd *scmd = qc->scsicmd;
Tejun Heoad706992006-12-17 10:45:57 +09001282 const u8 *cdb = scmd->cmnd;
Tejun Heobd056d72006-11-14 22:47:10 +09001283 unsigned int tf_flags = 0;
Albert Lee3aef5232005-10-04 08:47:43 -04001284 u64 block;
1285 u32 n_block;
Tejun Heobd056d72006-11-14 22:47:10 +09001286 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287
Tejun Heo542b1442006-12-17 10:45:08 +09001288 if (cdb[0] == WRITE_10 || cdb[0] == WRITE_6 || cdb[0] == WRITE_16)
Tejun Heobd056d72006-11-14 22:47:10 +09001289 tf_flags |= ATA_TFLAG_WRITE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290
Tejun Heo9a3dccc2006-01-06 09:56:18 +01001291 /* Calculate the SCSI LBA, transfer length and FUA. */
Tejun Heo542b1442006-12-17 10:45:08 +09001292 switch (cdb[0]) {
Albert Lee3aef5232005-10-04 08:47:43 -04001293 case READ_10:
1294 case WRITE_10:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001295 if (unlikely(scmd->cmd_len < 10))
1296 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001297 scsi_10_lba_len(cdb, &block, &n_block);
1298 if (unlikely(cdb[1] & (1 << 3)))
Tejun Heobd056d72006-11-14 22:47:10 +09001299 tf_flags |= ATA_TFLAG_FUA;
Albert Lee3aef5232005-10-04 08:47:43 -04001300 break;
1301 case READ_6:
1302 case WRITE_6:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001303 if (unlikely(scmd->cmd_len < 6))
1304 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001305 scsi_6_lba_len(cdb, &block, &n_block);
Albert Leec187c4b2005-10-04 08:46:51 -04001306
1307 /* for 6-byte r/w commands, transfer length 0
1308 * means 256 blocks of data, not 0 block.
1309 */
Jeff Garzik76b2bf92005-08-29 19:24:43 -04001310 if (!n_block)
1311 n_block = 256;
Albert Lee3aef5232005-10-04 08:47:43 -04001312 break;
1313 case READ_16:
1314 case WRITE_16:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001315 if (unlikely(scmd->cmd_len < 16))
1316 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001317 scsi_16_lba_len(cdb, &block, &n_block);
1318 if (unlikely(cdb[1] & (1 << 3)))
Tejun Heobd056d72006-11-14 22:47:10 +09001319 tf_flags |= ATA_TFLAG_FUA;
Albert Lee3aef5232005-10-04 08:47:43 -04001320 break;
1321 default:
Albert Lee8bf62ece2005-05-12 15:29:42 -04001322 DPRINTK("no-byte command\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04001323 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 }
1325
Albert Lee8bf62ece2005-05-12 15:29:42 -04001326 /* Check and compose ATA command */
1327 if (!n_block)
Albert Leec187c4b2005-10-04 08:46:51 -04001328 /* For 10-byte and 16-byte SCSI R/W commands, transfer
1329 * length 0 means transfer 0 block of data.
1330 * However, for ATA R/W commands, sector count 0 means
1331 * 256 or 65536 sectors, not 0 sectors as in SCSI.
Alan Coxf51750d2005-11-07 17:06:33 +00001332 *
1333 * WARNING: one or two older ATA drives treat 0 as 0...
Albert Leec187c4b2005-10-04 08:46:51 -04001334 */
Douglas Gilbertae006512005-10-09 09:09:35 -04001335 goto nothing_to_do;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001336
Tejun Heobd056d72006-11-14 22:47:10 +09001337 qc->flags |= ATA_QCFLAG_IO;
Tejun Heo726f0782007-01-03 17:30:39 +09001338 qc->nbytes = n_block * ATA_SECT_SIZE;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001339
Tejun Heobd056d72006-11-14 22:47:10 +09001340 rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
1341 qc->tag);
1342 if (likely(rc == 0))
1343 return 0;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001344
Tejun Heobd056d72006-11-14 22:47:10 +09001345 if (rc == -ERANGE)
1346 goto out_of_range;
1347 /* treat all other errors as -EINVAL, fall through */
Douglas Gilbertae006512005-10-09 09:09:35 -04001348invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001349 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001350 /* "Invalid field in cbd" */
1351 return 1;
1352
1353out_of_range:
Tejun Heo542b1442006-12-17 10:45:08 +09001354 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001355 /* "Logical Block Address out of range" */
1356 return 1;
1357
1358nothing_to_do:
Tejun Heo542b1442006-12-17 10:45:08 +09001359 scmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001360 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361}
1362
Tejun Heo77853bf2006-01-23 13:09:36 +09001363static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364{
Tejun Heoc31f5712006-11-22 12:39:43 +09001365 struct ata_port *ap = qc->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzika7dac442005-10-30 04:44:42 -05001367 u8 *cdb = cmd->cmnd;
Albert Leea22e2eb2005-12-05 15:38:02 +08001368 int need_sense = (qc->err_mask != 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369
zhao, forrest3057ac32006-06-12 12:01:34 +08001370 /* We snoop the SET_FEATURES - Write Cache ON/OFF command, and
1371 * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE
1372 * cache
1373 */
Albert Lee2c3d2a42007-06-07 16:01:17 +08001374 if (ap->ops->error_handler && !need_sense) {
1375 switch (qc->tf.command) {
1376 case ATA_CMD_SET_FEATURES:
1377 if ((qc->tf.feature == SETFEATURES_WC_ON) ||
1378 (qc->tf.feature == SETFEATURES_WC_OFF)) {
Tejun Heo9af5c9c2007-08-06 18:36:22 +09001379 ap->link.eh_info.action |= ATA_EH_REVALIDATE;
Albert Lee2c3d2a42007-06-07 16:01:17 +08001380 ata_port_schedule_eh(ap);
1381 }
1382 break;
1383
1384 case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
1385 case ATA_CMD_SET_MULTI: /* multi_count changed */
Tejun Heo9af5c9c2007-08-06 18:36:22 +09001386 ap->link.eh_info.action |= ATA_EH_REVALIDATE;
Albert Lee2c3d2a42007-06-07 16:01:17 +08001387 ata_port_schedule_eh(ap);
1388 break;
1389 }
zhao, forrest3057ac32006-06-12 12:01:34 +08001390 }
1391
Jeff Garzikb0955182005-05-12 15:45:22 -04001392 /* For ATA pass thru (SAT) commands, generate a sense block if
1393 * user mandated it or if there's an error. Note that if we
1394 * generate because the user forced us to, a check condition
1395 * is generated and the ATA register values are returned
1396 * whether the command completed successfully or not. If there
1397 * was no error, SK, ASC and ASCQ will all be zero.
1398 */
Jeff Garzika7dac442005-10-30 04:44:42 -05001399 if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
1400 ((cdb[2] & 0x20) || need_sense)) {
Tejun Heo750426a2006-11-14 22:37:35 +09001401 ata_gen_passthru_sense(qc);
Jeff Garzikb0955182005-05-12 15:45:22 -04001402 } else {
1403 if (!need_sense) {
1404 cmd->result = SAM_STAT_GOOD;
1405 } else {
1406 /* TODO: decide which descriptor format to use
1407 * for 48b LBA devices and call that here
1408 * instead of the fixed desc, which is only
1409 * good for smaller LBA (and maybe CHS?)
1410 * devices.
1411 */
Tejun Heo750426a2006-11-14 22:37:35 +09001412 ata_gen_ata_sense(qc);
Jeff Garzikb0955182005-05-12 15:45:22 -04001413 }
1414 }
1415
Tejun Heod9aca222007-05-17 16:43:26 +02001416 /* XXX: track spindown state for spindown skipping and warning */
Tejun Heo13b8d092007-05-15 12:29:22 +02001417 if (unlikely(qc->tf.command == ATA_CMD_STANDBY ||
1418 qc->tf.command == ATA_CMD_STANDBYNOW1))
1419 qc->dev->flags |= ATA_DFLAG_SPUNDOWN;
1420 else if (likely(system_state != SYSTEM_HALT &&
1421 system_state != SYSTEM_POWER_OFF))
1422 qc->dev->flags &= ~ATA_DFLAG_SPUNDOWN;
1423
Tejun Heoc31f5712006-11-22 12:39:43 +09001424 if (need_sense && !ap->ops->error_handler)
Tejun Heo44877b42007-02-21 01:06:51 +09001425 ata_dump_status(ap->print_id, &qc->result_tf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426
1427 qc->scsidone(cmd);
1428
Tejun Heo77853bf2006-01-23 13:09:36 +09001429 ata_qc_free(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430}
1431
1432/**
1433 * ata_scsi_translate - Translate then issue SCSI command to ATA device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434 * @dev: ATA device to which the command is addressed
1435 * @cmd: SCSI command to execute
1436 * @done: SCSI command completion function
1437 * @xlat_func: Actor which translates @cmd to an ATA taskfile
1438 *
1439 * Our ->queuecommand() function has decided that the SCSI
1440 * command issued can be directly translated into an ATA
1441 * command, rather than handled internally.
1442 *
1443 * This function sets up an ata_queued_cmd structure for the
1444 * SCSI command, and sends that ata_queued_cmd to the hardware.
1445 *
Douglas Gilbertae006512005-10-09 09:09:35 -04001446 * The xlat_func argument (actor) returns 0 if ready to execute
1447 * ATA command, else 1 to finish translation. If 1 is returned
1448 * then cmd->result (and possibly cmd->sense_buffer) are assumed
1449 * to be set reflecting an error condition or clean (early)
1450 * termination.
1451 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001453 * spin_lock_irqsave(host lock)
Tejun Heo2115ea92006-05-15 21:03:39 +09001454 *
1455 * RETURNS:
1456 * 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command
1457 * needs to be deferred.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458 */
Tejun Heo2115ea92006-05-15 21:03:39 +09001459static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
1460 void (*done)(struct scsi_cmnd *),
1461 ata_xlat_func_t xlat_func)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462{
Tejun Heo31cc23b2007-09-23 13:14:12 +09001463 struct ata_port *ap = dev->link->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 struct ata_queued_cmd *qc;
Tejun Heo31cc23b2007-09-23 13:14:12 +09001465 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466
1467 VPRINTK("ENTER\n");
1468
Tejun Heo3373efd2006-05-15 20:57:53 +09001469 qc = ata_scsi_qc_new(dev, cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470 if (!qc)
Douglas Gilbertae006512005-10-09 09:09:35 -04001471 goto err_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472
1473 /* data is present; dma-map it */
be7db052005-04-17 15:26:13 -05001474 if (cmd->sc_data_direction == DMA_FROM_DEVICE ||
1475 cmd->sc_data_direction == DMA_TO_DEVICE) {
Boaz Harrosh71201652007-09-18 17:48:50 +02001476 if (unlikely(scsi_bufflen(cmd) < 1)) {
Tejun Heof15a1da2006-05-15 20:57:56 +09001477 ata_dev_printk(dev, KERN_WARNING,
1478 "WARNING: zero len r/w req\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04001479 goto err_did;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480 }
1481
Boaz Harrosh71201652007-09-18 17:48:50 +02001482 ata_sg_init(qc, scsi_sglist(cmd), scsi_sg_count(cmd));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483
1484 qc->dma_dir = cmd->sc_data_direction;
1485 }
1486
1487 qc->complete_fn = ata_scsi_qc_complete;
1488
Tejun Heoad706992006-12-17 10:45:57 +09001489 if (xlat_func(qc))
Douglas Gilbertae006512005-10-09 09:09:35 -04001490 goto early_finish;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491
Tejun Heo31cc23b2007-09-23 13:14:12 +09001492 if (ap->ops->qc_defer) {
1493 if ((rc = ap->ops->qc_defer(qc)))
1494 goto defer;
1495 }
1496
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 /* select device, send command to hardware */
Tejun Heo8e0e6942006-03-31 20:41:11 +09001498 ata_qc_issue(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499
1500 VPRINTK("EXIT\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001501 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502
Douglas Gilbertae006512005-10-09 09:09:35 -04001503early_finish:
1504 ata_qc_free(qc);
Tejun Heoda071b42007-05-14 17:26:18 +02001505 qc->scsidone(cmd);
Douglas Gilbertae006512005-10-09 09:09:35 -04001506 DPRINTK("EXIT - early finish (good or error)\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001507 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001508
1509err_did:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 ata_qc_free(qc);
Douglas Gilbertae006512005-10-09 09:09:35 -04001511 cmd->result = (DID_ERROR << 16);
Tejun Heoda071b42007-05-14 17:26:18 +02001512 qc->scsidone(cmd);
Darrick J. Wong253b92e2006-11-14 09:55:41 -05001513err_mem:
Douglas Gilbertae006512005-10-09 09:09:35 -04001514 DPRINTK("EXIT - internal\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001515 return 0;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001516
1517defer:
Tejun Heo31cc23b2007-09-23 13:14:12 +09001518 ata_qc_free(qc);
Tejun Heo3dc1d882006-05-15 21:03:45 +09001519 DPRINTK("EXIT - defer\n");
Tejun Heo31cc23b2007-09-23 13:14:12 +09001520 if (rc == ATA_DEFER_LINK)
1521 return SCSI_MLQUEUE_DEVICE_BUSY;
1522 else
1523 return SCSI_MLQUEUE_HOST_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524}
1525
1526/**
1527 * ata_scsi_rbuf_get - Map response buffer.
1528 * @cmd: SCSI command containing buffer to be mapped.
1529 * @buf_out: Pointer to mapped area.
1530 *
1531 * Maps buffer contained within SCSI command @cmd.
1532 *
1533 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001534 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 *
1536 * RETURNS:
1537 * Length of response buffer.
1538 */
1539
1540static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
1541{
1542 u8 *buf;
1543 unsigned int buflen;
1544
Boaz Harrosh71201652007-09-18 17:48:50 +02001545 struct scatterlist *sg = scsi_sglist(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001547 if (sg) {
Jeff Garzikda02d2a2006-12-11 11:05:53 -05001548 buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549 buflen = sg->length;
1550 } else {
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001551 buf = NULL;
1552 buflen = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001553 }
1554
1555 *buf_out = buf;
1556 return buflen;
1557}
1558
1559/**
1560 * ata_scsi_rbuf_put - Unmap response buffer.
1561 * @cmd: SCSI command containing buffer to be unmapped.
1562 * @buf: buffer to unmap
1563 *
1564 * Unmaps response buffer contained within @cmd.
1565 *
1566 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001567 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001568 */
1569
1570static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
1571{
Boaz Harrosh71201652007-09-18 17:48:50 +02001572 struct scatterlist *sg = scsi_sglist(cmd);
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001573 if (sg)
Jeff Garzikda02d2a2006-12-11 11:05:53 -05001574 kunmap_atomic(buf - sg->offset, KM_IRQ0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575}
1576
1577/**
1578 * ata_scsi_rbuf_fill - wrapper for SCSI command simulators
1579 * @args: device IDENTIFY data / SCSI command of interest.
1580 * @actor: Callback hook for desired SCSI command simulator
1581 *
1582 * Takes care of the hard work of simulating a SCSI command...
1583 * Mapping the response buffer, calling the command's handler,
1584 * and handling the handler's return value. This return value
1585 * indicates whether the handler wishes the SCSI command to be
Douglas Gilbertae006512005-10-09 09:09:35 -04001586 * completed successfully (0), or not (in which case cmd->result
1587 * and sense buffer are assumed to be set).
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 *
1589 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001590 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 */
1592
1593void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
1594 unsigned int (*actor) (struct ata_scsi_args *args,
1595 u8 *rbuf, unsigned int buflen))
1596{
1597 u8 *rbuf;
1598 unsigned int buflen, rc;
1599 struct scsi_cmnd *cmd = args->cmd;
1600
1601 buflen = ata_scsi_rbuf_get(cmd, &rbuf);
1602 memset(rbuf, 0, buflen);
1603 rc = actor(args, rbuf, buflen);
1604 ata_scsi_rbuf_put(cmd, rbuf);
1605
Douglas Gilbertae006512005-10-09 09:09:35 -04001606 if (rc == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607 cmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001608 args->done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609}
1610
1611/**
Tejun Heo6a362612006-11-20 11:15:47 +09001612 * ATA_SCSI_RBUF_SET - helper to set values in SCSI response buffer
1613 * @idx: byte index into SCSI response buffer
1614 * @val: value to set
1615 *
1616 * To be used by SCSI command simulator functions. This macros
1617 * expects two local variables, u8 *rbuf and unsigned int buflen,
1618 * are in scope.
1619 *
1620 * LOCKING:
1621 * None.
1622 */
1623#define ATA_SCSI_RBUF_SET(idx, val) do { \
1624 if ((idx) < buflen) rbuf[(idx)] = (u8)(val); \
1625 } while (0)
1626
1627/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 * ata_scsiop_inq_std - Simulate INQUIRY command
1629 * @args: device IDENTIFY data / SCSI command of interest.
1630 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1631 * @buflen: Response buffer length.
1632 *
1633 * Returns standard device identification data associated
Jeff Garzikb142eb62006-03-21 20:37:47 -05001634 * with non-VPD INQUIRY command output.
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
1640unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
1641 unsigned int buflen)
1642{
1643 u8 hdr[] = {
1644 TYPE_DISK,
1645 0,
1646 0x5, /* claim SPC-3 version compatibility */
1647 2,
1648 95 - 4
1649 };
1650
1651 /* set scsi removeable (RMB) bit per ata bit */
1652 if (ata_id_removeable(args->id))
1653 hdr[1] |= (1 << 7);
1654
1655 VPRINTK("ENTER\n");
1656
1657 memcpy(rbuf, hdr, sizeof(hdr));
1658
1659 if (buflen > 35) {
1660 memcpy(&rbuf[8], "ATA ", 8);
Tejun Heoa0cf7332007-01-02 20:18:49 +09001661 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
1662 ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 if (rbuf[32] == 0 || rbuf[32] == ' ')
1664 memcpy(&rbuf[32], "n/a ", 4);
1665 }
1666
1667 if (buflen > 63) {
1668 const u8 versions[] = {
1669 0x60, /* SAM-3 (no version claimed) */
1670
1671 0x03,
1672 0x20, /* SBC-2 (no version claimed) */
1673
1674 0x02,
1675 0x60 /* SPC-3 (no version claimed) */
1676 };
1677
1678 memcpy(rbuf + 59, versions, sizeof(versions));
1679 }
1680
1681 return 0;
1682}
1683
1684/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001685 * ata_scsiop_inq_00 - Simulate INQUIRY VPD page 0, list of pages
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686 * @args: device IDENTIFY data / SCSI command of interest.
1687 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1688 * @buflen: Response buffer length.
1689 *
Jeff Garzikb142eb62006-03-21 20:37:47 -05001690 * Returns list of inquiry VPD pages available.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 *
1692 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001693 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 */
1695
1696unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf,
1697 unsigned int buflen)
1698{
1699 const u8 pages[] = {
1700 0x00, /* page 0x00, this page */
1701 0x80, /* page 0x80, unit serial no page */
1702 0x83 /* page 0x83, device ident page */
1703 };
Jeff Garzikb142eb62006-03-21 20:37:47 -05001704 rbuf[3] = sizeof(pages); /* number of supported VPD pages */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705
1706 if (buflen > 6)
1707 memcpy(rbuf + 4, pages, sizeof(pages));
1708
1709 return 0;
1710}
1711
1712/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001713 * ata_scsiop_inq_80 - Simulate INQUIRY VPD page 80, device serial number
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714 * @args: device IDENTIFY data / SCSI command of interest.
1715 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1716 * @buflen: Response buffer length.
1717 *
1718 * Returns ATA device serial number.
1719 *
1720 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001721 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001722 */
1723
1724unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
1725 unsigned int buflen)
1726{
1727 const u8 hdr[] = {
1728 0,
1729 0x80, /* this page code */
1730 0,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001731 ATA_ID_SERNO_LEN, /* page len */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001732 };
1733 memcpy(rbuf, hdr, sizeof(hdr));
1734
Tejun Heoa0cf7332007-01-02 20:18:49 +09001735 if (buflen > (ATA_ID_SERNO_LEN + 4 - 1))
Tejun Heo6a62a042006-02-13 10:02:46 +09001736 ata_id_string(args->id, (unsigned char *) &rbuf[4],
Tejun Heoa0cf7332007-01-02 20:18:49 +09001737 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
1739 return 0;
1740}
1741
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001743 * ata_scsiop_inq_83 - Simulate INQUIRY VPD page 83, device identity
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744 * @args: device IDENTIFY data / SCSI command of interest.
1745 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1746 * @buflen: Response buffer length.
1747 *
Jeff Garzikb142eb62006-03-21 20:37:47 -05001748 * Yields two logical unit device identification designators:
1749 * - vendor specific ASCII containing the ATA serial number
1750 * - SAT defined "t10 vendor id based" containing ASCII vendor
1751 * name ("ATA "), model and serial numbers.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752 *
1753 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001754 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755 */
1756
1757unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
1758 unsigned int buflen)
1759{
Jeff Garzikb142eb62006-03-21 20:37:47 -05001760 int num;
1761 const int sat_model_serial_desc_len = 68;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001762
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 rbuf[1] = 0x83; /* this page code */
Jeff Garzikb142eb62006-03-21 20:37:47 -05001764 num = 4;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765
Tejun Heoa0cf7332007-01-02 20:18:49 +09001766 if (buflen > (ATA_ID_SERNO_LEN + num + 3)) {
Jeff Garzikb142eb62006-03-21 20:37:47 -05001767 /* piv=0, assoc=lu, code_set=ACSII, designator=vendor */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001768 rbuf[num + 0] = 2;
Tejun Heoa0cf7332007-01-02 20:18:49 +09001769 rbuf[num + 3] = ATA_ID_SERNO_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001770 num += 4;
1771 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001772 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1773 num += ATA_ID_SERNO_LEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774 }
Jeff Garzikb142eb62006-03-21 20:37:47 -05001775 if (buflen > (sat_model_serial_desc_len + num + 3)) {
1776 /* SAT defined lu model and serial numbers descriptor */
1777 /* piv=0, assoc=lu, code_set=ACSII, designator=t10 vendor id */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001778 rbuf[num + 0] = 2;
1779 rbuf[num + 1] = 1;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001780 rbuf[num + 3] = sat_model_serial_desc_len;
1781 num += 4;
1782 memcpy(rbuf + num, "ATA ", 8);
1783 num += 8;
1784 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001785 ATA_ID_PROD, ATA_ID_PROD_LEN);
1786 num += ATA_ID_PROD_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001787 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001788 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1789 num += ATA_ID_SERNO_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001790 }
1791 rbuf[3] = num - 4; /* page len (assume less than 256 bytes) */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792 return 0;
1793}
1794
1795/**
Jeff Garzikad355b42007-09-21 20:38:03 -04001796 * ata_scsiop_inq_89 - Simulate INQUIRY VPD page 89, ATA info
1797 * @args: device IDENTIFY data / SCSI command of interest.
1798 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1799 * @buflen: Response buffer length.
1800 *
1801 * Yields SAT-specified ATA VPD page.
1802 *
1803 * LOCKING:
1804 * spin_lock_irqsave(host lock)
1805 */
1806
1807unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf,
1808 unsigned int buflen)
1809{
1810 u8 pbuf[60];
1811 struct ata_taskfile tf;
1812 unsigned int i;
1813
1814 if (!buflen)
1815 return 0;
1816
1817 memset(&pbuf, 0, sizeof(pbuf));
1818 memset(&tf, 0, sizeof(tf));
1819
1820 pbuf[1] = 0x89; /* our page code */
1821 pbuf[2] = (0x238 >> 8); /* page size fixed at 238h */
1822 pbuf[3] = (0x238 & 0xff);
1823
Jeff Garzikc78968b2007-09-21 21:03:28 -04001824 memcpy(&pbuf[8], "linux ", 8);
1825 memcpy(&pbuf[16], "libata ", 16);
1826 memcpy(&pbuf[32], DRV_VERSION, 4);
Jeff Garzikad355b42007-09-21 20:38:03 -04001827 ata_id_string(args->id, &pbuf[32], ATA_ID_FW_REV, 4);
1828
1829 /* we don't store the ATA device signature, so we fake it */
1830
1831 tf.command = ATA_DRDY; /* really, this is Status reg */
1832 tf.lbal = 0x1;
1833 tf.nsect = 0x1;
1834
1835 ata_tf_to_fis(&tf, 0, 1, &pbuf[36]); /* TODO: PMP? */
1836 pbuf[36] = 0x34; /* force D2H Reg FIS (34h) */
1837
1838 pbuf[56] = ATA_CMD_ID_ATA;
1839
1840 i = min(buflen, 60U);
1841 memcpy(rbuf, &pbuf[0], i);
1842 buflen -= i;
1843
1844 if (!buflen)
1845 return 0;
1846
1847 memcpy(&rbuf[60], &args->id[0], min(buflen, 512U));
1848 return 0;
1849}
1850
1851/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04001852 * ata_scsiop_noop - Command handler that simply returns success.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853 * @args: device IDENTIFY data / SCSI command of interest.
1854 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1855 * @buflen: Response buffer length.
1856 *
1857 * No operation. Simply returns success to caller, to indicate
1858 * that the caller should successfully complete this SCSI command.
1859 *
1860 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001861 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 */
1863
1864unsigned int ata_scsiop_noop(struct ata_scsi_args *args, u8 *rbuf,
1865 unsigned int buflen)
1866{
1867 VPRINTK("ENTER\n");
1868 return 0;
1869}
1870
1871/**
1872 * ata_msense_push - Push data onto MODE SENSE data output buffer
1873 * @ptr_io: (input/output) Location to store more output data
1874 * @last: End of output data buffer
1875 * @buf: Pointer to BLOB being added to output buffer
1876 * @buflen: Length of BLOB
1877 *
1878 * Store MODE SENSE data on an output buffer.
1879 *
1880 * LOCKING:
1881 * None.
1882 */
1883
1884static void ata_msense_push(u8 **ptr_io, const u8 *last,
1885 const u8 *buf, unsigned int buflen)
1886{
1887 u8 *ptr = *ptr_io;
1888
1889 if ((ptr + buflen - 1) > last)
1890 return;
1891
1892 memcpy(ptr, buf, buflen);
1893
1894 ptr += buflen;
1895
1896 *ptr_io = ptr;
1897}
1898
1899/**
1900 * ata_msense_caching - Simulate MODE SENSE caching info page
1901 * @id: device IDENTIFY data
1902 * @ptr_io: (input/output) Location to store more output data
1903 * @last: End of output data buffer
1904 *
1905 * Generate a caching info page, which conditionally indicates
1906 * write caching to the SCSI layer, depending on device
1907 * capabilities.
1908 *
1909 * LOCKING:
1910 * None.
1911 */
1912
1913static unsigned int ata_msense_caching(u16 *id, u8 **ptr_io,
1914 const u8 *last)
1915{
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001916 u8 page[CACHE_MPAGE_LEN];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001918 memcpy(page, def_cache_mpage, sizeof(page));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001919 if (ata_id_wcache_enabled(id))
1920 page[2] |= (1 << 2); /* write cache enable */
1921 if (!ata_id_rahead_enabled(id))
1922 page[12] |= (1 << 5); /* disable read ahead */
1923
1924 ata_msense_push(ptr_io, last, page, sizeof(page));
1925 return sizeof(page);
1926}
1927
1928/**
1929 * ata_msense_ctl_mode - Simulate MODE SENSE control mode page
1930 * @dev: Device associated with this MODE SENSE command
1931 * @ptr_io: (input/output) Location to store more output data
1932 * @last: End of output data buffer
1933 *
1934 * Generate a generic MODE SENSE control mode page.
1935 *
1936 * LOCKING:
1937 * None.
1938 */
1939
1940static unsigned int ata_msense_ctl_mode(u8 **ptr_io, const u8 *last)
1941{
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001942 ata_msense_push(ptr_io, last, def_control_mpage,
1943 sizeof(def_control_mpage));
1944 return sizeof(def_control_mpage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001945}
1946
1947/**
1948 * ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page
1949 * @dev: Device associated with this MODE SENSE command
1950 * @ptr_io: (input/output) Location to store more output data
1951 * @last: End of output data buffer
1952 *
1953 * Generate a generic MODE SENSE r/w error recovery page.
1954 *
1955 * LOCKING:
1956 * None.
1957 */
1958
1959static unsigned int ata_msense_rw_recovery(u8 **ptr_io, const u8 *last)
1960{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001961
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001962 ata_msense_push(ptr_io, last, def_rw_recovery_mpage,
1963 sizeof(def_rw_recovery_mpage));
1964 return sizeof(def_rw_recovery_mpage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965}
1966
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001967/*
1968 * We can turn this into a real blacklist if it's needed, for now just
1969 * blacklist any Maxtor BANC1G10 revision firmware
1970 */
1971static int ata_dev_supports_fua(u16 *id)
1972{
Tejun Heoa0cf7332007-01-02 20:18:49 +09001973 unsigned char model[ATA_ID_PROD_LEN + 1], fw[ATA_ID_FW_REV_LEN + 1];
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001974
Jeff Garzikc3c013a2006-02-27 22:31:19 -05001975 if (!libata_fua)
1976 return 0;
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001977 if (!ata_id_has_fua(id))
1978 return 0;
1979
Tejun Heoa0cf7332007-01-02 20:18:49 +09001980 ata_id_c_string(id, model, ATA_ID_PROD, sizeof(model));
1981 ata_id_c_string(id, fw, ATA_ID_FW_REV, sizeof(fw));
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001982
Tejun Heo2e026712006-02-12 22:47:04 +09001983 if (strcmp(model, "Maxtor"))
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001984 return 1;
Tejun Heo2e026712006-02-12 22:47:04 +09001985 if (strcmp(fw, "BANC1G10"))
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001986 return 1;
1987
1988 return 0; /* blacklisted */
1989}
1990
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991/**
1992 * ata_scsiop_mode_sense - Simulate MODE SENSE 6, 10 commands
1993 * @args: device IDENTIFY data / SCSI command of interest.
1994 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1995 * @buflen: Response buffer length.
1996 *
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001997 * Simulate MODE SENSE commands. Assume this is invoked for direct
1998 * access devices (e.g. disks) only. There should be no block
1999 * descriptor for other device types.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000 *
2001 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002002 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003 */
2004
2005unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf,
2006 unsigned int buflen)
2007{
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002008 struct ata_device *dev = args->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009 u8 *scsicmd = args->cmd->cmnd, *p, *last;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002010 const u8 sat_blk_desc[] = {
2011 0, 0, 0, 0, /* number of blocks: sat unspecified */
2012 0,
2013 0, 0x2, 0x0 /* block length: 512 bytes */
2014 };
2015 u8 pg, spg;
2016 unsigned int ebd, page_control, six_byte, output_len, alloc_len, minlen;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002017 u8 dpofua;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002018
2019 VPRINTK("ENTER\n");
2020
2021 six_byte = (scsicmd[0] == MODE_SENSE);
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002022 ebd = !(scsicmd[1] & 0x8); /* dbd bit inverted == edb */
2023 /*
2024 * LLBA bit in msense(10) ignored (compliant)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 */
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002026
Linus Torvalds1da177e2005-04-16 15:20:36 -07002027 page_control = scsicmd[2] >> 6;
Douglas Gilbertae006512005-10-09 09:09:35 -04002028 switch (page_control) {
2029 case 0: /* current */
2030 break; /* supported */
2031 case 3: /* saved */
2032 goto saving_not_supp;
2033 case 1: /* changeable */
2034 case 2: /* defaults */
2035 default:
2036 goto invalid_fld;
2037 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002039 if (six_byte) {
2040 output_len = 4 + (ebd ? 8 : 0);
2041 alloc_len = scsicmd[4];
2042 } else {
2043 output_len = 8 + (ebd ? 8 : 0);
2044 alloc_len = (scsicmd[7] << 8) + scsicmd[8];
2045 }
2046 minlen = (alloc_len < buflen) ? alloc_len : buflen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002047
2048 p = rbuf + output_len;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002049 last = rbuf + minlen - 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002050
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002051 pg = scsicmd[2] & 0x3f;
2052 spg = scsicmd[3];
2053 /*
2054 * No mode subpages supported (yet) but asking for _all_
2055 * subpages may be valid
2056 */
2057 if (spg && (spg != ALL_SUB_MPAGES))
2058 goto invalid_fld;
2059
2060 switch(pg) {
2061 case RW_RECOVERY_MPAGE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062 output_len += ata_msense_rw_recovery(&p, last);
2063 break;
2064
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002065 case CACHE_MPAGE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002066 output_len += ata_msense_caching(args->id, &p, last);
2067 break;
2068
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002069 case CONTROL_MPAGE: {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070 output_len += ata_msense_ctl_mode(&p, last);
2071 break;
2072 }
2073
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002074 case ALL_MPAGES:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075 output_len += ata_msense_rw_recovery(&p, last);
2076 output_len += ata_msense_caching(args->id, &p, last);
2077 output_len += ata_msense_ctl_mode(&p, last);
2078 break;
2079
2080 default: /* invalid page code */
Douglas Gilbertae006512005-10-09 09:09:35 -04002081 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082 }
2083
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002084 if (minlen < 1)
2085 return 0;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002086
2087 dpofua = 0;
Alan Coxf79d4092006-05-22 16:55:11 +01002088 if (ata_dev_supports_fua(args->id) && (dev->flags & ATA_DFLAG_LBA48) &&
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002089 (!(dev->flags & ATA_DFLAG_PIO) || dev->multi_count))
2090 dpofua = 1 << 4;
2091
Linus Torvalds1da177e2005-04-16 15:20:36 -07002092 if (six_byte) {
2093 output_len--;
2094 rbuf[0] = output_len;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002095 if (minlen > 2)
2096 rbuf[2] |= dpofua;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002097 if (ebd) {
2098 if (minlen > 3)
2099 rbuf[3] = sizeof(sat_blk_desc);
2100 if (minlen > 11)
2101 memcpy(rbuf + 4, sat_blk_desc,
2102 sizeof(sat_blk_desc));
2103 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104 } else {
2105 output_len -= 2;
2106 rbuf[0] = output_len >> 8;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002107 if (minlen > 1)
2108 rbuf[1] = output_len;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002109 if (minlen > 3)
2110 rbuf[3] |= dpofua;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002111 if (ebd) {
2112 if (minlen > 7)
2113 rbuf[7] = sizeof(sat_blk_desc);
2114 if (minlen > 15)
2115 memcpy(rbuf + 8, sat_blk_desc,
2116 sizeof(sat_blk_desc));
2117 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04002120
2121invalid_fld:
2122 ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x24, 0x0);
2123 /* "Invalid field in cbd" */
2124 return 1;
2125
2126saving_not_supp:
2127 ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x39, 0x0);
2128 /* "Saving parameters not supported" */
2129 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130}
2131
2132/**
2133 * ata_scsiop_read_cap - Simulate READ CAPACITY[ 16] commands
2134 * @args: device IDENTIFY data / SCSI command of interest.
2135 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2136 * @buflen: Response buffer length.
2137 *
2138 * Simulate READ CAPACITY commands.
2139 *
2140 * LOCKING:
Tejun Heo6a362612006-11-20 11:15:47 +09002141 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
2144 unsigned int buflen)
2145{
Tejun Heo6a362612006-11-20 11:15:47 +09002146 u64 last_lba = args->dev->n_sectors - 1; /* LBA of the last block */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147
2148 VPRINTK("ENTER\n");
2149
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150 if (args->cmd->cmnd[0] == READ_CAPACITY) {
Tejun Heo6a362612006-11-20 11:15:47 +09002151 if (last_lba >= 0xffffffffULL)
2152 last_lba = 0xffffffff;
Philip Pokorny0c144d02005-05-28 01:24:47 -07002153
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154 /* sector count, 32-bit */
Tejun Heo6a362612006-11-20 11:15:47 +09002155 ATA_SCSI_RBUF_SET(0, last_lba >> (8 * 3));
2156 ATA_SCSI_RBUF_SET(1, last_lba >> (8 * 2));
2157 ATA_SCSI_RBUF_SET(2, last_lba >> (8 * 1));
2158 ATA_SCSI_RBUF_SET(3, last_lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159
2160 /* sector size */
Tejun Heo6a362612006-11-20 11:15:47 +09002161 ATA_SCSI_RBUF_SET(6, ATA_SECT_SIZE >> 8);
2162 ATA_SCSI_RBUF_SET(7, ATA_SECT_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163 } else {
2164 /* sector count, 64-bit */
Tejun Heo6a362612006-11-20 11:15:47 +09002165 ATA_SCSI_RBUF_SET(0, last_lba >> (8 * 7));
2166 ATA_SCSI_RBUF_SET(1, last_lba >> (8 * 6));
2167 ATA_SCSI_RBUF_SET(2, last_lba >> (8 * 5));
2168 ATA_SCSI_RBUF_SET(3, last_lba >> (8 * 4));
2169 ATA_SCSI_RBUF_SET(4, last_lba >> (8 * 3));
2170 ATA_SCSI_RBUF_SET(5, last_lba >> (8 * 2));
2171 ATA_SCSI_RBUF_SET(6, last_lba >> (8 * 1));
2172 ATA_SCSI_RBUF_SET(7, last_lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173
2174 /* sector size */
Tejun Heo6a362612006-11-20 11:15:47 +09002175 ATA_SCSI_RBUF_SET(10, ATA_SECT_SIZE >> 8);
2176 ATA_SCSI_RBUF_SET(11, ATA_SECT_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 }
2178
2179 return 0;
2180}
2181
2182/**
2183 * ata_scsiop_report_luns - Simulate REPORT LUNS command
2184 * @args: device IDENTIFY data / SCSI command of interest.
2185 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2186 * @buflen: Response buffer length.
2187 *
2188 * Simulate REPORT LUNS command.
2189 *
2190 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002191 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 */
2193
2194unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
2195 unsigned int buflen)
2196{
2197 VPRINTK("ENTER\n");
2198 rbuf[3] = 8; /* just one lun, LUN 0, size 8 bytes */
2199
2200 return 0;
2201}
2202
2203/**
Douglas Gilbert845c5832005-10-09 08:55:41 -04002204 * ata_scsi_set_sense - Set SCSI sense data and status
2205 * @cmd: SCSI request to be handled
2206 * @sk: SCSI-defined sense key
2207 * @asc: SCSI-defined additional sense code
2208 * @ascq: SCSI-defined additional sense code qualifier
2209 *
2210 * Helper function that builds a valid fixed format, current
2211 * response code and the given sense key (sk), additional sense
2212 * code (asc) and additional sense code qualifier (ascq) with
2213 * a SCSI command status of %SAM_STAT_CHECK_CONDITION and
2214 * DRIVER_SENSE set in the upper bits of scsi_cmnd::result .
2215 *
2216 * LOCKING:
2217 * Not required
2218 */
2219
2220void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
2221{
2222 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
2223
2224 cmd->sense_buffer[0] = 0x70; /* fixed format, current */
2225 cmd->sense_buffer[2] = sk;
2226 cmd->sense_buffer[7] = 18 - 8; /* additional sense length */
2227 cmd->sense_buffer[12] = asc;
2228 cmd->sense_buffer[13] = ascq;
2229}
2230
2231/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232 * ata_scsi_badcmd - End a SCSI request with an error
2233 * @cmd: SCSI request to be handled
2234 * @done: SCSI command completion function
2235 * @asc: SCSI-defined additional sense code
2236 * @ascq: SCSI-defined additional sense code qualifier
2237 *
2238 * Helper function that completes a SCSI command with
2239 * %SAM_STAT_CHECK_CONDITION, with a sense key %ILLEGAL_REQUEST
2240 * and the specified additional sense codes.
2241 *
2242 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002243 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002244 */
2245
2246void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq)
2247{
2248 DPRINTK("ENTER\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04002249 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, asc, ascq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250
2251 done(cmd);
2252}
2253
Tejun Heo77853bf2006-01-23 13:09:36 +09002254static void atapi_sense_complete(struct ata_queued_cmd *qc)
Jeff Garzika939c962005-10-05 17:09:16 -04002255{
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002256 if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0)) {
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002257 /* FIXME: not quite right; we don't want the
2258 * translation of taskfile registers into
2259 * a sense descriptors, since that's only
2260 * correct for ATA, not ATAPI
2261 */
Tejun Heo750426a2006-11-14 22:37:35 +09002262 ata_gen_passthru_sense(qc);
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002263 }
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002264
2265 qc->scsidone(qc->scsicmd);
Tejun Heo77853bf2006-01-23 13:09:36 +09002266 ata_qc_free(qc);
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002267}
2268
2269/* is it pointless to prefer PIO for "safety reasons"? */
2270static inline int ata_pio_use_silly(struct ata_port *ap)
2271{
2272 return (ap->flags & ATA_FLAG_PIO_DMA);
2273}
2274
2275static void atapi_request_sense(struct ata_queued_cmd *qc)
2276{
2277 struct ata_port *ap = qc->ap;
2278 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzika939c962005-10-05 17:09:16 -04002279
2280 DPRINTK("ATAPI request sense\n");
2281
Jeff Garzika939c962005-10-05 17:09:16 -04002282 /* FIXME: is this needed? */
2283 memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
2284
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002285 ap->ops->tf_read(ap, &qc->tf);
2286
2287 /* fill these in, for the case where they are -not- overwritten */
2288 cmd->sense_buffer[0] = 0x70;
2289 cmd->sense_buffer[2] = qc->tf.feature >> 4;
2290
2291 ata_qc_reinit(qc);
2292
Jeff Garzika939c962005-10-05 17:09:16 -04002293 ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer));
2294 qc->dma_dir = DMA_FROM_DEVICE;
2295
Tejun Heo6e7846e2006-02-12 23:32:58 +09002296 memset(&qc->cdb, 0, qc->dev->cdb_len);
Jeff Garzika939c962005-10-05 17:09:16 -04002297 qc->cdb[0] = REQUEST_SENSE;
2298 qc->cdb[4] = SCSI_SENSE_BUFFERSIZE;
2299
2300 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
2301 qc->tf.command = ATA_CMD_PACKET;
2302
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002303 if (ata_pio_use_silly(ap)) {
2304 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
2305 qc->tf.feature |= ATAPI_PKT_DMA;
2306 } else {
2307 qc->tf.protocol = ATA_PROT_ATAPI;
Alan Cox2db78dd2007-10-02 13:53:04 -07002308 qc->tf.lbam = SCSI_SENSE_BUFFERSIZE;
2309 qc->tf.lbah = 0;
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002310 }
Jeff Garzika939c962005-10-05 17:09:16 -04002311 qc->nbytes = SCSI_SENSE_BUFFERSIZE;
2312
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002313 qc->complete_fn = atapi_sense_complete;
Jeff Garzika939c962005-10-05 17:09:16 -04002314
Tejun Heo8e0e6942006-03-31 20:41:11 +09002315 ata_qc_issue(qc);
Jeff Garzika939c962005-10-05 17:09:16 -04002316
2317 DPRINTK("EXIT\n");
2318}
2319
Tejun Heo77853bf2006-01-23 13:09:36 +09002320static void atapi_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321{
2322 struct scsi_cmnd *cmd = qc->scsicmd;
Albert Leea22e2eb2005-12-05 15:38:02 +08002323 unsigned int err_mask = qc->err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324
Jeff Garzika7dac442005-10-30 04:44:42 -05002325 VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
Jeff Garzike12669e2005-10-05 18:39:23 -04002326
Tejun Heo246619d2006-05-15 20:58:16 +09002327 /* handle completion from new EH */
2328 if (unlikely(qc->ap->ops->error_handler &&
2329 (err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) {
2330
2331 if (!(qc->flags & ATA_QCFLAG_SENSE_VALID)) {
2332 /* FIXME: not quite right; we don't want the
2333 * translation of taskfile registers into a
2334 * sense descriptors, since that's only
2335 * correct for ATA, not ATAPI
2336 */
Tejun Heo750426a2006-11-14 22:37:35 +09002337 ata_gen_passthru_sense(qc);
Tejun Heo246619d2006-05-15 20:58:16 +09002338 }
2339
Tejun Heo22aac082006-08-08 14:08:59 +09002340 /* SCSI EH automatically locks door if sdev->locked is
2341 * set. Sometimes door lock request continues to
2342 * fail, for example, when no media is present. This
2343 * creates a loop - SCSI EH issues door lock which
2344 * fails and gets invoked again to acquire sense data
2345 * for the failed command.
2346 *
2347 * If door lock fails, always clear sdev->locked to
2348 * avoid this infinite loop.
2349 */
2350 if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL)
2351 qc->dev->sdev->locked = 0;
2352
Tejun Heo246619d2006-05-15 20:58:16 +09002353 qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
2354 qc->scsidone(cmd);
2355 ata_qc_free(qc);
2356 return;
2357 }
2358
2359 /* successful completion or old EH failure path */
Jeff Garzika7dac442005-10-30 04:44:42 -05002360 if (unlikely(err_mask & AC_ERR_DEV)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361 cmd->result = SAM_STAT_CHECK_CONDITION;
Jeff Garzikc6e6e6662005-11-14 14:50:05 -05002362 atapi_request_sense(qc);
Tejun Heo77853bf2006-01-23 13:09:36 +09002363 return;
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002364 } else if (unlikely(err_mask)) {
Jeff Garzika7dac442005-10-30 04:44:42 -05002365 /* FIXME: not quite right; we don't want the
2366 * translation of taskfile registers into
2367 * a sense descriptors, since that's only
2368 * correct for ATA, not ATAPI
2369 */
Tejun Heo750426a2006-11-14 22:37:35 +09002370 ata_gen_passthru_sense(qc);
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002371 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372 u8 *scsicmd = cmd->cmnd;
2373
Tony Battersbyfd71da42005-12-21 16:35:44 -05002374 if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002375 u8 *buf = NULL;
2376 unsigned int buflen;
2377
2378 buflen = ata_scsi_rbuf_get(cmd, &buf);
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002379
2380 /* ATAPI devices typically report zero for their SCSI version,
2381 * and sometimes deviate from the spec WRT response data
2382 * format. If SCSI version is reported as zero like normal,
2383 * then we make the following fixups: 1) Fake MMC-5 version,
2384 * to indicate to the Linux scsi midlayer this is a modern
2385 * device. 2) Ensure response data format / ATAPI information
2386 * are always correct.
2387 */
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002388 if (buf[2] == 0) {
2389 buf[2] = 0x5;
2390 buf[3] = 0x32;
2391 }
2392
Linus Torvalds1da177e2005-04-16 15:20:36 -07002393 ata_scsi_rbuf_put(cmd, buf);
2394 }
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002395
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396 cmd->result = SAM_STAT_GOOD;
2397 }
2398
2399 qc->scsidone(cmd);
Tejun Heo77853bf2006-01-23 13:09:36 +09002400 ata_qc_free(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002401}
2402/**
2403 * atapi_xlat - Initialize PACKET taskfile
2404 * @qc: command structure to be initialized
Linus Torvalds1da177e2005-04-16 15:20:36 -07002405 *
2406 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002407 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002408 *
2409 * RETURNS:
2410 * Zero on success, non-zero on failure.
2411 */
Tejun Heoad706992006-12-17 10:45:57 +09002412static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002413{
Tejun Heo542b1442006-12-17 10:45:08 +09002414 struct scsi_cmnd *scmd = qc->scsicmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002415 struct ata_device *dev = qc->dev;
2416 int using_pio = (dev->flags & ATA_DFLAG_PIO);
Tejun Heo542b1442006-12-17 10:45:08 +09002417 int nodata = (scmd->sc_data_direction == DMA_NONE);
Alan Cox2db78dd2007-10-02 13:53:04 -07002418 unsigned int nbytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002419
Tejun Heo2e5704f2006-12-17 10:46:33 +09002420 memset(qc->cdb, 0, dev->cdb_len);
2421 memcpy(qc->cdb, scmd->cmnd, scmd->cmd_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422
2423 qc->complete_fn = atapi_qc_complete;
2424
2425 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
Tejun Heo542b1442006-12-17 10:45:08 +09002426 if (scmd->sc_data_direction == DMA_TO_DEVICE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002427 qc->tf.flags |= ATA_TFLAG_WRITE;
2428 DPRINTK("direction: write\n");
2429 }
2430
2431 qc->tf.command = ATA_CMD_PACKET;
Boaz Harrosh71201652007-09-18 17:48:50 +02002432 qc->nbytes = scsi_bufflen(scmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002433
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002434 /* check whether ATAPI DMA is safe */
2435 if (!using_pio && ata_check_atapi_dma(qc))
2436 using_pio = 1;
2437
Alan Cox2db78dd2007-10-02 13:53:04 -07002438 /* Some controller variants snoop this value for Packet transfers
2439 to do state machine and FIFO management. Thus we want to set it
2440 properly, and for DMA where it is effectively meaningless */
2441 nbytes = min(qc->nbytes, (unsigned int)63 * 1024);
2442
2443 qc->tf.lbam = (nbytes & 0xFF);
2444 qc->tf.lbah = (nbytes >> 8);
2445
Linus Torvalds1da177e2005-04-16 15:20:36 -07002446 if (using_pio || nodata) {
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002447 /* no data, or PIO data xfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002448 if (nodata)
2449 qc->tf.protocol = ATA_PROT_ATAPI_NODATA;
2450 else
2451 qc->tf.protocol = ATA_PROT_ATAPI;
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002452 } else {
2453 /* DMA data xfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002454 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
2455 qc->tf.feature |= ATAPI_PKT_DMA;
2456
Tejun Heo542b1442006-12-17 10:45:08 +09002457 if (atapi_dmadir && (scmd->sc_data_direction != DMA_TO_DEVICE))
Albert Lee95de7192006-04-04 10:57:18 +08002458 /* some SATA bridges need us to indicate data xfer direction */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459 qc->tf.feature |= ATAPI_DMADIR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002460 }
2461
Alan Cox2db78dd2007-10-02 13:53:04 -07002462
2463 /* FIXME: We need to translate 0x05 READ_BLOCK_LIMITS to a MODE_SENSE
2464 as ATAPI tape drives don't get this right otherwise */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002465 return 0;
2466}
2467
Tejun Heo41bda9c2007-08-06 18:36:24 +09002468static struct ata_device * ata_find_dev(struct ata_port *ap, int devno)
Tejun Heoab5b3a52006-05-31 18:27:34 +09002469{
Tejun Heo41bda9c2007-08-06 18:36:24 +09002470 if (ap->nr_pmp_links == 0) {
2471 if (likely(devno < ata_link_max_devices(&ap->link)))
2472 return &ap->link.device[devno];
2473 } else {
2474 if (likely(devno < ap->nr_pmp_links))
2475 return &ap->pmp_link[devno].device[0];
2476 }
2477
Tejun Heoab5b3a52006-05-31 18:27:34 +09002478 return NULL;
2479}
2480
2481static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap,
2482 const struct scsi_device *scsidev)
2483{
Tejun Heo41bda9c2007-08-06 18:36:24 +09002484 int devno;
Tejun Heoab5b3a52006-05-31 18:27:34 +09002485
Tejun Heo41bda9c2007-08-06 18:36:24 +09002486 /* skip commands not addressed to targets we simulate */
2487 if (ap->nr_pmp_links == 0) {
2488 if (unlikely(scsidev->channel || scsidev->lun))
2489 return NULL;
2490 devno = scsidev->id;
2491 } else {
2492 if (unlikely(scsidev->id || scsidev->lun))
2493 return NULL;
2494 devno = scsidev->channel;
2495 }
2496
2497 return ata_find_dev(ap, devno);
Tejun Heoab5b3a52006-05-31 18:27:34 +09002498}
2499
Linus Torvalds1da177e2005-04-16 15:20:36 -07002500/**
Brian King99ba9e02006-06-12 14:54:17 -05002501 * ata_scsi_dev_enabled - determine if device is enabled
2502 * @dev: ATA device
2503 *
2504 * Determine if commands should be sent to the specified device.
2505 *
2506 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002507 * spin_lock_irqsave(host lock)
Brian King99ba9e02006-06-12 14:54:17 -05002508 *
2509 * RETURNS:
2510 * 0 if commands are not allowed / 1 if commands are allowed
2511 */
2512
2513static int ata_scsi_dev_enabled(struct ata_device *dev)
2514{
2515 if (unlikely(!ata_dev_enabled(dev)))
2516 return 0;
2517
Tejun Heo9af5c9c2007-08-06 18:36:22 +09002518 if (!atapi_enabled || (dev->link->ap->flags & ATA_FLAG_NO_ATAPI)) {
Brian King99ba9e02006-06-12 14:54:17 -05002519 if (unlikely(dev->class == ATA_DEV_ATAPI)) {
2520 ata_dev_printk(dev, KERN_WARNING,
2521 "WARNING: ATAPI is %s, device ignored.\n",
2522 atapi_enabled ? "not supported with this driver" : "disabled");
2523 return 0;
2524 }
2525 }
2526
2527 return 1;
2528}
2529
2530/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002531 * ata_scsi_find_dev - lookup ata_device from scsi_cmnd
2532 * @ap: ATA port to which the device is attached
2533 * @scsidev: SCSI device from which we derive the ATA device
2534 *
2535 * Given various information provided in struct scsi_cmnd,
2536 * map that onto an ATA bus, and using that mapping
2537 * determine which ata_device is associated with the
2538 * SCSI command to be sent.
2539 *
2540 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002541 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002542 *
2543 * RETURNS:
2544 * Associated ATA device, or %NULL if not found.
2545 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546static struct ata_device *
Jeff Garzik057ace52005-10-22 14:27:05 -04002547ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002548{
Tejun Heoab5b3a52006-05-31 18:27:34 +09002549 struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002550
Brian King99ba9e02006-06-12 14:54:17 -05002551 if (unlikely(!dev || !ata_scsi_dev_enabled(dev)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002552 return NULL;
2553
Linus Torvalds1da177e2005-04-16 15:20:36 -07002554 return dev;
2555}
2556
Jeff Garzikb0955182005-05-12 15:45:22 -04002557/*
2558 * ata_scsi_map_proto - Map pass-thru protocol value to taskfile value.
2559 * @byte1: Byte 1 from pass-thru CDB.
2560 *
2561 * RETURNS:
2562 * ATA_PROT_UNKNOWN if mapping failed/unimplemented, protocol otherwise.
2563 */
2564static u8
2565ata_scsi_map_proto(u8 byte1)
2566{
2567 switch((byte1 & 0x1e) >> 1) {
2568 case 3: /* Non-data */
2569 return ATA_PROT_NODATA;
2570
2571 case 6: /* DMA */
Albert Lee23cb1d72007-06-07 15:50:44 +08002572 case 10: /* UDMA Data-in */
2573 case 11: /* UDMA Data-Out */
Jeff Garzikb0955182005-05-12 15:45:22 -04002574 return ATA_PROT_DMA;
2575
2576 case 4: /* PIO Data-in */
2577 case 5: /* PIO Data-out */
Jeff Garzikb0955182005-05-12 15:45:22 -04002578 return ATA_PROT_PIO;
2579
Jeff Garzikb0955182005-05-12 15:45:22 -04002580 case 0: /* Hard Reset */
2581 case 1: /* SRST */
Albert Leef93f1072007-06-07 15:47:13 +08002582 case 8: /* Device Diagnostic */
2583 case 9: /* Device Reset */
2584 case 7: /* DMA Queued */
Albert Leef93f1072007-06-07 15:47:13 +08002585 case 12: /* FPDMA */
2586 case 15: /* Return Response Info */
Jeff Garzikb0955182005-05-12 15:45:22 -04002587 default: /* Reserved */
2588 break;
2589 }
2590
2591 return ATA_PROT_UNKNOWN;
2592}
2593
2594/**
2595 * ata_scsi_pass_thru - convert ATA pass-thru CDB to taskfile
2596 * @qc: command structure to be initialized
Jeff Garzikb0955182005-05-12 15:45:22 -04002597 *
2598 * Handles either 12 or 16-byte versions of the CDB.
2599 *
2600 * RETURNS:
2601 * Zero on success, non-zero on failure.
2602 */
Tejun Heoad706992006-12-17 10:45:57 +09002603static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -04002604{
2605 struct ata_taskfile *tf = &(qc->tf);
Tejun Heo542b1442006-12-17 10:45:08 +09002606 struct scsi_cmnd *scmd = qc->scsicmd;
Alan Coxf79d4092006-05-22 16:55:11 +01002607 struct ata_device *dev = qc->dev;
Tejun Heoad706992006-12-17 10:45:57 +09002608 const u8 *cdb = scmd->cmnd;
Jeff Garzikb0955182005-05-12 15:45:22 -04002609
Tejun Heo542b1442006-12-17 10:45:08 +09002610 if ((tf->protocol = ata_scsi_map_proto(cdb[1])) == ATA_PROT_UNKNOWN)
Tejun Heo9a405252005-12-02 11:49:11 +09002611 goto invalid_fld;
Jeff Garzik8190bdb2006-05-24 01:53:39 -04002612
Alan Coxf79d4092006-05-22 16:55:11 +01002613 /* We may not issue DMA commands if no DMA mode is set */
2614 if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
2615 goto invalid_fld;
Jeff Garzikb0955182005-05-12 15:45:22 -04002616
2617 /*
2618 * 12 and 16 byte CDBs use different offsets to
2619 * provide the various register values.
2620 */
Tejun Heo542b1442006-12-17 10:45:08 +09002621 if (cdb[0] == ATA_16) {
Jeff Garzikb0955182005-05-12 15:45:22 -04002622 /*
2623 * 16-byte CDB - may contain extended commands.
2624 *
2625 * If that is the case, copy the upper byte register values.
2626 */
Tejun Heo542b1442006-12-17 10:45:08 +09002627 if (cdb[1] & 0x01) {
2628 tf->hob_feature = cdb[3];
2629 tf->hob_nsect = cdb[5];
2630 tf->hob_lbal = cdb[7];
2631 tf->hob_lbam = cdb[9];
2632 tf->hob_lbah = cdb[11];
Jeff Garzikb0955182005-05-12 15:45:22 -04002633 tf->flags |= ATA_TFLAG_LBA48;
2634 } else
2635 tf->flags &= ~ATA_TFLAG_LBA48;
2636
2637 /*
2638 * Always copy low byte, device and command registers.
2639 */
Tejun Heo542b1442006-12-17 10:45:08 +09002640 tf->feature = cdb[4];
2641 tf->nsect = cdb[6];
2642 tf->lbal = cdb[8];
2643 tf->lbam = cdb[10];
2644 tf->lbah = cdb[12];
2645 tf->device = cdb[13];
2646 tf->command = cdb[14];
Jeff Garzikb0955182005-05-12 15:45:22 -04002647 } else {
2648 /*
2649 * 12-byte CDB - incapable of extended commands.
2650 */
2651 tf->flags &= ~ATA_TFLAG_LBA48;
2652
Tejun Heo542b1442006-12-17 10:45:08 +09002653 tf->feature = cdb[3];
2654 tf->nsect = cdb[4];
2655 tf->lbal = cdb[5];
2656 tf->lbam = cdb[6];
2657 tf->lbah = cdb[7];
2658 tf->device = cdb[8];
2659 tf->command = cdb[9];
Jeff Garzikb0955182005-05-12 15:45:22 -04002660 }
Albert Leefa4453c2007-06-07 15:52:07 +08002661
2662 /* enforce correct master/slave bit */
2663 tf->device = dev->devno ?
2664 tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
Jeff Garzikb0955182005-05-12 15:45:22 -04002665
Albert Lee1dce5892007-06-07 15:49:22 +08002666 /* sanity check for pio multi commands */
2667 if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf))
2668 goto invalid_fld;
2669
2670 if (is_multi_taskfile(tf)) {
2671 unsigned int multi_count = 1 << (cdb[1] >> 5);
2672
2673 /* compare the passed through multi_count
2674 * with the cached multi_count of libata
2675 */
2676 if (multi_count != dev->multi_count)
2677 ata_dev_printk(dev, KERN_WARNING,
2678 "invalid multi_count %u ignored\n",
2679 multi_count);
Alan Coxd26fc952007-07-06 19:13:52 -04002680 }
Albert Lee1dce5892007-06-07 15:49:22 +08002681
Mark Lord5a5dbd12007-03-16 10:22:26 -04002682 /* READ/WRITE LONG use a non-standard sect_size */
2683 qc->sect_size = ATA_SECT_SIZE;
2684 switch (tf->command) {
2685 case ATA_CMD_READ_LONG:
2686 case ATA_CMD_READ_LONG_ONCE:
2687 case ATA_CMD_WRITE_LONG:
2688 case ATA_CMD_WRITE_LONG_ONCE:
2689 if (tf->protocol != ATA_PROT_PIO || tf->nsect != 1)
2690 goto invalid_fld;
Boaz Harrosh71201652007-09-18 17:48:50 +02002691 qc->sect_size = scsi_bufflen(scmd);
Mark Lord5a5dbd12007-03-16 10:22:26 -04002692 }
2693
Jeff Garzikb0955182005-05-12 15:45:22 -04002694 /*
2695 * Filter SET_FEATURES - XFER MODE command -- otherwise,
2696 * SET_FEATURES - XFER MODE must be preceded/succeeded
2697 * by an update to hardware-specific registers for each
2698 * controller (i.e. the reason for ->set_piomode(),
2699 * ->set_dmamode(), and ->post_set_mode() hooks).
2700 */
2701 if ((tf->command == ATA_CMD_SET_FEATURES)
2702 && (tf->feature == SETFEATURES_XFER))
Tejun Heo9a405252005-12-02 11:49:11 +09002703 goto invalid_fld;
Jeff Garzikb0955182005-05-12 15:45:22 -04002704
2705 /*
2706 * Set flags so that all registers will be written,
2707 * and pass on write indication (used for PIO/DMA
2708 * setup.)
2709 */
2710 tf->flags |= (ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE);
2711
Tejun Heo542b1442006-12-17 10:45:08 +09002712 if (scmd->sc_data_direction == DMA_TO_DEVICE)
Jeff Garzikb0955182005-05-12 15:45:22 -04002713 tf->flags |= ATA_TFLAG_WRITE;
2714
2715 /*
2716 * Set transfer length.
2717 *
2718 * TODO: find out if we need to do more here to
2719 * cover scatter/gather case.
2720 */
Boaz Harrosh71201652007-09-18 17:48:50 +02002721 qc->nbytes = scsi_bufflen(scmd);
Jeff Garzikb0955182005-05-12 15:45:22 -04002722
Tejun Heoe61e0672006-05-15 20:57:40 +09002723 /* request result TF */
2724 qc->flags |= ATA_QCFLAG_RESULT_TF;
2725
Jeff Garzikb0955182005-05-12 15:45:22 -04002726 return 0;
Tejun Heo9a405252005-12-02 11:49:11 +09002727
2728 invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09002729 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x00);
Tejun Heo9a405252005-12-02 11:49:11 +09002730 /* "Invalid field in cdb" */
2731 return 1;
Jeff Garzikb0955182005-05-12 15:45:22 -04002732}
2733
Linus Torvalds1da177e2005-04-16 15:20:36 -07002734/**
2735 * ata_get_xlat_func - check if SCSI to ATA translation is possible
2736 * @dev: ATA device
2737 * @cmd: SCSI command opcode to consider
2738 *
2739 * Look up the SCSI command given, and determine whether the
2740 * SCSI command is to be translated or simulated.
2741 *
2742 * RETURNS:
2743 * Pointer to translation function if possible, %NULL if not.
2744 */
2745
2746static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
2747{
2748 switch (cmd) {
2749 case READ_6:
2750 case READ_10:
2751 case READ_16:
2752
2753 case WRITE_6:
2754 case WRITE_10:
2755 case WRITE_16:
2756 return ata_scsi_rw_xlat;
2757
2758 case SYNCHRONIZE_CACHE:
2759 if (ata_try_flush_cache(dev))
2760 return ata_scsi_flush_xlat;
2761 break;
2762
2763 case VERIFY:
2764 case VERIFY_16:
2765 return ata_scsi_verify_xlat;
Jeff Garzikb0955182005-05-12 15:45:22 -04002766
2767 case ATA_12:
2768 case ATA_16:
2769 return ata_scsi_pass_thru;
Jeff Garzikda613962005-08-29 19:01:43 -04002770
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04002771 case START_STOP:
2772 return ata_scsi_start_stop_xlat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002773 }
2774
2775 return NULL;
2776}
2777
2778/**
2779 * ata_scsi_dump_cdb - dump SCSI command contents to dmesg
2780 * @ap: ATA port to which the command was being sent
2781 * @cmd: SCSI command to dump
2782 *
2783 * Prints the contents of a SCSI command via printk().
2784 */
2785
2786static inline void ata_scsi_dump_cdb(struct ata_port *ap,
2787 struct scsi_cmnd *cmd)
2788{
2789#ifdef ATA_DEBUG
2790 struct scsi_device *scsidev = cmd->device;
2791 u8 *scsicmd = cmd->cmnd;
2792
2793 DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
Tejun Heo44877b42007-02-21 01:06:51 +09002794 ap->print_id,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002795 scsidev->channel, scsidev->id, scsidev->lun,
2796 scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
2797 scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
2798 scsicmd[8]);
2799#endif
2800}
2801
Tejun Heo542b1442006-12-17 10:45:08 +09002802static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
Tejun Heo2115ea92006-05-15 21:03:39 +09002803 void (*done)(struct scsi_cmnd *),
2804 struct ata_device *dev)
Brian Kingeb3f0f92006-03-23 17:30:02 -06002805{
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002806 u8 scsi_op = scmd->cmnd[0];
2807 ata_xlat_func_t xlat_func;
Tejun Heo2115ea92006-05-15 21:03:39 +09002808 int rc = 0;
2809
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002810 if (dev->class == ATA_DEV_ATA) {
2811 if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len))
2812 goto bad_cdb_len;
2813
2814 xlat_func = ata_get_xlat_func(dev, scsi_op);
2815 } else {
2816 if (unlikely(!scmd->cmd_len))
2817 goto bad_cdb_len;
2818
2819 xlat_func = NULL;
2820 if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
2821 /* relay SCSI command to ATAPI device */
2822 if (unlikely(scmd->cmd_len > dev->cdb_len))
2823 goto bad_cdb_len;
2824
2825 xlat_func = atapi_xlat;
2826 } else {
2827 /* ATA_16 passthru, treat as an ATA command */
2828 if (unlikely(scmd->cmd_len > 16))
2829 goto bad_cdb_len;
2830
2831 xlat_func = ata_get_xlat_func(dev, scsi_op);
2832 }
Tejun Heo2e5704f2006-12-17 10:46:33 +09002833 }
2834
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002835 if (xlat_func)
2836 rc = ata_scsi_translate(dev, scmd, done, xlat_func);
2837 else
2838 ata_scsi_simulate(dev, scmd, done);
Tejun Heo2115ea92006-05-15 21:03:39 +09002839
2840 return rc;
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002841
2842 bad_cdb_len:
2843 DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n",
2844 scmd->cmd_len, scsi_op, dev->cdb_len);
2845 scmd->result = DID_ERROR << 16;
2846 done(scmd);
2847 return 0;
Brian Kingeb3f0f92006-03-23 17:30:02 -06002848}
2849
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850/**
2851 * ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device
2852 * @cmd: SCSI command to be sent
2853 * @done: Completion function, called when command is complete
2854 *
2855 * In some cases, this function translates SCSI commands into
2856 * ATA taskfiles, and queues the taskfiles to be sent to
2857 * hardware. In other cases, this function simulates a
2858 * SCSI device by evaluating and responding to certain
2859 * SCSI commands. This creates the overall effect of
2860 * ATA and ATAPI devices appearing as SCSI devices.
2861 *
2862 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002863 * Releases scsi-layer-held lock, and obtains host lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002864 *
2865 * RETURNS:
Tejun Heo2115ea92006-05-15 21:03:39 +09002866 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
2867 * 0 otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002868 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
2870{
2871 struct ata_port *ap;
2872 struct ata_device *dev;
2873 struct scsi_device *scsidev = cmd->device;
Jeff Garzik005a5a02005-10-30 23:31:48 -05002874 struct Scsi_Host *shost = scsidev->host;
Tejun Heo2115ea92006-05-15 21:03:39 +09002875 int rc = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876
Jeff Garzik35bb94b2006-04-11 13:12:34 -04002877 ap = ata_shost_to_port(shost);
Jeff Garzik005a5a02005-10-30 23:31:48 -05002878
2879 spin_unlock(shost->host_lock);
Jeff Garzikba6a1302006-06-22 23:46:10 -04002880 spin_lock(ap->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002881
2882 ata_scsi_dump_cdb(ap, cmd);
2883
2884 dev = ata_scsi_find_dev(ap, scsidev);
Brian Kingeb3f0f92006-03-23 17:30:02 -06002885 if (likely(dev))
Tejun Heo2115ea92006-05-15 21:03:39 +09002886 rc = __ata_scsi_queuecmd(cmd, done, dev);
Brian Kingeb3f0f92006-03-23 17:30:02 -06002887 else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002888 cmd->result = (DID_BAD_TARGET << 16);
2889 done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890 }
2891
Jeff Garzikba6a1302006-06-22 23:46:10 -04002892 spin_unlock(ap->lock);
Jeff Garzik005a5a02005-10-30 23:31:48 -05002893 spin_lock(shost->host_lock);
Tejun Heo2115ea92006-05-15 21:03:39 +09002894 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895}
2896
2897/**
2898 * ata_scsi_simulate - simulate SCSI command on ATA device
Randy Dunlapc893a3a2006-01-28 13:15:32 -05002899 * @dev: the target device
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900 * @cmd: SCSI command being sent to device.
2901 * @done: SCSI command completion function.
2902 *
2903 * Interprets and directly executes a select list of SCSI commands
2904 * that can be handled internally.
2905 *
2906 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002907 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002908 */
2909
Tejun Heo3373efd2006-05-15 20:57:53 +09002910void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911 void (*done)(struct scsi_cmnd *))
2912{
2913 struct ata_scsi_args args;
Jeff Garzik057ace52005-10-22 14:27:05 -04002914 const u8 *scsicmd = cmd->cmnd;
Jeff Garzik45394142007-09-21 06:23:42 -04002915 u8 tmp8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002917 args.dev = dev;
2918 args.id = dev->id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919 args.cmd = cmd;
2920 args.done = done;
2921
2922 switch(scsicmd[0]) {
Jeff Garzik00bd0202007-09-21 07:26:08 -04002923 /* TODO: worth improving? */
2924 case FORMAT_UNIT:
2925 ata_scsi_invalid_field(cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926 break;
2927
2928 case INQUIRY:
2929 if (scsicmd[1] & 2) /* is CmdDt set? */
Douglas Gilbertae006512005-10-09 09:09:35 -04002930 ata_scsi_invalid_field(cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931 else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
2932 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
Jeff Garzikad355b42007-09-21 20:38:03 -04002933 else switch (scsicmd[2]) {
2934 case 0x00:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
Jeff Garzikad355b42007-09-21 20:38:03 -04002936 break;
2937 case 0x80:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
Jeff Garzikad355b42007-09-21 20:38:03 -04002939 break;
2940 case 0x83:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
Jeff Garzikad355b42007-09-21 20:38:03 -04002942 break;
2943 case 0x89:
2944 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89);
2945 break;
2946 default:
Douglas Gilbertae006512005-10-09 09:09:35 -04002947 ata_scsi_invalid_field(cmd, done);
Jeff Garzikad355b42007-09-21 20:38:03 -04002948 break;
2949 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002950 break;
2951
2952 case MODE_SENSE:
2953 case MODE_SENSE_10:
2954 ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
2955 break;
2956
2957 case MODE_SELECT: /* unconditionally return */
2958 case MODE_SELECT_10: /* bad-field-in-cdb */
Douglas Gilbertae006512005-10-09 09:09:35 -04002959 ata_scsi_invalid_field(cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002960 break;
2961
2962 case READ_CAPACITY:
2963 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2964 break;
2965
2966 case SERVICE_ACTION_IN:
2967 if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
2968 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2969 else
Douglas Gilbertae006512005-10-09 09:09:35 -04002970 ata_scsi_invalid_field(cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971 break;
2972
2973 case REPORT_LUNS:
2974 ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
2975 break;
2976
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977 case REQUEST_SENSE:
Jeff Garzik45394142007-09-21 06:23:42 -04002978 ata_scsi_set_sense(cmd, 0, 0, 0);
2979 cmd->result = (DRIVER_SENSE << 24);
2980 done(cmd);
2981 break;
2982
Jeff Garzik00bd0202007-09-21 07:26:08 -04002983 /* if we reach this, then writeback caching is disabled,
2984 * turning this into a no-op.
2985 */
2986 case SYNCHRONIZE_CACHE:
2987 /* fall through */
2988
2989 /* no-op's, complete with success */
2990 case REZERO_UNIT:
2991 case SEEK_6:
2992 case SEEK_10:
2993 case TEST_UNIT_READY:
2994 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
2995 break;
2996
Jeff Garzik45394142007-09-21 06:23:42 -04002997 case SEND_DIAGNOSTIC:
2998 tmp8 = scsicmd[1] & ~(1 << 3);
2999 if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
3000 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
3001 else
3002 ata_scsi_invalid_field(cmd, done);
3003 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003004
3005 /* all other commands */
3006 default:
Douglas Gilbertae006512005-10-09 09:09:35 -04003007 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
3008 /* "Invalid command operation code" */
3009 done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 break;
3011 }
3012}
3013
Tejun Heof3187192007-04-17 23:44:07 +09003014int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
3015{
3016 int i, rc;
3017
3018 for (i = 0; i < host->n_ports; i++) {
3019 struct ata_port *ap = host->ports[i];
3020 struct Scsi_Host *shost;
3021
3022 rc = -ENOMEM;
3023 shost = scsi_host_alloc(sht, sizeof(struct ata_port *));
3024 if (!shost)
3025 goto err_alloc;
3026
3027 *(struct ata_port **)&shost->hostdata[0] = ap;
3028 ap->scsi_host = shost;
3029
3030 shost->transportt = &ata_scsi_transport_template;
3031 shost->unique_id = ap->print_id;
3032 shost->max_id = 16;
3033 shost->max_lun = 1;
3034 shost->max_channel = 1;
3035 shost->max_cmd_len = 16;
3036
Tejun Heo31cc23b2007-09-23 13:14:12 +09003037 /* Schedule policy is determined by ->qc_defer()
3038 * callback and it needs to see every deferred qc.
3039 * Set host_blocked to 1 to prevent SCSI midlayer from
3040 * automatically deferring requests.
3041 */
3042 shost->max_host_blocked = 1;
3043
Tejun Heof3187192007-04-17 23:44:07 +09003044 rc = scsi_add_host(ap->scsi_host, ap->host->dev);
3045 if (rc)
3046 goto err_add;
3047 }
3048
3049 return 0;
3050
3051 err_add:
3052 scsi_host_put(host->ports[i]->scsi_host);
3053 err_alloc:
3054 while (--i >= 0) {
3055 struct Scsi_Host *shost = host->ports[i]->scsi_host;
3056
3057 scsi_remove_host(shost);
3058 scsi_host_put(shost);
3059 }
3060 return rc;
3061}
3062
Tejun Heo1ae46312007-07-16 14:29:40 +09003063void ata_scsi_scan_host(struct ata_port *ap, int sync)
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003064{
Tejun Heo1ae46312007-07-16 14:29:40 +09003065 int tries = 5;
3066 struct ata_device *last_failed_dev = NULL;
Tejun Heo41bda9c2007-08-06 18:36:24 +09003067 struct ata_link *link;
Tejun Heo1ae46312007-07-16 14:29:40 +09003068 struct ata_device *dev;
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003069
Tejun Heo198e0fe2006-04-02 18:51:52 +09003070 if (ap->flags & ATA_FLAG_DISABLED)
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003071 return;
3072
Tejun Heo1ae46312007-07-16 14:29:40 +09003073 repeat:
Tejun Heo41bda9c2007-08-06 18:36:24 +09003074 ata_port_for_each_link(link, ap) {
3075 ata_link_for_each_dev(dev, link) {
3076 struct scsi_device *sdev;
3077 int channel = 0, id = 0;
Jeff Garzik3f19ee82005-10-03 21:36:41 -04003078
Tejun Heo41bda9c2007-08-06 18:36:24 +09003079 if (!ata_dev_enabled(dev) || dev->sdev)
3080 continue;
Tejun Heo3edebac2006-05-31 18:27:40 +09003081
Tejun Heo41bda9c2007-08-06 18:36:24 +09003082 if (ata_is_host_link(link))
3083 id = dev->devno;
3084 else
3085 channel = link->pmp;
3086
3087 sdev = __scsi_add_device(ap->scsi_host, channel, id, 0,
3088 NULL);
3089 if (!IS_ERR(sdev)) {
3090 dev->sdev = sdev;
3091 scsi_device_put(sdev);
3092 }
Tejun Heo3edebac2006-05-31 18:27:40 +09003093 }
Jeff Garzik3f19ee82005-10-03 21:36:41 -04003094 }
Tejun Heo1ae46312007-07-16 14:29:40 +09003095
3096 /* If we scanned while EH was in progress or allocation
3097 * failure occurred, scan would have failed silently. Check
3098 * whether all devices are attached.
3099 */
Tejun Heo41bda9c2007-08-06 18:36:24 +09003100 ata_port_for_each_link(link, ap) {
3101 ata_link_for_each_dev(dev, link) {
3102 if (ata_dev_enabled(dev) && !dev->sdev)
3103 goto exit_loop;
3104 }
Tejun Heo1ae46312007-07-16 14:29:40 +09003105 }
Tejun Heo41bda9c2007-08-06 18:36:24 +09003106 exit_loop:
3107 if (!link)
Tejun Heo1ae46312007-07-16 14:29:40 +09003108 return;
3109
3110 /* we're missing some SCSI devices */
3111 if (sync) {
3112 /* If caller requested synchrnous scan && we've made
3113 * any progress, sleep briefly and repeat.
3114 */
3115 if (dev != last_failed_dev) {
3116 msleep(100);
3117 last_failed_dev = dev;
3118 goto repeat;
3119 }
3120
3121 /* We might be failing to detect boot device, give it
3122 * a few more chances.
3123 */
3124 if (--tries) {
3125 msleep(100);
3126 goto repeat;
3127 }
3128
3129 ata_port_printk(ap, KERN_ERR, "WARNING: synchronous SCSI scan "
3130 "failed without making any progress,\n"
3131 " switching to async\n");
3132 }
3133
3134 queue_delayed_work(ata_aux_wq, &ap->hotplug_task,
3135 round_jiffies_relative(HZ));
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003136}
Tejun Heo0ea035a2006-05-31 18:28:01 +09003137
3138/**
3139 * ata_scsi_offline_dev - offline attached SCSI device
3140 * @dev: ATA device to offline attached SCSI device for
3141 *
3142 * This function is called from ata_eh_hotplug() and responsible
3143 * for taking the SCSI device attached to @dev offline. This
Jeff Garzikcca39742006-08-24 03:19:22 -04003144 * function is called with host lock which protects dev->sdev
Tejun Heo0ea035a2006-05-31 18:28:01 +09003145 * against clearing.
3146 *
3147 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003148 * spin_lock_irqsave(host lock)
Tejun Heo0ea035a2006-05-31 18:28:01 +09003149 *
3150 * RETURNS:
3151 * 1 if attached SCSI device exists, 0 otherwise.
3152 */
3153int ata_scsi_offline_dev(struct ata_device *dev)
3154{
3155 if (dev->sdev) {
3156 scsi_device_set_state(dev->sdev, SDEV_OFFLINE);
3157 return 1;
3158 }
3159 return 0;
3160}
Tejun Heo580b21022006-05-31 18:28:05 +09003161
3162/**
3163 * ata_scsi_remove_dev - remove attached SCSI device
3164 * @dev: ATA device to remove attached SCSI device for
3165 *
3166 * This function is called from ata_eh_scsi_hotplug() and
3167 * responsible for removing the SCSI device attached to @dev.
3168 *
3169 * LOCKING:
3170 * Kernel thread context (may sleep).
3171 */
3172static void ata_scsi_remove_dev(struct ata_device *dev)
3173{
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003174 struct ata_port *ap = dev->link->ap;
Tejun Heo580b21022006-05-31 18:28:05 +09003175 struct scsi_device *sdev;
3176 unsigned long flags;
3177
3178 /* Alas, we need to grab scan_mutex to ensure SCSI device
3179 * state doesn't change underneath us and thus
3180 * scsi_device_get() always succeeds. The mutex locking can
3181 * be removed if there is __scsi_device_get() interface which
3182 * increments reference counts regardless of device state.
3183 */
Jeff Garzikcca39742006-08-24 03:19:22 -04003184 mutex_lock(&ap->scsi_host->scan_mutex);
Jeff Garzikba6a1302006-06-22 23:46:10 -04003185 spin_lock_irqsave(ap->lock, flags);
Tejun Heo580b21022006-05-31 18:28:05 +09003186
Jeff Garzikcca39742006-08-24 03:19:22 -04003187 /* clearing dev->sdev is protected by host lock */
Tejun Heo580b21022006-05-31 18:28:05 +09003188 sdev = dev->sdev;
3189 dev->sdev = NULL;
3190
3191 if (sdev) {
3192 /* If user initiated unplug races with us, sdev can go
Jeff Garzikcca39742006-08-24 03:19:22 -04003193 * away underneath us after the host lock and
Tejun Heo580b21022006-05-31 18:28:05 +09003194 * scan_mutex are released. Hold onto it.
3195 */
3196 if (scsi_device_get(sdev) == 0) {
3197 /* The following ensures the attached sdev is
3198 * offline on return from ata_scsi_offline_dev()
3199 * regardless it wins or loses the race
3200 * against this function.
3201 */
3202 scsi_device_set_state(sdev, SDEV_OFFLINE);
3203 } else {
3204 WARN_ON(1);
3205 sdev = NULL;
3206 }
3207 }
3208
Jeff Garzikba6a1302006-06-22 23:46:10 -04003209 spin_unlock_irqrestore(ap->lock, flags);
Jeff Garzikcca39742006-08-24 03:19:22 -04003210 mutex_unlock(&ap->scsi_host->scan_mutex);
Tejun Heo580b21022006-05-31 18:28:05 +09003211
3212 if (sdev) {
3213 ata_dev_printk(dev, KERN_INFO, "detaching (SCSI %s)\n",
3214 sdev->sdev_gendev.bus_id);
3215
3216 scsi_remove_device(sdev);
3217 scsi_device_put(sdev);
3218 }
3219}
3220
Tejun Heo41bda9c2007-08-06 18:36:24 +09003221static void ata_scsi_handle_link_detach(struct ata_link *link)
3222{
3223 struct ata_port *ap = link->ap;
3224 struct ata_device *dev;
3225
3226 ata_link_for_each_dev(dev, link) {
3227 unsigned long flags;
3228
3229 if (!(dev->flags & ATA_DFLAG_DETACHED))
3230 continue;
3231
3232 spin_lock_irqsave(ap->lock, flags);
3233 dev->flags &= ~ATA_DFLAG_DETACHED;
3234 spin_unlock_irqrestore(ap->lock, flags);
3235
3236 ata_scsi_remove_dev(dev);
3237 }
3238}
3239
Tejun Heo580b21022006-05-31 18:28:05 +09003240/**
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003241 * ata_scsi_media_change_notify - send media change event
3242 * @atadev: Pointer to the disk device with media change event
3243 *
3244 * Tell the block layer to send a media change notification
3245 * event.
3246 *
3247 * LOCKING:
Tejun Heo854c73a2007-09-23 13:14:11 +09003248 * spin_lock_irqsave(host lock)
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003249 */
Tejun Heo854c73a2007-09-23 13:14:11 +09003250void ata_scsi_media_change_notify(struct ata_device *dev)
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003251{
3252#ifdef OTHER_AN_PATCHES_HAVE_BEEN_APPLIED
Tejun Heo854c73a2007-09-23 13:14:11 +09003253 if (dev->sdev)
3254 scsi_device_event_notify(dev->sdev, SDEV_MEDIA_CHANGE);
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003255#endif
3256}
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003257
3258/**
Tejun Heo580b21022006-05-31 18:28:05 +09003259 * ata_scsi_hotplug - SCSI part of hotplug
David Howells65f27f32006-11-22 14:55:48 +00003260 * @work: Pointer to ATA port to perform SCSI hotplug on
Tejun Heo580b21022006-05-31 18:28:05 +09003261 *
3262 * Perform SCSI part of hotplug. It's executed from a separate
3263 * workqueue after EH completes. This is necessary because SCSI
3264 * hot plugging requires working EH and hot unplugging is
3265 * synchronized with hot plugging with a mutex.
3266 *
3267 * LOCKING:
3268 * Kernel thread context (may sleep).
3269 */
David Howells65f27f32006-11-22 14:55:48 +00003270void ata_scsi_hotplug(struct work_struct *work)
Tejun Heo580b21022006-05-31 18:28:05 +09003271{
David Howells65f27f32006-11-22 14:55:48 +00003272 struct ata_port *ap =
3273 container_of(work, struct ata_port, hotplug_task.work);
Tejun Heo41bda9c2007-08-06 18:36:24 +09003274 int i;
Tejun Heo580b21022006-05-31 18:28:05 +09003275
Tejun Heob51e9e52006-06-29 01:29:30 +09003276 if (ap->pflags & ATA_PFLAG_UNLOADING) {
Tejun Heo580b21022006-05-31 18:28:05 +09003277 DPRINTK("ENTER/EXIT - unloading\n");
3278 return;
3279 }
3280
3281 DPRINTK("ENTER\n");
3282
Tejun Heo41bda9c2007-08-06 18:36:24 +09003283 /* Unplug detached devices. We cannot use link iterator here
3284 * because PMP links have to be scanned even if PMP is
3285 * currently not attached. Iterate manually.
3286 */
3287 ata_scsi_handle_link_detach(&ap->link);
3288 if (ap->pmp_link)
3289 for (i = 0; i < SATA_PMP_MAX_PORTS; i++)
3290 ata_scsi_handle_link_detach(&ap->pmp_link[i]);
Tejun Heo580b21022006-05-31 18:28:05 +09003291
3292 /* scan for new ones */
Tejun Heo1ae46312007-07-16 14:29:40 +09003293 ata_scsi_scan_host(ap, 0);
Tejun Heo580b21022006-05-31 18:28:05 +09003294
3295 DPRINTK("EXIT\n");
3296}
Tejun Heo83c47bc2006-05-31 18:28:07 +09003297
3298/**
3299 * ata_scsi_user_scan - indication for user-initiated bus scan
3300 * @shost: SCSI host to scan
3301 * @channel: Channel to scan
3302 * @id: ID to scan
3303 * @lun: LUN to scan
3304 *
3305 * This function is called when user explicitly requests bus
3306 * scan. Set probe pending flag and invoke EH.
3307 *
3308 * LOCKING:
3309 * SCSI layer (we don't care)
3310 *
3311 * RETURNS:
3312 * Zero.
3313 */
3314static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
3315 unsigned int id, unsigned int lun)
3316{
3317 struct ata_port *ap = ata_shost_to_port(shost);
3318 unsigned long flags;
Tejun Heo41bda9c2007-08-06 18:36:24 +09003319 int devno, rc = 0;
Tejun Heo83c47bc2006-05-31 18:28:07 +09003320
3321 if (!ap->ops->error_handler)
3322 return -EOPNOTSUPP;
3323
Tejun Heo41bda9c2007-08-06 18:36:24 +09003324 if (lun != SCAN_WILD_CARD && lun)
Tejun Heo83c47bc2006-05-31 18:28:07 +09003325 return -EINVAL;
3326
Tejun Heo41bda9c2007-08-06 18:36:24 +09003327 if (ap->nr_pmp_links == 0) {
3328 if (channel != SCAN_WILD_CARD && channel)
3329 return -EINVAL;
3330 devno = id;
3331 } else {
3332 if (id != SCAN_WILD_CARD && id)
3333 return -EINVAL;
3334 devno = channel;
3335 }
3336
Jeff Garzikba6a1302006-06-22 23:46:10 -04003337 spin_lock_irqsave(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003338
Tejun Heo41bda9c2007-08-06 18:36:24 +09003339 if (devno == SCAN_WILD_CARD) {
3340 struct ata_link *link;
3341
3342 ata_port_for_each_link(link, ap) {
3343 struct ata_eh_info *ehi = &link->eh_info;
3344 ehi->probe_mask |= (1 << ata_link_max_devices(link)) - 1;
3345 ehi->action |= ATA_EH_SOFTRESET;
3346 }
Tejun Heo83c47bc2006-05-31 18:28:07 +09003347 } else {
Tejun Heo41bda9c2007-08-06 18:36:24 +09003348 struct ata_device *dev = ata_find_dev(ap, devno);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003349
3350 if (dev) {
Tejun Heo41bda9c2007-08-06 18:36:24 +09003351 struct ata_eh_info *ehi = &dev->link->eh_info;
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003352 ehi->probe_mask |= 1 << dev->devno;
3353 ehi->action |= ATA_EH_SOFTRESET;
3354 ehi->flags |= ATA_EHI_RESUME_LINK;
Tejun Heo83c47bc2006-05-31 18:28:07 +09003355 } else
3356 rc = -EINVAL;
3357 }
3358
Tejun Heo309afcb2006-09-30 18:07:17 +09003359 if (rc == 0) {
Tejun Heo83c47bc2006-05-31 18:28:07 +09003360 ata_port_schedule_eh(ap);
Tejun Heo309afcb2006-09-30 18:07:17 +09003361 spin_unlock_irqrestore(ap->lock, flags);
3362 ata_port_wait_eh(ap);
3363 } else
3364 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003365
3366 return rc;
3367}
zhao, forrest3057ac32006-06-12 12:01:34 +08003368
3369/**
Tejun Heod0171262006-06-12 22:51:14 +09003370 * ata_scsi_dev_rescan - initiate scsi_rescan_device()
David Howells65f27f32006-11-22 14:55:48 +00003371 * @work: Pointer to ATA port to perform scsi_rescan_device()
zhao, forrest3057ac32006-06-12 12:01:34 +08003372 *
Tejun Heod0171262006-06-12 22:51:14 +09003373 * After ATA pass thru (SAT) commands are executed successfully,
3374 * libata need to propagate the changes to SCSI layer. This
3375 * function must be executed from ata_aux_wq such that sdev
3376 * attach/detach don't race with rescan.
zhao, forrest3057ac32006-06-12 12:01:34 +08003377 *
Tejun Heod0171262006-06-12 22:51:14 +09003378 * LOCKING:
3379 * Kernel thread context (may sleep).
zhao, forrest3057ac32006-06-12 12:01:34 +08003380 */
David Howells65f27f32006-11-22 14:55:48 +00003381void ata_scsi_dev_rescan(struct work_struct *work)
zhao, forrest3057ac32006-06-12 12:01:34 +08003382{
David Howells65f27f32006-11-22 14:55:48 +00003383 struct ata_port *ap =
3384 container_of(work, struct ata_port, scsi_rescan_task);
Tejun Heo41bda9c2007-08-06 18:36:24 +09003385 struct ata_link *link;
Tejun Heof58229f2007-08-06 18:36:23 +09003386 struct ata_device *dev;
Tejun Heof84e7e42006-11-22 11:21:31 +09003387 unsigned long flags;
zhao, forrest3057ac32006-06-12 12:01:34 +08003388
Tejun Heof84e7e42006-11-22 11:21:31 +09003389 spin_lock_irqsave(ap->lock, flags);
zhao, forrest3057ac32006-06-12 12:01:34 +08003390
Tejun Heo41bda9c2007-08-06 18:36:24 +09003391 ata_port_for_each_link(link, ap) {
3392 ata_link_for_each_dev(dev, link) {
3393 struct scsi_device *sdev = dev->sdev;
Tejun Heof84e7e42006-11-22 11:21:31 +09003394
Tejun Heo41bda9c2007-08-06 18:36:24 +09003395 if (!ata_dev_enabled(dev) || !sdev)
3396 continue;
3397 if (scsi_device_get(sdev))
3398 continue;
Tejun Heof84e7e42006-11-22 11:21:31 +09003399
Tejun Heo41bda9c2007-08-06 18:36:24 +09003400 spin_unlock_irqrestore(ap->lock, flags);
3401 scsi_rescan_device(&(sdev->sdev_gendev));
3402 scsi_device_put(sdev);
3403 spin_lock_irqsave(ap->lock, flags);
3404 }
zhao, forrest3057ac32006-06-12 12:01:34 +08003405 }
Tejun Heof84e7e42006-11-22 11:21:31 +09003406
3407 spin_unlock_irqrestore(ap->lock, flags);
zhao, forrest3057ac32006-06-12 12:01:34 +08003408}
Brian King80289162006-08-07 14:27:31 -05003409
3410/**
3411 * ata_sas_port_alloc - Allocate port for a SAS attached SATA device
Jeff Garzik4f931372006-09-29 05:07:25 -04003412 * @host: ATA host container for all SAS ports
Brian King80289162006-08-07 14:27:31 -05003413 * @port_info: Information from low-level host driver
Jeff Garzikcca39742006-08-24 03:19:22 -04003414 * @shost: SCSI host that the scsi device is attached to
Brian King80289162006-08-07 14:27:31 -05003415 *
3416 * LOCKING:
3417 * PCI/etc. bus probe sem.
3418 *
3419 * RETURNS:
3420 * ata_port pointer on success / NULL on failure.
3421 */
3422
Jeff Garzikcca39742006-08-24 03:19:22 -04003423struct ata_port *ata_sas_port_alloc(struct ata_host *host,
Brian King80289162006-08-07 14:27:31 -05003424 struct ata_port_info *port_info,
Jeff Garzikcca39742006-08-24 03:19:22 -04003425 struct Scsi_Host *shost)
Brian King80289162006-08-07 14:27:31 -05003426{
Tejun Heof3187192007-04-17 23:44:07 +09003427 struct ata_port *ap;
Brian King80289162006-08-07 14:27:31 -05003428
Tejun Heof3187192007-04-17 23:44:07 +09003429 ap = ata_port_alloc(host);
Brian King80289162006-08-07 14:27:31 -05003430 if (!ap)
3431 return NULL;
3432
Tejun Heof3187192007-04-17 23:44:07 +09003433 ap->port_no = 0;
Jeff Garzikcca39742006-08-24 03:19:22 -04003434 ap->lock = shost->host_lock;
Tejun Heof3187192007-04-17 23:44:07 +09003435 ap->pio_mask = port_info->pio_mask;
3436 ap->mwdma_mask = port_info->mwdma_mask;
3437 ap->udma_mask = port_info->udma_mask;
3438 ap->flags |= port_info->flags;
3439 ap->ops = port_info->port_ops;
3440 ap->cbl = ATA_CBL_SATA;
3441
Brian King80289162006-08-07 14:27:31 -05003442 return ap;
3443}
3444EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
3445
3446/**
3447 * ata_sas_port_start - Set port up for dma.
3448 * @ap: Port to initialize
3449 *
3450 * Called just after data structures for each port are
3451 * initialized. Allocates DMA pad.
3452 *
3453 * May be used as the port_start() entry in ata_port_operations.
3454 *
3455 * LOCKING:
3456 * Inherited from caller.
3457 */
3458int ata_sas_port_start(struct ata_port *ap)
3459{
3460 return ata_pad_alloc(ap, ap->dev);
3461}
3462EXPORT_SYMBOL_GPL(ata_sas_port_start);
3463
3464/**
3465 * ata_port_stop - Undo ata_sas_port_start()
3466 * @ap: Port to shut down
3467 *
3468 * Frees the DMA pad.
3469 *
3470 * May be used as the port_stop() entry in ata_port_operations.
3471 *
3472 * LOCKING:
3473 * Inherited from caller.
3474 */
3475
3476void ata_sas_port_stop(struct ata_port *ap)
3477{
3478 ata_pad_free(ap, ap->dev);
3479}
3480EXPORT_SYMBOL_GPL(ata_sas_port_stop);
3481
3482/**
3483 * ata_sas_port_init - Initialize a SATA device
3484 * @ap: SATA port to initialize
3485 *
3486 * LOCKING:
3487 * PCI/etc. bus probe sem.
3488 *
3489 * RETURNS:
3490 * Zero on success, non-zero on error.
3491 */
3492
3493int ata_sas_port_init(struct ata_port *ap)
3494{
3495 int rc = ap->ops->port_start(ap);
3496
Tejun Heof3187192007-04-17 23:44:07 +09003497 if (!rc) {
3498 ap->print_id = ata_print_id++;
Brian King80289162006-08-07 14:27:31 -05003499 rc = ata_bus_probe(ap);
Tejun Heof3187192007-04-17 23:44:07 +09003500 }
Brian King80289162006-08-07 14:27:31 -05003501
3502 return rc;
3503}
3504EXPORT_SYMBOL_GPL(ata_sas_port_init);
3505
3506/**
3507 * ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
3508 * @ap: SATA port to destroy
3509 *
3510 */
3511
3512void ata_sas_port_destroy(struct ata_port *ap)
3513{
Tejun Heof0d36ef2007-01-20 16:00:28 +09003514 if (ap->ops->port_stop)
3515 ap->ops->port_stop(ap);
Brian King80289162006-08-07 14:27:31 -05003516 kfree(ap);
3517}
3518EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
3519
3520/**
3521 * ata_sas_slave_configure - Default slave_config routine for libata devices
3522 * @sdev: SCSI device to configure
3523 * @ap: ATA port to which SCSI device is attached
3524 *
3525 * RETURNS:
3526 * Zero.
3527 */
3528
3529int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
3530{
3531 ata_scsi_sdev_config(sdev);
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003532 ata_scsi_dev_config(sdev, ap->link.device);
Brian King80289162006-08-07 14:27:31 -05003533 return 0;
3534}
3535EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
3536
3537/**
3538 * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
3539 * @cmd: SCSI command to be sent
3540 * @done: Completion function, called when command is complete
3541 * @ap: ATA port to which the command is being sent
3542 *
3543 * RETURNS:
Brian King08475a12006-11-20 13:51:56 -06003544 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
3545 * 0 otherwise.
Brian King80289162006-08-07 14:27:31 -05003546 */
3547
3548int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
3549 struct ata_port *ap)
3550{
Brian King08475a12006-11-20 13:51:56 -06003551 int rc = 0;
3552
Brian King80289162006-08-07 14:27:31 -05003553 ata_scsi_dump_cdb(ap, cmd);
3554
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003555 if (likely(ata_scsi_dev_enabled(ap->link.device)))
3556 rc = __ata_scsi_queuecmd(cmd, done, ap->link.device);
Brian King80289162006-08-07 14:27:31 -05003557 else {
3558 cmd->result = (DID_BAD_TARGET << 16);
3559 done(cmd);
3560 }
Brian King08475a12006-11-20 13:51:56 -06003561 return rc;
Brian King80289162006-08-07 14:27:31 -05003562}
3563EXPORT_SYMBOL_GPL(ata_sas_queuecmd);