blob: f5d5420a1ba2f79e4c6db55f83917305895e6cfa [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Jeff Garzikaf36d7f2005-08-28 20:18:39 -04002 * libata-scsi.c - helper library for ATA
3 *
4 * Maintained by: Jeff Garzik <jgarzik@pobox.com>
5 * Please ALWAYS copy linux-ide@vger.kernel.org
6 * on emails.
7 *
8 * Copyright 2003-2004 Red Hat, Inc. All rights reserved.
9 * Copyright 2003-2004 Jeff Garzik
10 *
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; see the file COPYING. If not, write to
24 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25 *
26 *
27 * libata documentation is available via 'make {ps|pdf}docs',
28 * as Documentation/DocBook/libata.*
29 *
30 * Hardware documentation available from
31 * - http://www.t10.org/
32 * - http://www.t13.org/
33 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070034 */
35
36#include <linux/kernel.h>
37#include <linux/blkdev.h>
38#include <linux/spinlock.h>
39#include <scsi/scsi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <scsi/scsi_host.h>
Christoph Hellwigbeb40482006-06-10 18:01:03 +020041#include <scsi/scsi_cmnd.h>
Mike Christie85837eb2005-11-11 16:38:53 -060042#include <scsi/scsi_eh.h>
Jeff Garzik005a5a02005-10-30 23:31:48 -050043#include <scsi/scsi_device.h>
Tejun Heoa6e6ce82006-05-15 21:03:48 +090044#include <scsi/scsi_tcq.h>
Tejun Heo30afc842006-03-18 18:40:14 +090045#include <scsi/scsi_transport.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include <linux/libata.h>
Jeff Garzikb0955182005-05-12 15:45:22 -040047#include <linux/hdreg.h>
Jeff Garzik2dcb4072007-10-19 06:42:56 -040048#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
50#include "libata.h"
51
Jeff Garzikb0955182005-05-12 15:45:22 -040052#define SECTOR_SIZE 512
53
Tejun Heoad706992006-12-17 10:45:57 +090054typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc);
Tejun Heoab5b3a52006-05-31 18:27:34 +090055
Jeff Garzik2dcb4072007-10-19 06:42:56 -040056static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
Tejun Heoab5b3a52006-05-31 18:27:34 +090057 const struct scsi_device *scsidev);
Jeff Garzik2dcb4072007-10-19 06:42:56 -040058static struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
Tejun Heoab5b3a52006-05-31 18:27:34 +090059 const struct scsi_device *scsidev);
Tejun Heo83c47bc2006-05-31 18:28:07 +090060static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
61 unsigned int id, unsigned int lun);
Tejun Heoab5b3a52006-05-31 18:27:34 +090062
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Douglas Gilbert00ac37f2005-10-28 15:58:28 -040064#define RW_RECOVERY_MPAGE 0x1
65#define RW_RECOVERY_MPAGE_LEN 12
66#define CACHE_MPAGE 0x8
67#define CACHE_MPAGE_LEN 20
68#define CONTROL_MPAGE 0xa
69#define CONTROL_MPAGE_LEN 12
70#define ALL_MPAGES 0x3f
71#define ALL_SUB_MPAGES 0xff
72
73
Jeff Garzik24f75682007-09-21 07:54:49 -040074static const u8 def_rw_recovery_mpage[RW_RECOVERY_MPAGE_LEN] = {
Douglas Gilbert00ac37f2005-10-28 15:58:28 -040075 RW_RECOVERY_MPAGE,
76 RW_RECOVERY_MPAGE_LEN - 2,
Jeff Garzik24f75682007-09-21 07:54:49 -040077 (1 << 7), /* AWRE */
Douglas Gilbert00ac37f2005-10-28 15:58:28 -040078 0, /* read retry count */
79 0, 0, 0, 0,
80 0, /* write retry count */
81 0, 0, 0
82};
83
84static const u8 def_cache_mpage[CACHE_MPAGE_LEN] = {
85 CACHE_MPAGE,
86 CACHE_MPAGE_LEN - 2,
87 0, /* contains WCE, needs to be 0 for logic */
88 0, 0, 0, 0, 0, 0, 0, 0, 0,
89 0, /* contains DRA, needs to be 0 for logic */
90 0, 0, 0, 0, 0, 0, 0
91};
92
93static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = {
94 CONTROL_MPAGE,
95 CONTROL_MPAGE_LEN - 2,
96 2, /* DSENSE=0, GLTSD=1 */
97 0, /* [QAM+QERR may be 1, see 05-359r1] */
98 0, 0, 0, 0, 0xff, 0xff,
99 0, 30 /* extended self test time, see 05-359r1 */
100};
101
Tejun Heo30afc842006-03-18 18:40:14 +0900102/*
103 * libata transport template. libata doesn't do real transport stuff.
104 * It just needs the eh_timed_out hook.
105 */
Tejun Heof3187192007-04-17 23:44:07 +0900106static struct scsi_transport_template ata_scsi_transport_template = {
Christoph Hellwig9227c332006-04-01 19:21:04 +0200107 .eh_strategy_handler = ata_scsi_error,
Tejun Heo30afc842006-03-18 18:40:14 +0900108 .eh_timed_out = ata_scsi_timed_out,
Tejun Heoccf68c32006-05-31 18:28:09 +0900109 .user_scan = ata_scsi_user_scan,
Tejun Heo30afc842006-03-18 18:40:14 +0900110};
111
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
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,
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400231 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,
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400255 sensebuf, (10*HZ), 5, 0);
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700256
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,
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400266 &sshdr);
267 if (sshdr.sense_key == 0 &&
268 sshdr.asc == 0 && sshdr.ascq == 0)
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700269 cmd_result &= ~SAM_STAT_CHECK_CONDITION;
270 }
271
272 /* Send userspace a few ATA registers (same as drivers/ide) */
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400273 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) */
Eran Tromerbbe1fe72006-10-10 14:29:25 -0700278 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);
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400353 if (sshdr.sense_key == 0 &&
354 sshdr.asc == 0 && sshdr.ascq == 0)
David Milburnaf068bd2007-01-30 00:59:15 -0800355 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
Tejun Heo9666f402007-05-04 21:27:47 +0200804 sdev->manage_start_stop = 1;
805
Tejun Heo31534362006-05-31 18:27:36 +0900806 if (dev)
Brian Kinga6cce2a2006-03-17 17:04:15 -0600807 ata_scsi_dev_config(sdev, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808
809 return 0; /* scsi layer doesn't check return value, sigh */
810}
811
812/**
Tejun Heo83c47bc2006-05-31 18:28:07 +0900813 * ata_scsi_slave_destroy - SCSI device is about to be destroyed
814 * @sdev: SCSI device to be destroyed
815 *
816 * @sdev is about to be destroyed for hot/warm unplugging. If
817 * this unplugging was initiated by libata as indicated by NULL
818 * dev->sdev, this function doesn't have to do anything.
819 * Otherwise, SCSI layer initiated warm-unplug is in progress.
820 * Clear dev->sdev, schedule the device for ATA detach and invoke
821 * EH.
822 *
823 * LOCKING:
824 * Defined by SCSI layer. We don't really care.
825 */
826void ata_scsi_slave_destroy(struct scsi_device *sdev)
827{
828 struct ata_port *ap = ata_shost_to_port(sdev->host);
829 unsigned long flags;
830 struct ata_device *dev;
831
832 if (!ap->ops->error_handler)
833 return;
834
Jeff Garzikba6a1302006-06-22 23:46:10 -0400835 spin_lock_irqsave(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +0900836 dev = __ata_scsi_find_dev(ap, sdev);
837 if (dev && dev->sdev) {
838 /* SCSI device already in CANCEL state, no need to offline it */
839 dev->sdev = NULL;
840 dev->flags |= ATA_DFLAG_DETACH;
841 ata_port_schedule_eh(ap);
842 }
Jeff Garzikba6a1302006-06-22 23:46:10 -0400843 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +0900844}
845
846/**
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900847 * ata_scsi_change_queue_depth - SCSI callback for queue depth config
848 * @sdev: SCSI device to configure queue depth for
849 * @queue_depth: new queue depth
850 *
851 * This is libata standard hostt->change_queue_depth callback.
852 * SCSI will call into this callback when user tries to set queue
853 * depth via sysfs.
854 *
855 * LOCKING:
856 * SCSI layer (we don't care)
857 *
858 * RETURNS:
859 * Newly configured queue depth.
860 */
861int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
862{
863 struct ata_port *ap = ata_shost_to_port(sdev->host);
864 struct ata_device *dev;
Tejun Heo360f6542006-09-30 19:45:00 +0900865 unsigned long flags;
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900866
Tejun Heoc3c70c42007-02-20 23:31:22 +0900867 if (queue_depth < 1 || queue_depth == sdev->queue_depth)
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900868 return sdev->queue_depth;
869
870 dev = ata_scsi_find_dev(ap, sdev);
871 if (!dev || !ata_dev_enabled(dev))
872 return sdev->queue_depth;
873
Tejun Heoc3c70c42007-02-20 23:31:22 +0900874 /* NCQ enabled? */
Tejun Heo360f6542006-09-30 19:45:00 +0900875 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc3c70c42007-02-20 23:31:22 +0900876 dev->flags &= ~ATA_DFLAG_NCQ_OFF;
877 if (queue_depth == 1 || !ata_ncq_enabled(dev)) {
Tejun Heo360f6542006-09-30 19:45:00 +0900878 dev->flags |= ATA_DFLAG_NCQ_OFF;
Tejun Heoc3c70c42007-02-20 23:31:22 +0900879 queue_depth = 1;
880 }
Tejun Heo360f6542006-09-30 19:45:00 +0900881 spin_unlock_irqrestore(ap->lock, flags);
882
Tejun Heoc3c70c42007-02-20 23:31:22 +0900883 /* limit and apply queue depth */
884 queue_depth = min(queue_depth, sdev->host->can_queue);
885 queue_depth = min(queue_depth, ata_id_queue_depth(dev->id));
886 queue_depth = min(queue_depth, ATA_MAX_QUEUE - 1);
887
888 if (sdev->queue_depth == queue_depth)
889 return -EINVAL;
890
891 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth);
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900892 return queue_depth;
893}
894
Tejun Heod9aca222007-05-17 16:43:26 +0200895/* XXX: for spindown warning */
Tejun Heoda071b42007-05-14 17:26:18 +0200896static void ata_delayed_done_timerfn(unsigned long arg)
897{
898 struct scsi_cmnd *scmd = (void *)arg;
899
900 scmd->scsi_done(scmd);
901}
902
Tejun Heod9aca222007-05-17 16:43:26 +0200903/* XXX: for spindown warning */
Tejun Heoda071b42007-05-14 17:26:18 +0200904static void ata_delayed_done(struct scsi_cmnd *scmd)
905{
906 static struct timer_list timer;
907
908 setup_timer(&timer, ata_delayed_done_timerfn, (unsigned long)scmd);
909 mod_timer(&timer, jiffies + 5 * HZ);
910}
911
Tejun Heoa6e6ce82006-05-15 21:03:48 +0900912/**
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400913 * ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command
914 * @qc: Storage for translated ATA taskfile
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400915 *
916 * Sets up an ATA taskfile to issue STANDBY (to stop) or READ VERIFY
917 * (to start). Perhaps these commands should be preceded by
918 * CHECK POWER MODE to see what power mode the device is already in.
919 * [See SAT revision 5 at www.t10.org]
920 *
921 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400922 * spin_lock_irqsave(host lock)
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400923 *
924 * RETURNS:
925 * Zero on success, non-zero on error.
926 */
Tejun Heoad706992006-12-17 10:45:57 +0900927static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400928{
Tejun Heo542b1442006-12-17 10:45:08 +0900929 struct scsi_cmnd *scmd = qc->scsicmd;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400930 struct ata_taskfile *tf = &qc->tf;
Tejun Heoad706992006-12-17 10:45:57 +0900931 const u8 *cdb = scmd->cmnd;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400932
Tejun Heo2e5704f2006-12-17 10:46:33 +0900933 if (scmd->cmd_len < 5)
934 goto invalid_fld;
935
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400936 tf->flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
937 tf->protocol = ATA_PROT_NODATA;
Tejun Heo542b1442006-12-17 10:45:08 +0900938 if (cdb[1] & 0x1) {
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400939 ; /* ignore IMMED bit, violates sat-r05 */
940 }
Tejun Heo542b1442006-12-17 10:45:08 +0900941 if (cdb[4] & 0x2)
Douglas Gilbertae006512005-10-09 09:09:35 -0400942 goto invalid_fld; /* LOEJ bit set not supported */
Tejun Heo542b1442006-12-17 10:45:08 +0900943 if (((cdb[4] >> 4) & 0xf) != 0)
Douglas Gilbertae006512005-10-09 09:09:35 -0400944 goto invalid_fld; /* power conditions not supported */
Tejun Heoe31e8532007-09-23 13:14:13 +0900945
946 if (qc->dev->horkage & ATA_HORKAGE_SKIP_PM) {
947 /* the device lacks PM support, finish without doing anything */
948 scmd->result = SAM_STAT_GOOD;
949 return 1;
950 }
951
Tejun Heo542b1442006-12-17 10:45:08 +0900952 if (cdb[4] & 0x1) {
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400953 tf->nsect = 1; /* 1 sector, lba=0 */
Albert Lee9d5b1302005-10-04 08:48:17 -0400954
955 if (qc->dev->flags & ATA_DFLAG_LBA) {
Tejun Heoc44078c2006-05-15 20:57:21 +0900956 tf->flags |= ATA_TFLAG_LBA;
Albert Lee9d5b1302005-10-04 08:48:17 -0400957
958 tf->lbah = 0x0;
959 tf->lbam = 0x0;
960 tf->lbal = 0x0;
961 tf->device |= ATA_LBA;
962 } else {
963 /* CHS */
964 tf->lbal = 0x1; /* sect */
965 tf->lbam = 0x0; /* cyl low */
966 tf->lbah = 0x0; /* cyl high */
967 }
968
Douglas Gilbert972dcaf2005-08-11 03:35:53 -0400969 tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
Tejun Heo920a4b12007-05-04 21:28:48 +0200970 } else {
971 /* XXX: This is for backward compatibility, will be
972 * removed. Read Documentation/feature-removal-schedule.txt
973 * for more info.
974 */
Tejun Heod9aca222007-05-17 16:43:26 +0200975 if ((qc->dev->flags & ATA_DFLAG_SPUNDOWN) &&
Tejun Heo920a4b12007-05-04 21:28:48 +0200976 (system_state == SYSTEM_HALT ||
977 system_state == SYSTEM_POWER_OFF)) {
Jeff Garzik2dcb4072007-10-19 06:42:56 -0400978 static unsigned long warned;
Tejun Heo920a4b12007-05-04 21:28:48 +0200979
Tejun Heoda071b42007-05-14 17:26:18 +0200980 if (!test_and_set_bit(0, &warned)) {
Tejun Heo920a4b12007-05-04 21:28:48 +0200981 ata_dev_printk(qc->dev, KERN_WARNING,
982 "DISK MIGHT NOT BE SPUN DOWN PROPERLY. "
983 "UPDATE SHUTDOWN UTILITY\n");
984 ata_dev_printk(qc->dev, KERN_WARNING,
985 "For more info, visit "
986 "http://linux-ata.org/shutdown.html\n");
Tejun Heoda071b42007-05-14 17:26:18 +0200987
988 /* ->scsi_done is not used, use it for
989 * delayed completion.
990 */
991 scmd->scsi_done = qc->scsidone;
992 qc->scsidone = ata_delayed_done;
Tejun Heo920a4b12007-05-04 21:28:48 +0200993 }
994 scmd->result = SAM_STAT_GOOD;
995 return 1;
996 }
997
Robert Hancock78981a72007-01-30 00:59:18 -0800998 /* Issue ATA STANDBY IMMEDIATE command */
999 tf->command = ATA_CMD_STANDBYNOW1;
Tejun Heo920a4b12007-05-04 21:28:48 +02001000 }
Robert Hancock78981a72007-01-30 00:59:18 -08001001
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001002 /*
1003 * Standby and Idle condition timers could be implemented but that
1004 * would require libata to implement the Power condition mode page
1005 * and allow the user to change it. Changing mode pages requires
1006 * MODE SELECT to be implemented.
1007 */
1008
1009 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001010
1011invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001012 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001013 /* "Invalid field in cbd" */
1014 return 1;
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04001015}
1016
1017
1018/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019 * ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command
1020 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021 *
1022 * Sets up an ATA taskfile to issue FLUSH CACHE or
1023 * FLUSH CACHE EXT.
1024 *
1025 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001026 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027 *
1028 * RETURNS:
1029 * Zero on success, non-zero on error.
1030 */
Tejun Heoad706992006-12-17 10:45:57 +09001031static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032{
1033 struct ata_taskfile *tf = &qc->tf;
1034
1035 tf->flags |= ATA_TFLAG_DEVICE;
1036 tf->protocol = ATA_PROT_NODATA;
1037
Tejun Heo6fc49ad2006-11-11 20:10:45 +09001038 if (qc->dev->flags & ATA_DFLAG_FLUSH_EXT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 tf->command = ATA_CMD_FLUSH_EXT;
1040 else
1041 tf->command = ATA_CMD_FLUSH;
1042
1043 return 0;
1044}
1045
1046/**
Albert Lee3aef5232005-10-04 08:47:43 -04001047 * scsi_6_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001048 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001049 *
1050 * Calculate LBA and transfer length for 6-byte commands.
1051 *
1052 * RETURNS:
1053 * @plba: the LBA
1054 * @plen: the transfer length
1055 */
Tejun Heo542b1442006-12-17 10:45:08 +09001056static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001057{
1058 u64 lba = 0;
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001059 u32 len;
Albert Lee3aef5232005-10-04 08:47:43 -04001060
1061 VPRINTK("six-byte command\n");
1062
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001063 lba |= ((u64)(cdb[1] & 0x1f)) << 16;
Tejun Heo542b1442006-12-17 10:45:08 +09001064 lba |= ((u64)cdb[2]) << 8;
1065 lba |= ((u64)cdb[3]);
Albert Lee3aef5232005-10-04 08:47:43 -04001066
Jeff Garzik6c7b7d22007-05-25 04:39:39 -04001067 len = cdb[4];
Albert Lee3aef5232005-10-04 08:47:43 -04001068
1069 *plba = lba;
1070 *plen = len;
1071}
1072
1073/**
1074 * scsi_10_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001075 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001076 *
1077 * Calculate LBA and transfer length for 10-byte commands.
1078 *
1079 * RETURNS:
1080 * @plba: the LBA
1081 * @plen: the transfer length
1082 */
Tejun Heo542b1442006-12-17 10:45:08 +09001083static void scsi_10_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001084{
1085 u64 lba = 0;
1086 u32 len = 0;
1087
1088 VPRINTK("ten-byte command\n");
1089
Tejun Heo542b1442006-12-17 10:45:08 +09001090 lba |= ((u64)cdb[2]) << 24;
1091 lba |= ((u64)cdb[3]) << 16;
1092 lba |= ((u64)cdb[4]) << 8;
1093 lba |= ((u64)cdb[5]);
Albert Lee3aef5232005-10-04 08:47:43 -04001094
Tejun Heo542b1442006-12-17 10:45:08 +09001095 len |= ((u32)cdb[7]) << 8;
1096 len |= ((u32)cdb[8]);
Albert Lee3aef5232005-10-04 08:47:43 -04001097
1098 *plba = lba;
1099 *plen = len;
1100}
1101
1102/**
1103 * scsi_16_lba_len - Get LBA and transfer length
Tejun Heo542b1442006-12-17 10:45:08 +09001104 * @cdb: SCSI command to translate
Albert Lee3aef5232005-10-04 08:47:43 -04001105 *
1106 * Calculate LBA and transfer length for 16-byte commands.
1107 *
1108 * RETURNS:
1109 * @plba: the LBA
1110 * @plen: the transfer length
1111 */
Tejun Heo542b1442006-12-17 10:45:08 +09001112static void scsi_16_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
Albert Lee3aef5232005-10-04 08:47:43 -04001113{
1114 u64 lba = 0;
1115 u32 len = 0;
1116
1117 VPRINTK("sixteen-byte command\n");
1118
Tejun Heo542b1442006-12-17 10:45:08 +09001119 lba |= ((u64)cdb[2]) << 56;
1120 lba |= ((u64)cdb[3]) << 48;
1121 lba |= ((u64)cdb[4]) << 40;
1122 lba |= ((u64)cdb[5]) << 32;
1123 lba |= ((u64)cdb[6]) << 24;
1124 lba |= ((u64)cdb[7]) << 16;
1125 lba |= ((u64)cdb[8]) << 8;
1126 lba |= ((u64)cdb[9]);
Albert Lee3aef5232005-10-04 08:47:43 -04001127
Tejun Heo542b1442006-12-17 10:45:08 +09001128 len |= ((u32)cdb[10]) << 24;
1129 len |= ((u32)cdb[11]) << 16;
1130 len |= ((u32)cdb[12]) << 8;
1131 len |= ((u32)cdb[13]);
Albert Lee3aef5232005-10-04 08:47:43 -04001132
1133 *plba = lba;
1134 *plen = len;
1135}
1136
1137/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138 * ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one
1139 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 *
1141 * Converts SCSI VERIFY command to an ATA READ VERIFY command.
1142 *
1143 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001144 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 *
1146 * RETURNS:
1147 * Zero on success, non-zero on error.
1148 */
Tejun Heoad706992006-12-17 10:45:57 +09001149static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150{
Tejun Heo542b1442006-12-17 10:45:08 +09001151 struct scsi_cmnd *scmd = qc->scsicmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 struct ata_taskfile *tf = &qc->tf;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001153 struct ata_device *dev = qc->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 u64 dev_sectors = qc->dev->n_sectors;
Tejun Heoad706992006-12-17 10:45:57 +09001155 const u8 *cdb = scmd->cmnd;
Albert Lee3aef5232005-10-04 08:47:43 -04001156 u64 block;
1157 u32 n_block;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158
1159 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
1160 tf->protocol = ATA_PROT_NODATA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161
Tejun Heo2e5704f2006-12-17 10:46:33 +09001162 if (cdb[0] == VERIFY) {
1163 if (scmd->cmd_len < 10)
1164 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001165 scsi_10_lba_len(cdb, &block, &n_block);
Tejun Heo2e5704f2006-12-17 10:46:33 +09001166 } else if (cdb[0] == VERIFY_16) {
1167 if (scmd->cmd_len < 16)
1168 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001169 scsi_16_lba_len(cdb, &block, &n_block);
Tejun Heo2e5704f2006-12-17 10:46:33 +09001170 } else
Douglas Gilbertae006512005-10-09 09:09:35 -04001171 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172
Albert Lee8bf62ec2005-05-12 15:29:42 -04001173 if (!n_block)
Douglas Gilbertae006512005-10-09 09:09:35 -04001174 goto nothing_to_do;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001175 if (block >= dev_sectors)
Douglas Gilbertae006512005-10-09 09:09:35 -04001176 goto out_of_range;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001177 if ((block + n_block) > dev_sectors)
Douglas Gilbertae006512005-10-09 09:09:35 -04001178 goto out_of_range;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179
Albert Lee07506692005-10-12 15:04:18 +08001180 if (dev->flags & ATA_DFLAG_LBA) {
1181 tf->flags |= ATA_TFLAG_LBA;
1182
Albert Leec6a33e22005-10-12 15:12:26 +08001183 if (lba_28_ok(block, n_block)) {
1184 /* use LBA28 */
1185 tf->command = ATA_CMD_VERIFY;
1186 tf->device |= (block >> 24) & 0xf;
1187 } else if (lba_48_ok(block, n_block)) {
1188 if (!(dev->flags & ATA_DFLAG_LBA48))
1189 goto out_of_range;
Albert Lee07506692005-10-12 15:04:18 +08001190
1191 /* use LBA48 */
1192 tf->flags |= ATA_TFLAG_LBA48;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001193 tf->command = ATA_CMD_VERIFY_EXT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194
Albert Lee8bf62ec2005-05-12 15:29:42 -04001195 tf->hob_nsect = (n_block >> 8) & 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196
Albert Lee8bf62ec2005-05-12 15:29:42 -04001197 tf->hob_lbah = (block >> 40) & 0xff;
1198 tf->hob_lbam = (block >> 32) & 0xff;
1199 tf->hob_lbal = (block >> 24) & 0xff;
Albert Leec6a33e22005-10-12 15:12:26 +08001200 } else
1201 /* request too large even for LBA48 */
1202 goto out_of_range;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001203
1204 tf->nsect = n_block & 0xff;
1205
1206 tf->lbah = (block >> 16) & 0xff;
1207 tf->lbam = (block >> 8) & 0xff;
1208 tf->lbal = block & 0xff;
1209
1210 tf->device |= ATA_LBA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 } else {
Albert Lee8bf62ec2005-05-12 15:29:42 -04001212 /* CHS */
1213 u32 sect, head, cyl, track;
1214
Albert Leec6a33e22005-10-12 15:12:26 +08001215 if (!lba_28_ok(block, n_block))
1216 goto out_of_range;
Albert Lee07506692005-10-12 15:04:18 +08001217
Albert Lee8bf62ec2005-05-12 15:29:42 -04001218 /* Convert LBA to CHS */
1219 track = (u32)block / dev->sectors;
1220 cyl = track / dev->heads;
1221 head = track % dev->heads;
1222 sect = (u32)block % dev->sectors + 1;
1223
Albert Leec187c4b2005-10-04 08:46:51 -04001224 DPRINTK("block %u track %u cyl %u head %u sect %u\n",
1225 (u32)block, track, cyl, head, sect);
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001226
1227 /* Check whether the converted CHS can fit.
1228 Cylinder: 0-65535
Albert Lee8bf62ec2005-05-12 15:29:42 -04001229 Head: 0-15
1230 Sector: 1-255*/
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001231 if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect))
Douglas Gilbertae006512005-10-09 09:09:35 -04001232 goto out_of_range;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001233
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 tf->command = ATA_CMD_VERIFY;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001235 tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */
1236 tf->lbal = sect;
1237 tf->lbam = cyl;
1238 tf->lbah = cyl >> 8;
1239 tf->device |= head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 }
1241
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001243
1244invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001245 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001246 /* "Invalid field in cbd" */
1247 return 1;
1248
1249out_of_range:
Tejun Heo542b1442006-12-17 10:45:08 +09001250 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001251 /* "Logical Block Address out of range" */
1252 return 1;
1253
1254nothing_to_do:
Tejun Heo542b1442006-12-17 10:45:08 +09001255 scmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001256 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257}
1258
1259/**
1260 * ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
1261 * @qc: Storage for translated ATA taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 *
1263 * Converts any of six SCSI read/write commands into the
1264 * ATA counterpart, including starting sector (LBA),
1265 * sector count, and taking into account the device's LBA48
1266 * support.
1267 *
1268 * Commands %READ_6, %READ_10, %READ_16, %WRITE_6, %WRITE_10, and
1269 * %WRITE_16 are currently supported.
1270 *
1271 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001272 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 *
1274 * RETURNS:
1275 * Zero on success, non-zero on error.
1276 */
Tejun Heoad706992006-12-17 10:45:57 +09001277static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001278{
Tejun Heo542b1442006-12-17 10:45:08 +09001279 struct scsi_cmnd *scmd = qc->scsicmd;
Tejun Heoad706992006-12-17 10:45:57 +09001280 const u8 *cdb = scmd->cmnd;
Tejun Heobd056d72006-11-14 22:47:10 +09001281 unsigned int tf_flags = 0;
Albert Lee3aef5232005-10-04 08:47:43 -04001282 u64 block;
1283 u32 n_block;
Tejun Heobd056d72006-11-14 22:47:10 +09001284 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285
Tejun Heo542b1442006-12-17 10:45:08 +09001286 if (cdb[0] == WRITE_10 || cdb[0] == WRITE_6 || cdb[0] == WRITE_16)
Tejun Heobd056d72006-11-14 22:47:10 +09001287 tf_flags |= ATA_TFLAG_WRITE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288
Tejun Heo9a3dccc2006-01-06 09:56:18 +01001289 /* Calculate the SCSI LBA, transfer length and FUA. */
Tejun Heo542b1442006-12-17 10:45:08 +09001290 switch (cdb[0]) {
Albert Lee3aef5232005-10-04 08:47:43 -04001291 case READ_10:
1292 case WRITE_10:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001293 if (unlikely(scmd->cmd_len < 10))
1294 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001295 scsi_10_lba_len(cdb, &block, &n_block);
1296 if (unlikely(cdb[1] & (1 << 3)))
Tejun Heobd056d72006-11-14 22:47:10 +09001297 tf_flags |= ATA_TFLAG_FUA;
Albert Lee3aef5232005-10-04 08:47:43 -04001298 break;
1299 case READ_6:
1300 case WRITE_6:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001301 if (unlikely(scmd->cmd_len < 6))
1302 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001303 scsi_6_lba_len(cdb, &block, &n_block);
Albert Leec187c4b2005-10-04 08:46:51 -04001304
1305 /* for 6-byte r/w commands, transfer length 0
1306 * means 256 blocks of data, not 0 block.
1307 */
Jeff Garzik76b2bf92005-08-29 19:24:43 -04001308 if (!n_block)
1309 n_block = 256;
Albert Lee3aef5232005-10-04 08:47:43 -04001310 break;
1311 case READ_16:
1312 case WRITE_16:
Tejun Heo2e5704f2006-12-17 10:46:33 +09001313 if (unlikely(scmd->cmd_len < 16))
1314 goto invalid_fld;
Tejun Heo542b1442006-12-17 10:45:08 +09001315 scsi_16_lba_len(cdb, &block, &n_block);
1316 if (unlikely(cdb[1] & (1 << 3)))
Tejun Heobd056d72006-11-14 22:47:10 +09001317 tf_flags |= ATA_TFLAG_FUA;
Albert Lee3aef5232005-10-04 08:47:43 -04001318 break;
1319 default:
Albert Lee8bf62ec2005-05-12 15:29:42 -04001320 DPRINTK("no-byte command\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04001321 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 }
1323
Albert Lee8bf62ec2005-05-12 15:29:42 -04001324 /* Check and compose ATA command */
1325 if (!n_block)
Albert Leec187c4b2005-10-04 08:46:51 -04001326 /* For 10-byte and 16-byte SCSI R/W commands, transfer
1327 * length 0 means transfer 0 block of data.
1328 * However, for ATA R/W commands, sector count 0 means
1329 * 256 or 65536 sectors, not 0 sectors as in SCSI.
Alan Coxf51750d2005-11-07 17:06:33 +00001330 *
1331 * WARNING: one or two older ATA drives treat 0 as 0...
Albert Leec187c4b2005-10-04 08:46:51 -04001332 */
Douglas Gilbertae006512005-10-09 09:09:35 -04001333 goto nothing_to_do;
Albert Lee8bf62ec2005-05-12 15:29:42 -04001334
Tejun Heobd056d72006-11-14 22:47:10 +09001335 qc->flags |= ATA_QCFLAG_IO;
Tejun Heo726f0782007-01-03 17:30:39 +09001336 qc->nbytes = n_block * ATA_SECT_SIZE;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001337
Tejun Heobd056d72006-11-14 22:47:10 +09001338 rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
1339 qc->tag);
1340 if (likely(rc == 0))
1341 return 0;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001342
Tejun Heobd056d72006-11-14 22:47:10 +09001343 if (rc == -ERANGE)
1344 goto out_of_range;
1345 /* treat all other errors as -EINVAL, fall through */
Douglas Gilbertae006512005-10-09 09:09:35 -04001346invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09001347 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001348 /* "Invalid field in cbd" */
1349 return 1;
1350
1351out_of_range:
Tejun Heo542b1442006-12-17 10:45:08 +09001352 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x21, 0x0);
Douglas Gilbertae006512005-10-09 09:09:35 -04001353 /* "Logical Block Address out of range" */
1354 return 1;
1355
1356nothing_to_do:
Tejun Heo542b1442006-12-17 10:45:08 +09001357 scmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001358 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359}
1360
Tejun Heo77853bf2006-01-23 13:09:36 +09001361static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362{
Tejun Heoc31f5712006-11-22 12:39:43 +09001363 struct ata_port *ap = qc->ap;
Tejun Heof58db802007-10-10 15:57:44 +09001364 struct ata_eh_info *ehi = &qc->dev->link->eh_info;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzika7dac442005-10-30 04:44:42 -05001366 u8 *cdb = cmd->cmnd;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001367 int need_sense = (qc->err_mask != 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368
zhao, forrest3057ac32006-06-12 12:01:34 +08001369 /* We snoop the SET_FEATURES - Write Cache ON/OFF command, and
1370 * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE
1371 * cache
1372 */
Albert Lee2c3d2a42007-06-07 16:01:17 +08001373 if (ap->ops->error_handler && !need_sense) {
1374 switch (qc->tf.command) {
1375 case ATA_CMD_SET_FEATURES:
1376 if ((qc->tf.feature == SETFEATURES_WC_ON) ||
1377 (qc->tf.feature == SETFEATURES_WC_OFF)) {
Tejun Heof58db802007-10-10 15:57:44 +09001378 ehi->action |= ATA_EH_REVALIDATE;
Albert Lee2c3d2a42007-06-07 16:01:17 +08001379 ata_port_schedule_eh(ap);
1380 }
1381 break;
1382
1383 case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
1384 case ATA_CMD_SET_MULTI: /* multi_count changed */
Tejun Heof58db802007-10-10 15:57:44 +09001385 ehi->action |= ATA_EH_REVALIDATE;
Albert Lee2c3d2a42007-06-07 16:01:17 +08001386 ata_port_schedule_eh(ap);
1387 break;
1388 }
zhao, forrest3057ac32006-06-12 12:01:34 +08001389 }
1390
Jeff Garzikb0955182005-05-12 15:45:22 -04001391 /* For ATA pass thru (SAT) commands, generate a sense block if
1392 * user mandated it or if there's an error. Note that if we
1393 * generate because the user forced us to, a check condition
1394 * is generated and the ATA register values are returned
1395 * whether the command completed successfully or not. If there
1396 * was no error, SK, ASC and ASCQ will all be zero.
1397 */
Jeff Garzika7dac442005-10-30 04:44:42 -05001398 if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001399 ((cdb[2] & 0x20) || need_sense)) {
Tejun Heo750426a2006-11-14 22:37:35 +09001400 ata_gen_passthru_sense(qc);
Jeff Garzikb0955182005-05-12 15:45:22 -04001401 } else {
1402 if (!need_sense) {
1403 cmd->result = SAM_STAT_GOOD;
1404 } else {
1405 /* TODO: decide which descriptor format to use
1406 * for 48b LBA devices and call that here
1407 * instead of the fixed desc, which is only
1408 * good for smaller LBA (and maybe CHS?)
1409 * devices.
1410 */
Tejun Heo750426a2006-11-14 22:37:35 +09001411 ata_gen_ata_sense(qc);
Jeff Garzikb0955182005-05-12 15:45:22 -04001412 }
1413 }
1414
Tejun Heod9aca222007-05-17 16:43:26 +02001415 /* XXX: track spindown state for spindown skipping and warning */
Tejun Heo13b8d092007-05-15 12:29:22 +02001416 if (unlikely(qc->tf.command == ATA_CMD_STANDBY ||
1417 qc->tf.command == ATA_CMD_STANDBYNOW1))
1418 qc->dev->flags |= ATA_DFLAG_SPUNDOWN;
1419 else if (likely(system_state != SYSTEM_HALT &&
1420 system_state != SYSTEM_POWER_OFF))
1421 qc->dev->flags &= ~ATA_DFLAG_SPUNDOWN;
1422
Tejun Heoc31f5712006-11-22 12:39:43 +09001423 if (need_sense && !ap->ops->error_handler)
Tejun Heo44877b42007-02-21 01:06:51 +09001424 ata_dump_status(ap->print_id, &qc->result_tf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425
1426 qc->scsidone(cmd);
1427
Tejun Heo77853bf2006-01-23 13:09:36 +09001428 ata_qc_free(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429}
1430
1431/**
1432 * ata_scsi_translate - Translate then issue SCSI command to ATA device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 * @dev: ATA device to which the command is addressed
1434 * @cmd: SCSI command to execute
1435 * @done: SCSI command completion function
1436 * @xlat_func: Actor which translates @cmd to an ATA taskfile
1437 *
1438 * Our ->queuecommand() function has decided that the SCSI
1439 * command issued can be directly translated into an ATA
1440 * command, rather than handled internally.
1441 *
1442 * This function sets up an ata_queued_cmd structure for the
1443 * SCSI command, and sends that ata_queued_cmd to the hardware.
1444 *
Douglas Gilbertae006512005-10-09 09:09:35 -04001445 * The xlat_func argument (actor) returns 0 if ready to execute
1446 * ATA command, else 1 to finish translation. If 1 is returned
1447 * then cmd->result (and possibly cmd->sense_buffer) are assumed
1448 * to be set reflecting an error condition or clean (early)
1449 * termination.
1450 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001452 * spin_lock_irqsave(host lock)
Tejun Heo2115ea92006-05-15 21:03:39 +09001453 *
1454 * RETURNS:
1455 * 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command
1456 * needs to be deferred.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 */
Tejun Heo2115ea92006-05-15 21:03:39 +09001458static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
1459 void (*done)(struct scsi_cmnd *),
1460 ata_xlat_func_t xlat_func)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461{
Tejun Heo31cc23b2007-09-23 13:14:12 +09001462 struct ata_port *ap = dev->link->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463 struct ata_queued_cmd *qc;
Tejun Heo31cc23b2007-09-23 13:14:12 +09001464 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465
1466 VPRINTK("ENTER\n");
1467
Tejun Heo3373efd2006-05-15 20:57:53 +09001468 qc = ata_scsi_qc_new(dev, cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469 if (!qc)
Douglas Gilbertae006512005-10-09 09:09:35 -04001470 goto err_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471
1472 /* data is present; dma-map it */
be7db052005-04-17 15:26:13 -05001473 if (cmd->sc_data_direction == DMA_FROM_DEVICE ||
1474 cmd->sc_data_direction == DMA_TO_DEVICE) {
Boaz Harrosh71201652007-09-18 17:48:50 +02001475 if (unlikely(scsi_bufflen(cmd) < 1)) {
Tejun Heof15a1da2006-05-15 20:57:56 +09001476 ata_dev_printk(dev, KERN_WARNING,
1477 "WARNING: zero len r/w req\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04001478 goto err_did;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 }
1480
Boaz Harrosh71201652007-09-18 17:48:50 +02001481 ata_sg_init(qc, scsi_sglist(cmd), scsi_sg_count(cmd));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482
1483 qc->dma_dir = cmd->sc_data_direction;
1484 }
1485
1486 qc->complete_fn = ata_scsi_qc_complete;
1487
Tejun Heoad706992006-12-17 10:45:57 +09001488 if (xlat_func(qc))
Douglas Gilbertae006512005-10-09 09:09:35 -04001489 goto early_finish;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490
Tejun Heo31cc23b2007-09-23 13:14:12 +09001491 if (ap->ops->qc_defer) {
1492 if ((rc = ap->ops->qc_defer(qc)))
1493 goto defer;
1494 }
1495
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 /* select device, send command to hardware */
Tejun Heo8e0e6942006-03-31 20:41:11 +09001497 ata_qc_issue(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498
1499 VPRINTK("EXIT\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001500 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501
Douglas Gilbertae006512005-10-09 09:09:35 -04001502early_finish:
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001503 ata_qc_free(qc);
Tejun Heoda071b42007-05-14 17:26:18 +02001504 qc->scsidone(cmd);
Douglas Gilbertae006512005-10-09 09:09:35 -04001505 DPRINTK("EXIT - early finish (good or error)\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001506 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04001507
1508err_did:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509 ata_qc_free(qc);
Douglas Gilbertae006512005-10-09 09:09:35 -04001510 cmd->result = (DID_ERROR << 16);
Tejun Heoda071b42007-05-14 17:26:18 +02001511 qc->scsidone(cmd);
Darrick J. Wong253b92e2006-11-14 09:55:41 -05001512err_mem:
Douglas Gilbertae006512005-10-09 09:09:35 -04001513 DPRINTK("EXIT - internal\n");
Tejun Heo2115ea92006-05-15 21:03:39 +09001514 return 0;
Tejun Heo3dc1d882006-05-15 21:03:45 +09001515
1516defer:
Tejun Heo31cc23b2007-09-23 13:14:12 +09001517 ata_qc_free(qc);
Tejun Heo3dc1d882006-05-15 21:03:45 +09001518 DPRINTK("EXIT - defer\n");
Tejun Heo31cc23b2007-09-23 13:14:12 +09001519 if (rc == ATA_DEFER_LINK)
1520 return SCSI_MLQUEUE_DEVICE_BUSY;
1521 else
1522 return SCSI_MLQUEUE_HOST_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523}
1524
1525/**
1526 * ata_scsi_rbuf_get - Map response buffer.
1527 * @cmd: SCSI command containing buffer to be mapped.
1528 * @buf_out: Pointer to mapped area.
1529 *
1530 * Maps buffer contained within SCSI command @cmd.
1531 *
1532 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001533 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 *
1535 * RETURNS:
1536 * Length of response buffer.
1537 */
1538
1539static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
1540{
1541 u8 *buf;
1542 unsigned int buflen;
1543
Boaz Harrosh71201652007-09-18 17:48:50 +02001544 struct scatterlist *sg = scsi_sglist(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001546 if (sg) {
Jens Axboe45711f12007-10-22 21:19:53 +02001547 buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548 buflen = sg->length;
1549 } else {
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001550 buf = NULL;
1551 buflen = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552 }
1553
1554 *buf_out = buf;
1555 return buflen;
1556}
1557
1558/**
1559 * ata_scsi_rbuf_put - Unmap response buffer.
1560 * @cmd: SCSI command containing buffer to be unmapped.
1561 * @buf: buffer to unmap
1562 *
1563 * Unmaps response buffer contained within @cmd.
1564 *
1565 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001566 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 */
1568
1569static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
1570{
Boaz Harrosh71201652007-09-18 17:48:50 +02001571 struct scatterlist *sg = scsi_sglist(cmd);
Boaz Harroshe10b8c32007-09-18 17:46:12 +02001572 if (sg)
Jeff Garzikda02d2a2006-12-11 11:05:53 -05001573 kunmap_atomic(buf - sg->offset, KM_IRQ0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574}
1575
1576/**
1577 * ata_scsi_rbuf_fill - wrapper for SCSI command simulators
1578 * @args: device IDENTIFY data / SCSI command of interest.
1579 * @actor: Callback hook for desired SCSI command simulator
1580 *
1581 * Takes care of the hard work of simulating a SCSI command...
1582 * Mapping the response buffer, calling the command's handler,
1583 * and handling the handler's return value. This return value
1584 * indicates whether the handler wishes the SCSI command to be
Douglas Gilbertae006512005-10-09 09:09:35 -04001585 * completed successfully (0), or not (in which case cmd->result
1586 * and sense buffer are assumed to be set).
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587 *
1588 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001589 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590 */
1591
1592void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001593 unsigned int (*actor) (struct ata_scsi_args *args,
1594 u8 *rbuf, unsigned int buflen))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595{
1596 u8 *rbuf;
1597 unsigned int buflen, rc;
1598 struct scsi_cmnd *cmd = args->cmd;
1599
1600 buflen = ata_scsi_rbuf_get(cmd, &rbuf);
1601 memset(rbuf, 0, buflen);
1602 rc = actor(args, rbuf, buflen);
1603 ata_scsi_rbuf_put(cmd, rbuf);
1604
Douglas Gilbertae006512005-10-09 09:09:35 -04001605 if (rc == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606 cmd->result = SAM_STAT_GOOD;
Douglas Gilbertae006512005-10-09 09:09:35 -04001607 args->done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608}
1609
1610/**
Tejun Heo6a362612006-11-20 11:15:47 +09001611 * ATA_SCSI_RBUF_SET - helper to set values in SCSI response buffer
1612 * @idx: byte index into SCSI response buffer
1613 * @val: value to set
1614 *
1615 * To be used by SCSI command simulator functions. This macros
1616 * expects two local variables, u8 *rbuf and unsigned int buflen,
1617 * are in scope.
1618 *
1619 * LOCKING:
1620 * None.
1621 */
1622#define ATA_SCSI_RBUF_SET(idx, val) do { \
1623 if ((idx) < buflen) rbuf[(idx)] = (u8)(val); \
1624 } while (0)
1625
1626/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627 * ata_scsiop_inq_std - Simulate INQUIRY command
1628 * @args: device IDENTIFY data / SCSI command of interest.
1629 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1630 * @buflen: Response buffer length.
1631 *
1632 * Returns standard device identification data associated
Jeff Garzikb142eb62006-03-21 20:37:47 -05001633 * with non-VPD INQUIRY command output.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 *
1635 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001636 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637 */
1638
1639unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
1640 unsigned int buflen)
1641{
1642 u8 hdr[] = {
1643 TYPE_DISK,
1644 0,
1645 0x5, /* claim SPC-3 version compatibility */
1646 2,
1647 95 - 4
1648 };
1649
1650 /* set scsi removeable (RMB) bit per ata bit */
1651 if (ata_id_removeable(args->id))
1652 hdr[1] |= (1 << 7);
1653
1654 VPRINTK("ENTER\n");
1655
1656 memcpy(rbuf, hdr, sizeof(hdr));
1657
1658 if (buflen > 35) {
1659 memcpy(&rbuf[8], "ATA ", 8);
Tejun Heoa0cf7332007-01-02 20:18:49 +09001660 ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
1661 ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001662 if (rbuf[32] == 0 || rbuf[32] == ' ')
1663 memcpy(&rbuf[32], "n/a ", 4);
1664 }
1665
1666 if (buflen > 63) {
1667 const u8 versions[] = {
1668 0x60, /* SAM-3 (no version claimed) */
1669
1670 0x03,
1671 0x20, /* SBC-2 (no version claimed) */
1672
1673 0x02,
1674 0x60 /* SPC-3 (no version claimed) */
1675 };
1676
1677 memcpy(rbuf + 59, versions, sizeof(versions));
1678 }
1679
1680 return 0;
1681}
1682
1683/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001684 * ata_scsiop_inq_00 - Simulate INQUIRY VPD page 0, list of pages
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685 * @args: device IDENTIFY data / SCSI command of interest.
1686 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1687 * @buflen: Response buffer length.
1688 *
Jeff Garzikb142eb62006-03-21 20:37:47 -05001689 * Returns list of inquiry VPD pages available.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 *
1691 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001692 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693 */
1694
1695unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf,
1696 unsigned int buflen)
1697{
1698 const u8 pages[] = {
1699 0x00, /* page 0x00, this page */
1700 0x80, /* page 0x80, unit serial no page */
1701 0x83 /* page 0x83, device ident page */
1702 };
Jeff Garzikb142eb62006-03-21 20:37:47 -05001703 rbuf[3] = sizeof(pages); /* number of supported VPD pages */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704
1705 if (buflen > 6)
1706 memcpy(rbuf + 4, pages, sizeof(pages));
1707
1708 return 0;
1709}
1710
1711/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001712 * ata_scsiop_inq_80 - Simulate INQUIRY VPD page 80, device serial number
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 * @args: device IDENTIFY data / SCSI command of interest.
1714 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1715 * @buflen: Response buffer length.
1716 *
1717 * Returns ATA device serial number.
1718 *
1719 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001720 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721 */
1722
1723unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
1724 unsigned int buflen)
1725{
1726 const u8 hdr[] = {
1727 0,
1728 0x80, /* this page code */
1729 0,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001730 ATA_ID_SERNO_LEN, /* page len */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001731 };
1732 memcpy(rbuf, hdr, sizeof(hdr));
1733
Tejun Heoa0cf7332007-01-02 20:18:49 +09001734 if (buflen > (ATA_ID_SERNO_LEN + 4 - 1))
Tejun Heo6a62a042006-02-13 10:02:46 +09001735 ata_id_string(args->id, (unsigned char *) &rbuf[4],
Tejun Heoa0cf7332007-01-02 20:18:49 +09001736 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737
1738 return 0;
1739}
1740
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741/**
Jeff Garzikb142eb62006-03-21 20:37:47 -05001742 * ata_scsiop_inq_83 - Simulate INQUIRY VPD page 83, device identity
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 * @args: device IDENTIFY data / SCSI command of interest.
1744 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1745 * @buflen: Response buffer length.
1746 *
Jeff Garzikb142eb62006-03-21 20:37:47 -05001747 * Yields two logical unit device identification designators:
1748 * - vendor specific ASCII containing the ATA serial number
1749 * - SAT defined "t10 vendor id based" containing ASCII vendor
1750 * name ("ATA "), model and serial numbers.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 *
1752 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001753 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754 */
1755
1756unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
1757 unsigned int buflen)
1758{
Jeff Garzikb142eb62006-03-21 20:37:47 -05001759 int num;
1760 const int sat_model_serial_desc_len = 68;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001761
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762 rbuf[1] = 0x83; /* this page code */
Jeff Garzikb142eb62006-03-21 20:37:47 -05001763 num = 4;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764
Tejun Heoa0cf7332007-01-02 20:18:49 +09001765 if (buflen > (ATA_ID_SERNO_LEN + num + 3)) {
Jeff Garzikb142eb62006-03-21 20:37:47 -05001766 /* piv=0, assoc=lu, code_set=ACSII, designator=vendor */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001767 rbuf[num + 0] = 2;
Tejun Heoa0cf7332007-01-02 20:18:49 +09001768 rbuf[num + 3] = ATA_ID_SERNO_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001769 num += 4;
1770 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001771 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1772 num += ATA_ID_SERNO_LEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 }
Jeff Garzikb142eb62006-03-21 20:37:47 -05001774 if (buflen > (sat_model_serial_desc_len + num + 3)) {
1775 /* SAT defined lu model and serial numbers descriptor */
1776 /* piv=0, assoc=lu, code_set=ACSII, designator=t10 vendor id */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001777 rbuf[num + 0] = 2;
1778 rbuf[num + 1] = 1;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001779 rbuf[num + 3] = sat_model_serial_desc_len;
1780 num += 4;
1781 memcpy(rbuf + num, "ATA ", 8);
1782 num += 8;
1783 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001784 ATA_ID_PROD, ATA_ID_PROD_LEN);
1785 num += ATA_ID_PROD_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001786 ata_id_string(args->id, (unsigned char *) rbuf + num,
Tejun Heoa0cf7332007-01-02 20:18:49 +09001787 ATA_ID_SERNO, ATA_ID_SERNO_LEN);
1788 num += ATA_ID_SERNO_LEN;
Jeff Garzikb142eb62006-03-21 20:37:47 -05001789 }
1790 rbuf[3] = num - 4; /* page len (assume less than 256 bytes) */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 return 0;
1792}
1793
1794/**
Jeff Garzikad355b42007-09-21 20:38:03 -04001795 * ata_scsiop_inq_89 - Simulate INQUIRY VPD page 89, ATA info
1796 * @args: device IDENTIFY data / SCSI command of interest.
1797 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1798 * @buflen: Response buffer length.
1799 *
1800 * Yields SAT-specified ATA VPD page.
1801 *
1802 * LOCKING:
1803 * spin_lock_irqsave(host lock)
1804 */
1805
1806unsigned int ata_scsiop_inq_89(struct ata_scsi_args *args, u8 *rbuf,
1807 unsigned int buflen)
1808{
1809 u8 pbuf[60];
1810 struct ata_taskfile tf;
1811 unsigned int i;
1812
1813 if (!buflen)
1814 return 0;
1815
1816 memset(&pbuf, 0, sizeof(pbuf));
1817 memset(&tf, 0, sizeof(tf));
1818
1819 pbuf[1] = 0x89; /* our page code */
1820 pbuf[2] = (0x238 >> 8); /* page size fixed at 238h */
1821 pbuf[3] = (0x238 & 0xff);
1822
Jeff Garzikc78968b2007-09-21 21:03:28 -04001823 memcpy(&pbuf[8], "linux ", 8);
1824 memcpy(&pbuf[16], "libata ", 16);
1825 memcpy(&pbuf[32], DRV_VERSION, 4);
Jeff Garzikad355b42007-09-21 20:38:03 -04001826 ata_id_string(args->id, &pbuf[32], ATA_ID_FW_REV, 4);
1827
1828 /* we don't store the ATA device signature, so we fake it */
1829
1830 tf.command = ATA_DRDY; /* really, this is Status reg */
1831 tf.lbal = 0x1;
1832 tf.nsect = 0x1;
1833
1834 ata_tf_to_fis(&tf, 0, 1, &pbuf[36]); /* TODO: PMP? */
1835 pbuf[36] = 0x34; /* force D2H Reg FIS (34h) */
1836
1837 pbuf[56] = ATA_CMD_ID_ATA;
1838
1839 i = min(buflen, 60U);
1840 memcpy(rbuf, &pbuf[0], i);
1841 buflen -= i;
1842
1843 if (!buflen)
1844 return 0;
1845
1846 memcpy(&rbuf[60], &args->id[0], min(buflen, 512U));
1847 return 0;
1848}
1849
1850/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04001851 * ata_scsiop_noop - Command handler that simply returns success.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001852 * @args: device IDENTIFY data / SCSI command of interest.
1853 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1854 * @buflen: Response buffer length.
1855 *
1856 * No operation. Simply returns success to caller, to indicate
1857 * that the caller should successfully complete this SCSI command.
1858 *
1859 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001860 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861 */
1862
1863unsigned int ata_scsiop_noop(struct ata_scsi_args *args, u8 *rbuf,
1864 unsigned int buflen)
1865{
1866 VPRINTK("ENTER\n");
1867 return 0;
1868}
1869
1870/**
1871 * ata_msense_push - Push data onto MODE SENSE data output buffer
1872 * @ptr_io: (input/output) Location to store more output data
1873 * @last: End of output data buffer
1874 * @buf: Pointer to BLOB being added to output buffer
1875 * @buflen: Length of BLOB
1876 *
1877 * Store MODE SENSE data on an output buffer.
1878 *
1879 * LOCKING:
1880 * None.
1881 */
1882
1883static void ata_msense_push(u8 **ptr_io, const u8 *last,
1884 const u8 *buf, unsigned int buflen)
1885{
1886 u8 *ptr = *ptr_io;
1887
1888 if ((ptr + buflen - 1) > last)
1889 return;
1890
1891 memcpy(ptr, buf, buflen);
1892
1893 ptr += buflen;
1894
1895 *ptr_io = ptr;
1896}
1897
1898/**
1899 * ata_msense_caching - Simulate MODE SENSE caching info page
1900 * @id: device IDENTIFY data
1901 * @ptr_io: (input/output) Location to store more output data
1902 * @last: End of output data buffer
1903 *
1904 * Generate a caching info page, which conditionally indicates
1905 * write caching to the SCSI layer, depending on device
1906 * capabilities.
1907 *
1908 * LOCKING:
1909 * None.
1910 */
1911
1912static unsigned int ata_msense_caching(u16 *id, u8 **ptr_io,
1913 const u8 *last)
1914{
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001915 u8 page[CACHE_MPAGE_LEN];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001916
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001917 memcpy(page, def_cache_mpage, sizeof(page));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001918 if (ata_id_wcache_enabled(id))
1919 page[2] |= (1 << 2); /* write cache enable */
1920 if (!ata_id_rahead_enabled(id))
1921 page[12] |= (1 << 5); /* disable read ahead */
1922
1923 ata_msense_push(ptr_io, last, page, sizeof(page));
1924 return sizeof(page);
1925}
1926
1927/**
1928 * ata_msense_ctl_mode - Simulate MODE SENSE control mode page
1929 * @dev: Device associated with this MODE SENSE command
1930 * @ptr_io: (input/output) Location to store more output data
1931 * @last: End of output data buffer
1932 *
1933 * Generate a generic MODE SENSE control mode page.
1934 *
1935 * LOCKING:
1936 * None.
1937 */
1938
1939static unsigned int ata_msense_ctl_mode(u8 **ptr_io, const u8 *last)
1940{
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001941 ata_msense_push(ptr_io, last, def_control_mpage,
1942 sizeof(def_control_mpage));
1943 return sizeof(def_control_mpage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944}
1945
1946/**
1947 * ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page
1948 * @dev: Device associated with this MODE SENSE command
1949 * @ptr_io: (input/output) Location to store more output data
1950 * @last: End of output data buffer
1951 *
1952 * Generate a generic MODE SENSE r/w error recovery page.
1953 *
1954 * LOCKING:
1955 * None.
1956 */
1957
1958static unsigned int ata_msense_rw_recovery(u8 **ptr_io, const u8 *last)
1959{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001960
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001961 ata_msense_push(ptr_io, last, def_rw_recovery_mpage,
1962 sizeof(def_rw_recovery_mpage));
1963 return sizeof(def_rw_recovery_mpage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964}
1965
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001966/*
1967 * We can turn this into a real blacklist if it's needed, for now just
1968 * blacklist any Maxtor BANC1G10 revision firmware
1969 */
1970static int ata_dev_supports_fua(u16 *id)
1971{
Tejun Heoa0cf7332007-01-02 20:18:49 +09001972 unsigned char model[ATA_ID_PROD_LEN + 1], fw[ATA_ID_FW_REV_LEN + 1];
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001973
Jeff Garzikc3c013a2006-02-27 22:31:19 -05001974 if (!libata_fua)
1975 return 0;
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001976 if (!ata_id_has_fua(id))
1977 return 0;
1978
Tejun Heoa0cf7332007-01-02 20:18:49 +09001979 ata_id_c_string(id, model, ATA_ID_PROD, sizeof(model));
1980 ata_id_c_string(id, fw, ATA_ID_FW_REV, sizeof(fw));
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001981
Tejun Heo2e026712006-02-12 22:47:04 +09001982 if (strcmp(model, "Maxtor"))
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001983 return 1;
Tejun Heo2e026712006-02-12 22:47:04 +09001984 if (strcmp(fw, "BANC1G10"))
Jens Axboe48bdc8e2006-01-30 16:09:35 +01001985 return 1;
1986
1987 return 0; /* blacklisted */
1988}
1989
Linus Torvalds1da177e2005-04-16 15:20:36 -07001990/**
1991 * ata_scsiop_mode_sense - Simulate MODE SENSE 6, 10 commands
1992 * @args: device IDENTIFY data / SCSI command of interest.
1993 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1994 * @buflen: Response buffer length.
1995 *
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04001996 * Simulate MODE SENSE commands. Assume this is invoked for direct
1997 * access devices (e.g. disks) only. There should be no block
1998 * descriptor for other device types.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 *
2000 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002001 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002 */
2003
2004unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf,
2005 unsigned int buflen)
2006{
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002007 struct ata_device *dev = args->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 u8 *scsicmd = args->cmd->cmnd, *p, *last;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002009 const u8 sat_blk_desc[] = {
2010 0, 0, 0, 0, /* number of blocks: sat unspecified */
2011 0,
2012 0, 0x2, 0x0 /* block length: 512 bytes */
2013 };
2014 u8 pg, spg;
2015 unsigned int ebd, page_control, six_byte, output_len, alloc_len, minlen;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002016 u8 dpofua;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002017
2018 VPRINTK("ENTER\n");
2019
2020 six_byte = (scsicmd[0] == MODE_SENSE);
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002021 ebd = !(scsicmd[1] & 0x8); /* dbd bit inverted == edb */
2022 /*
2023 * LLBA bit in msense(10) ignored (compliant)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024 */
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002025
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026 page_control = scsicmd[2] >> 6;
Douglas Gilbertae006512005-10-09 09:09:35 -04002027 switch (page_control) {
2028 case 0: /* current */
2029 break; /* supported */
2030 case 3: /* saved */
2031 goto saving_not_supp;
2032 case 1: /* changeable */
2033 case 2: /* defaults */
2034 default:
2035 goto invalid_fld;
2036 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002038 if (six_byte) {
2039 output_len = 4 + (ebd ? 8 : 0);
2040 alloc_len = scsicmd[4];
2041 } else {
2042 output_len = 8 + (ebd ? 8 : 0);
2043 alloc_len = (scsicmd[7] << 8) + scsicmd[8];
2044 }
2045 minlen = (alloc_len < buflen) ? alloc_len : buflen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046
2047 p = rbuf + output_len;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002048 last = rbuf + minlen - 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002050 pg = scsicmd[2] & 0x3f;
2051 spg = scsicmd[3];
2052 /*
2053 * No mode subpages supported (yet) but asking for _all_
2054 * subpages may be valid
2055 */
2056 if (spg && (spg != ALL_SUB_MPAGES))
2057 goto invalid_fld;
2058
2059 switch(pg) {
2060 case RW_RECOVERY_MPAGE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 output_len += ata_msense_rw_recovery(&p, last);
2062 break;
2063
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002064 case CACHE_MPAGE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065 output_len += ata_msense_caching(args->id, &p, last);
2066 break;
2067
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002068 case CONTROL_MPAGE: {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 output_len += ata_msense_ctl_mode(&p, last);
2070 break;
2071 }
2072
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002073 case ALL_MPAGES:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074 output_len += ata_msense_rw_recovery(&p, last);
2075 output_len += ata_msense_caching(args->id, &p, last);
2076 output_len += ata_msense_ctl_mode(&p, last);
2077 break;
2078
2079 default: /* invalid page code */
Douglas Gilbertae006512005-10-09 09:09:35 -04002080 goto invalid_fld;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081 }
2082
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002083 if (minlen < 1)
2084 return 0;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002085
2086 dpofua = 0;
Alan Coxf79d4092006-05-22 16:55:11 +01002087 if (ata_dev_supports_fua(args->id) && (dev->flags & ATA_DFLAG_LBA48) &&
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002088 (!(dev->flags & ATA_DFLAG_PIO) || dev->multi_count))
2089 dpofua = 1 << 4;
2090
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091 if (six_byte) {
2092 output_len--;
2093 rbuf[0] = output_len;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002094 if (minlen > 2)
2095 rbuf[2] |= dpofua;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002096 if (ebd) {
2097 if (minlen > 3)
2098 rbuf[3] = sizeof(sat_blk_desc);
2099 if (minlen > 11)
2100 memcpy(rbuf + 4, sat_blk_desc,
2101 sizeof(sat_blk_desc));
2102 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002103 } else {
2104 output_len -= 2;
2105 rbuf[0] = output_len >> 8;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002106 if (minlen > 1)
2107 rbuf[1] = output_len;
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002108 if (minlen > 3)
2109 rbuf[3] |= dpofua;
Douglas Gilbert00ac37f2005-10-28 15:58:28 -04002110 if (ebd) {
2111 if (minlen > 7)
2112 rbuf[7] = sizeof(sat_blk_desc);
2113 if (minlen > 15)
2114 memcpy(rbuf + 8, sat_blk_desc,
2115 sizeof(sat_blk_desc));
2116 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118 return 0;
Douglas Gilbertae006512005-10-09 09:09:35 -04002119
2120invalid_fld:
2121 ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x24, 0x0);
2122 /* "Invalid field in cbd" */
2123 return 1;
2124
2125saving_not_supp:
2126 ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x39, 0x0);
2127 /* "Saving parameters not supported" */
2128 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129}
2130
2131/**
2132 * ata_scsiop_read_cap - Simulate READ CAPACITY[ 16] commands
2133 * @args: device IDENTIFY data / SCSI command of interest.
2134 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2135 * @buflen: Response buffer length.
2136 *
2137 * Simulate READ CAPACITY commands.
2138 *
2139 * LOCKING:
Tejun Heo6a362612006-11-20 11:15:47 +09002140 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002143 unsigned int buflen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144{
Tejun Heo6a362612006-11-20 11:15:47 +09002145 u64 last_lba = args->dev->n_sectors - 1; /* LBA of the last block */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146
2147 VPRINTK("ENTER\n");
2148
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 if (args->cmd->cmnd[0] == READ_CAPACITY) {
Tejun Heo6a362612006-11-20 11:15:47 +09002150 if (last_lba >= 0xffffffffULL)
2151 last_lba = 0xffffffff;
Philip Pokorny0c144d02005-05-28 01:24:47 -07002152
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153 /* sector count, 32-bit */
Tejun Heo6a362612006-11-20 11:15:47 +09002154 ATA_SCSI_RBUF_SET(0, last_lba >> (8 * 3));
2155 ATA_SCSI_RBUF_SET(1, last_lba >> (8 * 2));
2156 ATA_SCSI_RBUF_SET(2, last_lba >> (8 * 1));
2157 ATA_SCSI_RBUF_SET(3, last_lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158
2159 /* sector size */
Tejun Heo6a362612006-11-20 11:15:47 +09002160 ATA_SCSI_RBUF_SET(6, ATA_SECT_SIZE >> 8);
2161 ATA_SCSI_RBUF_SET(7, ATA_SECT_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 } else {
2163 /* sector count, 64-bit */
Tejun Heo6a362612006-11-20 11:15:47 +09002164 ATA_SCSI_RBUF_SET(0, last_lba >> (8 * 7));
2165 ATA_SCSI_RBUF_SET(1, last_lba >> (8 * 6));
2166 ATA_SCSI_RBUF_SET(2, last_lba >> (8 * 5));
2167 ATA_SCSI_RBUF_SET(3, last_lba >> (8 * 4));
2168 ATA_SCSI_RBUF_SET(4, last_lba >> (8 * 3));
2169 ATA_SCSI_RBUF_SET(5, last_lba >> (8 * 2));
2170 ATA_SCSI_RBUF_SET(6, last_lba >> (8 * 1));
2171 ATA_SCSI_RBUF_SET(7, last_lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172
2173 /* sector size */
Tejun Heo6a362612006-11-20 11:15:47 +09002174 ATA_SCSI_RBUF_SET(10, ATA_SECT_SIZE >> 8);
2175 ATA_SCSI_RBUF_SET(11, ATA_SECT_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176 }
2177
2178 return 0;
2179}
2180
2181/**
2182 * ata_scsiop_report_luns - Simulate REPORT LUNS command
2183 * @args: device IDENTIFY data / SCSI command of interest.
2184 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
2185 * @buflen: Response buffer length.
2186 *
2187 * Simulate REPORT LUNS command.
2188 *
2189 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002190 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191 */
2192
2193unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
2194 unsigned int buflen)
2195{
2196 VPRINTK("ENTER\n");
2197 rbuf[3] = 8; /* just one lun, LUN 0, size 8 bytes */
2198
2199 return 0;
2200}
2201
2202/**
Douglas Gilbert845c5832005-10-09 08:55:41 -04002203 * ata_scsi_set_sense - Set SCSI sense data and status
2204 * @cmd: SCSI request to be handled
2205 * @sk: SCSI-defined sense key
2206 * @asc: SCSI-defined additional sense code
2207 * @ascq: SCSI-defined additional sense code qualifier
2208 *
2209 * Helper function that builds a valid fixed format, current
2210 * response code and the given sense key (sk), additional sense
2211 * code (asc) and additional sense code qualifier (ascq) with
2212 * a SCSI command status of %SAM_STAT_CHECK_CONDITION and
2213 * DRIVER_SENSE set in the upper bits of scsi_cmnd::result .
2214 *
2215 * LOCKING:
2216 * Not required
2217 */
2218
2219void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
2220{
2221 cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
2222
2223 cmd->sense_buffer[0] = 0x70; /* fixed format, current */
2224 cmd->sense_buffer[2] = sk;
2225 cmd->sense_buffer[7] = 18 - 8; /* additional sense length */
2226 cmd->sense_buffer[12] = asc;
2227 cmd->sense_buffer[13] = ascq;
2228}
2229
2230/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231 * ata_scsi_badcmd - End a SCSI request with an error
2232 * @cmd: SCSI request to be handled
2233 * @done: SCSI command completion function
2234 * @asc: SCSI-defined additional sense code
2235 * @ascq: SCSI-defined additional sense code qualifier
2236 *
2237 * Helper function that completes a SCSI command with
2238 * %SAM_STAT_CHECK_CONDITION, with a sense key %ILLEGAL_REQUEST
2239 * and the specified additional sense codes.
2240 *
2241 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002242 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243 */
2244
2245void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq)
2246{
2247 DPRINTK("ENTER\n");
Douglas Gilbertae006512005-10-09 09:09:35 -04002248 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, asc, ascq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249
2250 done(cmd);
2251}
2252
Tejun Heo77853bf2006-01-23 13:09:36 +09002253static void atapi_sense_complete(struct ata_queued_cmd *qc)
Jeff Garzika939c962005-10-05 17:09:16 -04002254{
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002255 if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0)) {
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002256 /* FIXME: not quite right; we don't want the
2257 * translation of taskfile registers into
2258 * a sense descriptors, since that's only
2259 * correct for ATA, not ATAPI
2260 */
Tejun Heo750426a2006-11-14 22:37:35 +09002261 ata_gen_passthru_sense(qc);
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002262 }
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002263
2264 qc->scsidone(qc->scsicmd);
Tejun Heo77853bf2006-01-23 13:09:36 +09002265 ata_qc_free(qc);
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002266}
2267
2268/* is it pointless to prefer PIO for "safety reasons"? */
2269static inline int ata_pio_use_silly(struct ata_port *ap)
2270{
2271 return (ap->flags & ATA_FLAG_PIO_DMA);
2272}
2273
2274static void atapi_request_sense(struct ata_queued_cmd *qc)
2275{
2276 struct ata_port *ap = qc->ap;
2277 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzika939c962005-10-05 17:09:16 -04002278
2279 DPRINTK("ATAPI request sense\n");
2280
Jeff Garzika939c962005-10-05 17:09:16 -04002281 /* FIXME: is this needed? */
2282 memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
2283
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002284 ap->ops->tf_read(ap, &qc->tf);
2285
2286 /* fill these in, for the case where they are -not- overwritten */
2287 cmd->sense_buffer[0] = 0x70;
2288 cmd->sense_buffer[2] = qc->tf.feature >> 4;
2289
2290 ata_qc_reinit(qc);
2291
Jeff Garzika939c962005-10-05 17:09:16 -04002292 ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer));
2293 qc->dma_dir = DMA_FROM_DEVICE;
2294
Tejun Heo6e7846e2006-02-12 23:32:58 +09002295 memset(&qc->cdb, 0, qc->dev->cdb_len);
Jeff Garzika939c962005-10-05 17:09:16 -04002296 qc->cdb[0] = REQUEST_SENSE;
2297 qc->cdb[4] = SCSI_SENSE_BUFFERSIZE;
2298
2299 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
2300 qc->tf.command = ATA_CMD_PACKET;
2301
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002302 if (ata_pio_use_silly(ap)) {
2303 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
2304 qc->tf.feature |= ATAPI_PKT_DMA;
2305 } else {
2306 qc->tf.protocol = ATA_PROT_ATAPI;
Alan Cox2db78dd2007-10-02 13:53:04 -07002307 qc->tf.lbam = SCSI_SENSE_BUFFERSIZE;
2308 qc->tf.lbah = 0;
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002309 }
Jeff Garzika939c962005-10-05 17:09:16 -04002310 qc->nbytes = SCSI_SENSE_BUFFERSIZE;
2311
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002312 qc->complete_fn = atapi_sense_complete;
Jeff Garzika939c962005-10-05 17:09:16 -04002313
Tejun Heo8e0e6942006-03-31 20:41:11 +09002314 ata_qc_issue(qc);
Jeff Garzika939c962005-10-05 17:09:16 -04002315
2316 DPRINTK("EXIT\n");
2317}
2318
Tejun Heo77853bf2006-01-23 13:09:36 +09002319static void atapi_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320{
2321 struct scsi_cmnd *cmd = qc->scsicmd;
Albert Leea22e2eb2005-12-05 15:38:02 +08002322 unsigned int err_mask = qc->err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323
Jeff Garzika7dac442005-10-30 04:44:42 -05002324 VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
Jeff Garzike12669e2005-10-05 18:39:23 -04002325
Tejun Heo246619d2006-05-15 20:58:16 +09002326 /* handle completion from new EH */
2327 if (unlikely(qc->ap->ops->error_handler &&
2328 (err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) {
2329
2330 if (!(qc->flags & ATA_QCFLAG_SENSE_VALID)) {
2331 /* FIXME: not quite right; we don't want the
2332 * translation of taskfile registers into a
2333 * sense descriptors, since that's only
2334 * correct for ATA, not ATAPI
2335 */
Tejun Heo750426a2006-11-14 22:37:35 +09002336 ata_gen_passthru_sense(qc);
Tejun Heo246619d2006-05-15 20:58:16 +09002337 }
2338
Tejun Heo22aac082006-08-08 14:08:59 +09002339 /* SCSI EH automatically locks door if sdev->locked is
2340 * set. Sometimes door lock request continues to
2341 * fail, for example, when no media is present. This
2342 * creates a loop - SCSI EH issues door lock which
2343 * fails and gets invoked again to acquire sense data
2344 * for the failed command.
2345 *
2346 * If door lock fails, always clear sdev->locked to
2347 * avoid this infinite loop.
2348 */
2349 if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL)
2350 qc->dev->sdev->locked = 0;
2351
Tejun Heo246619d2006-05-15 20:58:16 +09002352 qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
2353 qc->scsidone(cmd);
2354 ata_qc_free(qc);
2355 return;
2356 }
2357
2358 /* successful completion or old EH failure path */
Jeff Garzika7dac442005-10-30 04:44:42 -05002359 if (unlikely(err_mask & AC_ERR_DEV)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360 cmd->result = SAM_STAT_CHECK_CONDITION;
Jeff Garzikc6e6e662005-11-14 14:50:05 -05002361 atapi_request_sense(qc);
Tejun Heo77853bf2006-01-23 13:09:36 +09002362 return;
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002363 } else if (unlikely(err_mask)) {
Jeff Garzika7dac442005-10-30 04:44:42 -05002364 /* FIXME: not quite right; we don't want the
2365 * translation of taskfile registers into
2366 * a sense descriptors, since that's only
2367 * correct for ATA, not ATAPI
2368 */
Tejun Heo750426a2006-11-14 22:37:35 +09002369 ata_gen_passthru_sense(qc);
Tejun Heo74e6c8c2006-04-02 18:51:53 +09002370 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371 u8 *scsicmd = cmd->cmnd;
2372
Tony Battersbyfd71da42005-12-21 16:35:44 -05002373 if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374 u8 *buf = NULL;
2375 unsigned int buflen;
2376
2377 buflen = ata_scsi_rbuf_get(cmd, &buf);
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002378
2379 /* ATAPI devices typically report zero for their SCSI version,
2380 * and sometimes deviate from the spec WRT response data
2381 * format. If SCSI version is reported as zero like normal,
2382 * then we make the following fixups: 1) Fake MMC-5 version,
2383 * to indicate to the Linux scsi midlayer this is a modern
2384 * device. 2) Ensure response data format / ATAPI information
2385 * are always correct.
2386 */
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002387 if (buf[2] == 0) {
2388 buf[2] = 0x5;
2389 buf[3] = 0x32;
2390 }
2391
Linus Torvalds1da177e2005-04-16 15:20:36 -07002392 ata_scsi_rbuf_put(cmd, buf);
2393 }
Jeff Garzika15dbeb2005-10-05 15:02:14 -04002394
Linus Torvalds1da177e2005-04-16 15:20:36 -07002395 cmd->result = SAM_STAT_GOOD;
2396 }
2397
2398 qc->scsidone(cmd);
Tejun Heo77853bf2006-01-23 13:09:36 +09002399 ata_qc_free(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002400}
2401/**
2402 * atapi_xlat - Initialize PACKET taskfile
2403 * @qc: command structure to be initialized
Linus Torvalds1da177e2005-04-16 15:20:36 -07002404 *
2405 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002406 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002407 *
2408 * RETURNS:
2409 * Zero on success, non-zero on failure.
2410 */
Tejun Heoad706992006-12-17 10:45:57 +09002411static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002412{
Tejun Heo542b1442006-12-17 10:45:08 +09002413 struct scsi_cmnd *scmd = qc->scsicmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002414 struct ata_device *dev = qc->dev;
2415 int using_pio = (dev->flags & ATA_DFLAG_PIO);
Tejun Heo542b1442006-12-17 10:45:08 +09002416 int nodata = (scmd->sc_data_direction == DMA_NONE);
Alan Cox2db78dd2007-10-02 13:53:04 -07002417 unsigned int nbytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002418
Tejun Heo2e5704f2006-12-17 10:46:33 +09002419 memset(qc->cdb, 0, dev->cdb_len);
2420 memcpy(qc->cdb, scmd->cmnd, scmd->cmd_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002421
2422 qc->complete_fn = atapi_qc_complete;
2423
2424 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
Tejun Heo542b1442006-12-17 10:45:08 +09002425 if (scmd->sc_data_direction == DMA_TO_DEVICE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426 qc->tf.flags |= ATA_TFLAG_WRITE;
2427 DPRINTK("direction: write\n");
2428 }
2429
2430 qc->tf.command = ATA_CMD_PACKET;
Boaz Harrosh71201652007-09-18 17:48:50 +02002431 qc->nbytes = scsi_bufflen(scmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002432
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002433 /* check whether ATAPI DMA is safe */
2434 if (!using_pio && ata_check_atapi_dma(qc))
2435 using_pio = 1;
2436
Alan Cox2db78dd2007-10-02 13:53:04 -07002437 /* Some controller variants snoop this value for Packet transfers
2438 to do state machine and FIFO management. Thus we want to set it
2439 properly, and for DMA where it is effectively meaningless */
2440 nbytes = min(qc->nbytes, (unsigned int)63 * 1024);
2441
2442 qc->tf.lbam = (nbytes & 0xFF);
2443 qc->tf.lbah = (nbytes >> 8);
2444
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445 if (using_pio || nodata) {
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002446 /* no data, or PIO data xfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447 if (nodata)
2448 qc->tf.protocol = ATA_PROT_ATAPI_NODATA;
2449 else
2450 qc->tf.protocol = ATA_PROT_ATAPI;
Tejun Heoe00f1ff2007-06-27 02:47:35 +09002451 } else {
2452 /* DMA data xfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002453 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
2454 qc->tf.feature |= ATAPI_PKT_DMA;
2455
Tejun Heo542b1442006-12-17 10:45:08 +09002456 if (atapi_dmadir && (scmd->sc_data_direction != DMA_TO_DEVICE))
Albert Lee95de7192006-04-04 10:57:18 +08002457 /* some SATA bridges need us to indicate data xfer direction */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002458 qc->tf.feature |= ATAPI_DMADIR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459 }
2460
Alan Cox2db78dd2007-10-02 13:53:04 -07002461
2462 /* FIXME: We need to translate 0x05 READ_BLOCK_LIMITS to a MODE_SENSE
2463 as ATAPI tape drives don't get this right otherwise */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464 return 0;
2465}
2466
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002467static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
Tejun Heoab5b3a52006-05-31 18:27:34 +09002468{
Tejun Heo41bda9c2007-08-06 18:36:24 +09002469 if (ap->nr_pmp_links == 0) {
2470 if (likely(devno < ata_link_max_devices(&ap->link)))
2471 return &ap->link.device[devno];
2472 } else {
2473 if (likely(devno < ap->nr_pmp_links))
2474 return &ap->pmp_link[devno].device[0];
2475 }
2476
Tejun Heoab5b3a52006-05-31 18:27:34 +09002477 return NULL;
2478}
2479
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002480static struct ata_device *__ata_scsi_find_dev(struct ata_port *ap,
2481 const struct scsi_device *scsidev)
Tejun Heoab5b3a52006-05-31 18:27:34 +09002482{
Tejun Heo41bda9c2007-08-06 18:36:24 +09002483 int devno;
Tejun Heoab5b3a52006-05-31 18:27:34 +09002484
Tejun Heo41bda9c2007-08-06 18:36:24 +09002485 /* skip commands not addressed to targets we simulate */
2486 if (ap->nr_pmp_links == 0) {
2487 if (unlikely(scsidev->channel || scsidev->lun))
2488 return NULL;
2489 devno = scsidev->id;
2490 } else {
2491 if (unlikely(scsidev->id || scsidev->lun))
2492 return NULL;
2493 devno = scsidev->channel;
2494 }
2495
2496 return ata_find_dev(ap, devno);
Tejun Heoab5b3a52006-05-31 18:27:34 +09002497}
2498
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499/**
Brian King99ba9e02006-06-12 14:54:17 -05002500 * ata_scsi_dev_enabled - determine if device is enabled
2501 * @dev: ATA device
2502 *
2503 * Determine if commands should be sent to the specified device.
2504 *
2505 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002506 * spin_lock_irqsave(host lock)
Brian King99ba9e02006-06-12 14:54:17 -05002507 *
2508 * RETURNS:
2509 * 0 if commands are not allowed / 1 if commands are allowed
2510 */
2511
2512static int ata_scsi_dev_enabled(struct ata_device *dev)
2513{
2514 if (unlikely(!ata_dev_enabled(dev)))
2515 return 0;
2516
Tejun Heo9af5c9c2007-08-06 18:36:22 +09002517 if (!atapi_enabled || (dev->link->ap->flags & ATA_FLAG_NO_ATAPI)) {
Brian King99ba9e02006-06-12 14:54:17 -05002518 if (unlikely(dev->class == ATA_DEV_ATAPI)) {
2519 ata_dev_printk(dev, KERN_WARNING,
2520 "WARNING: ATAPI is %s, device ignored.\n",
2521 atapi_enabled ? "not supported with this driver" : "disabled");
2522 return 0;
2523 }
2524 }
2525
2526 return 1;
2527}
2528
2529/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002530 * ata_scsi_find_dev - lookup ata_device from scsi_cmnd
2531 * @ap: ATA port to which the device is attached
2532 * @scsidev: SCSI device from which we derive the ATA device
2533 *
2534 * Given various information provided in struct scsi_cmnd,
2535 * map that onto an ATA bus, and using that mapping
2536 * determine which ata_device is associated with the
2537 * SCSI command to be sent.
2538 *
2539 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002540 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002541 *
2542 * RETURNS:
2543 * Associated ATA device, or %NULL if not found.
2544 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002545static struct ata_device *
Jeff Garzik057ace52005-10-22 14:27:05 -04002546ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002547{
Tejun Heoab5b3a52006-05-31 18:27:34 +09002548 struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549
Brian King99ba9e02006-06-12 14:54:17 -05002550 if (unlikely(!dev || !ata_scsi_dev_enabled(dev)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002551 return NULL;
2552
Linus Torvalds1da177e2005-04-16 15:20:36 -07002553 return dev;
2554}
2555
Jeff Garzikb0955182005-05-12 15:45:22 -04002556/*
2557 * ata_scsi_map_proto - Map pass-thru protocol value to taskfile value.
2558 * @byte1: Byte 1 from pass-thru CDB.
2559 *
2560 * RETURNS:
2561 * ATA_PROT_UNKNOWN if mapping failed/unimplemented, protocol otherwise.
2562 */
2563static u8
2564ata_scsi_map_proto(u8 byte1)
2565{
2566 switch((byte1 & 0x1e) >> 1) {
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002567 case 3: /* Non-data */
2568 return ATA_PROT_NODATA;
Jeff Garzikb0955182005-05-12 15:45:22 -04002569
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002570 case 6: /* DMA */
2571 case 10: /* UDMA Data-in */
2572 case 11: /* UDMA Data-Out */
2573 return ATA_PROT_DMA;
Jeff Garzikb0955182005-05-12 15:45:22 -04002574
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002575 case 4: /* PIO Data-in */
2576 case 5: /* PIO Data-out */
2577 return ATA_PROT_PIO;
Jeff Garzikb0955182005-05-12 15:45:22 -04002578
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002579 case 0: /* Hard Reset */
2580 case 1: /* SRST */
2581 case 8: /* Device Diagnostic */
2582 case 9: /* Device Reset */
2583 case 7: /* DMA Queued */
2584 case 12: /* FPDMA */
2585 case 15: /* Return Response Info */
2586 default: /* Reserved */
2587 break;
Jeff Garzikb0955182005-05-12 15:45:22 -04002588 }
2589
2590 return ATA_PROT_UNKNOWN;
2591}
2592
2593/**
2594 * ata_scsi_pass_thru - convert ATA pass-thru CDB to taskfile
2595 * @qc: command structure to be initialized
Jeff Garzikb0955182005-05-12 15:45:22 -04002596 *
2597 * Handles either 12 or 16-byte versions of the CDB.
2598 *
2599 * RETURNS:
2600 * Zero on success, non-zero on failure.
2601 */
Tejun Heoad706992006-12-17 10:45:57 +09002602static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
Jeff Garzikb0955182005-05-12 15:45:22 -04002603{
2604 struct ata_taskfile *tf = &(qc->tf);
Tejun Heo542b1442006-12-17 10:45:08 +09002605 struct scsi_cmnd *scmd = qc->scsicmd;
Alan Coxf79d4092006-05-22 16:55:11 +01002606 struct ata_device *dev = qc->dev;
Tejun Heoad706992006-12-17 10:45:57 +09002607 const u8 *cdb = scmd->cmnd;
Jeff Garzikb0955182005-05-12 15:45:22 -04002608
Tejun Heo542b1442006-12-17 10:45:08 +09002609 if ((tf->protocol = ata_scsi_map_proto(cdb[1])) == ATA_PROT_UNKNOWN)
Tejun Heo9a405252005-12-02 11:49:11 +09002610 goto invalid_fld;
Jeff Garzik8190bdb2006-05-24 01:53:39 -04002611
Alan Coxf79d4092006-05-22 16:55:11 +01002612 /* We may not issue DMA commands if no DMA mode is set */
2613 if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
2614 goto invalid_fld;
Jeff Garzikb0955182005-05-12 15:45:22 -04002615
2616 /*
2617 * 12 and 16 byte CDBs use different offsets to
2618 * provide the various register values.
2619 */
Tejun Heo542b1442006-12-17 10:45:08 +09002620 if (cdb[0] == ATA_16) {
Jeff Garzikb0955182005-05-12 15:45:22 -04002621 /*
2622 * 16-byte CDB - may contain extended commands.
2623 *
2624 * If that is the case, copy the upper byte register values.
2625 */
Tejun Heo542b1442006-12-17 10:45:08 +09002626 if (cdb[1] & 0x01) {
2627 tf->hob_feature = cdb[3];
2628 tf->hob_nsect = cdb[5];
2629 tf->hob_lbal = cdb[7];
2630 tf->hob_lbam = cdb[9];
2631 tf->hob_lbah = cdb[11];
Jeff Garzikb0955182005-05-12 15:45:22 -04002632 tf->flags |= ATA_TFLAG_LBA48;
2633 } else
2634 tf->flags &= ~ATA_TFLAG_LBA48;
2635
2636 /*
2637 * Always copy low byte, device and command registers.
2638 */
Tejun Heo542b1442006-12-17 10:45:08 +09002639 tf->feature = cdb[4];
2640 tf->nsect = cdb[6];
2641 tf->lbal = cdb[8];
2642 tf->lbam = cdb[10];
2643 tf->lbah = cdb[12];
2644 tf->device = cdb[13];
2645 tf->command = cdb[14];
Jeff Garzikb0955182005-05-12 15:45:22 -04002646 } else {
2647 /*
2648 * 12-byte CDB - incapable of extended commands.
2649 */
2650 tf->flags &= ~ATA_TFLAG_LBA48;
2651
Tejun Heo542b1442006-12-17 10:45:08 +09002652 tf->feature = cdb[3];
2653 tf->nsect = cdb[4];
2654 tf->lbal = cdb[5];
2655 tf->lbam = cdb[6];
2656 tf->lbah = cdb[7];
2657 tf->device = cdb[8];
2658 tf->command = cdb[9];
Jeff Garzikb0955182005-05-12 15:45:22 -04002659 }
Albert Leefa4453c2007-06-07 15:52:07 +08002660
2661 /* enforce correct master/slave bit */
2662 tf->device = dev->devno ?
2663 tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
Jeff Garzikb0955182005-05-12 15:45:22 -04002664
Albert Lee1dce5892007-06-07 15:49:22 +08002665 /* sanity check for pio multi commands */
2666 if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf))
2667 goto invalid_fld;
2668
2669 if (is_multi_taskfile(tf)) {
2670 unsigned int multi_count = 1 << (cdb[1] >> 5);
2671
2672 /* compare the passed through multi_count
2673 * with the cached multi_count of libata
2674 */
2675 if (multi_count != dev->multi_count)
2676 ata_dev_printk(dev, KERN_WARNING,
2677 "invalid multi_count %u ignored\n",
2678 multi_count);
Alan Coxd26fc952007-07-06 19:13:52 -04002679 }
Albert Lee1dce5892007-06-07 15:49:22 +08002680
Mark Lord5a5dbd12007-03-16 10:22:26 -04002681 /* READ/WRITE LONG use a non-standard sect_size */
2682 qc->sect_size = ATA_SECT_SIZE;
2683 switch (tf->command) {
2684 case ATA_CMD_READ_LONG:
2685 case ATA_CMD_READ_LONG_ONCE:
2686 case ATA_CMD_WRITE_LONG:
2687 case ATA_CMD_WRITE_LONG_ONCE:
2688 if (tf->protocol != ATA_PROT_PIO || tf->nsect != 1)
2689 goto invalid_fld;
Boaz Harrosh71201652007-09-18 17:48:50 +02002690 qc->sect_size = scsi_bufflen(scmd);
Mark Lord5a5dbd12007-03-16 10:22:26 -04002691 }
2692
Jeff Garzikb0955182005-05-12 15:45:22 -04002693 /*
2694 * Filter SET_FEATURES - XFER MODE command -- otherwise,
2695 * SET_FEATURES - XFER MODE must be preceded/succeeded
2696 * by an update to hardware-specific registers for each
2697 * controller (i.e. the reason for ->set_piomode(),
2698 * ->set_dmamode(), and ->post_set_mode() hooks).
2699 */
2700 if ((tf->command == ATA_CMD_SET_FEATURES)
2701 && (tf->feature == SETFEATURES_XFER))
Tejun Heo9a405252005-12-02 11:49:11 +09002702 goto invalid_fld;
Jeff Garzikb0955182005-05-12 15:45:22 -04002703
2704 /*
2705 * Set flags so that all registers will be written,
2706 * and pass on write indication (used for PIO/DMA
2707 * setup.)
2708 */
2709 tf->flags |= (ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE);
2710
Tejun Heo542b1442006-12-17 10:45:08 +09002711 if (scmd->sc_data_direction == DMA_TO_DEVICE)
Jeff Garzikb0955182005-05-12 15:45:22 -04002712 tf->flags |= ATA_TFLAG_WRITE;
2713
2714 /*
2715 * Set transfer length.
2716 *
2717 * TODO: find out if we need to do more here to
2718 * cover scatter/gather case.
2719 */
Boaz Harrosh71201652007-09-18 17:48:50 +02002720 qc->nbytes = scsi_bufflen(scmd);
Jeff Garzikb0955182005-05-12 15:45:22 -04002721
Tejun Heoe61e0672006-05-15 20:57:40 +09002722 /* request result TF */
2723 qc->flags |= ATA_QCFLAG_RESULT_TF;
2724
Jeff Garzikb0955182005-05-12 15:45:22 -04002725 return 0;
Tejun Heo9a405252005-12-02 11:49:11 +09002726
2727 invalid_fld:
Tejun Heo542b1442006-12-17 10:45:08 +09002728 ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x00);
Tejun Heo9a405252005-12-02 11:49:11 +09002729 /* "Invalid field in cdb" */
2730 return 1;
Jeff Garzikb0955182005-05-12 15:45:22 -04002731}
2732
Linus Torvalds1da177e2005-04-16 15:20:36 -07002733/**
2734 * ata_get_xlat_func - check if SCSI to ATA translation is possible
2735 * @dev: ATA device
2736 * @cmd: SCSI command opcode to consider
2737 *
2738 * Look up the SCSI command given, and determine whether the
2739 * SCSI command is to be translated or simulated.
2740 *
2741 * RETURNS:
2742 * Pointer to translation function if possible, %NULL if not.
2743 */
2744
2745static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
2746{
2747 switch (cmd) {
2748 case READ_6:
2749 case READ_10:
2750 case READ_16:
2751
2752 case WRITE_6:
2753 case WRITE_10:
2754 case WRITE_16:
2755 return ata_scsi_rw_xlat;
2756
2757 case SYNCHRONIZE_CACHE:
2758 if (ata_try_flush_cache(dev))
2759 return ata_scsi_flush_xlat;
2760 break;
2761
2762 case VERIFY:
2763 case VERIFY_16:
2764 return ata_scsi_verify_xlat;
Jeff Garzikb0955182005-05-12 15:45:22 -04002765
2766 case ATA_12:
2767 case ATA_16:
2768 return ata_scsi_pass_thru;
Jeff Garzikda613962005-08-29 19:01:43 -04002769
Douglas Gilbert972dcaf2005-08-11 03:35:53 -04002770 case START_STOP:
2771 return ata_scsi_start_stop_xlat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002772 }
2773
2774 return NULL;
2775}
2776
2777/**
2778 * ata_scsi_dump_cdb - dump SCSI command contents to dmesg
2779 * @ap: ATA port to which the command was being sent
2780 * @cmd: SCSI command to dump
2781 *
2782 * Prints the contents of a SCSI command via printk().
2783 */
2784
2785static inline void ata_scsi_dump_cdb(struct ata_port *ap,
2786 struct scsi_cmnd *cmd)
2787{
2788#ifdef ATA_DEBUG
2789 struct scsi_device *scsidev = cmd->device;
2790 u8 *scsicmd = cmd->cmnd;
2791
2792 DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
Tejun Heo44877b42007-02-21 01:06:51 +09002793 ap->print_id,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002794 scsidev->channel, scsidev->id, scsidev->lun,
2795 scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
2796 scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
2797 scsicmd[8]);
2798#endif
2799}
2800
Tejun Heo542b1442006-12-17 10:45:08 +09002801static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
Tejun Heo2115ea92006-05-15 21:03:39 +09002802 void (*done)(struct scsi_cmnd *),
2803 struct ata_device *dev)
Brian Kingeb3f0f92006-03-23 17:30:02 -06002804{
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002805 u8 scsi_op = scmd->cmnd[0];
2806 ata_xlat_func_t xlat_func;
Tejun Heo2115ea92006-05-15 21:03:39 +09002807 int rc = 0;
2808
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002809 if (dev->class == ATA_DEV_ATA) {
2810 if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len))
2811 goto bad_cdb_len;
2812
2813 xlat_func = ata_get_xlat_func(dev, scsi_op);
2814 } else {
2815 if (unlikely(!scmd->cmd_len))
2816 goto bad_cdb_len;
2817
2818 xlat_func = NULL;
2819 if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
2820 /* relay SCSI command to ATAPI device */
2821 if (unlikely(scmd->cmd_len > dev->cdb_len))
2822 goto bad_cdb_len;
2823
2824 xlat_func = atapi_xlat;
2825 } else {
2826 /* ATA_16 passthru, treat as an ATA command */
2827 if (unlikely(scmd->cmd_len > 16))
2828 goto bad_cdb_len;
2829
2830 xlat_func = ata_get_xlat_func(dev, scsi_op);
2831 }
Tejun Heo2e5704f2006-12-17 10:46:33 +09002832 }
2833
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002834 if (xlat_func)
2835 rc = ata_scsi_translate(dev, scmd, done, xlat_func);
2836 else
2837 ata_scsi_simulate(dev, scmd, done);
Tejun Heo2115ea92006-05-15 21:03:39 +09002838
2839 return rc;
Mark Lordbaf4fdf2007-08-08 01:08:45 +09002840
2841 bad_cdb_len:
2842 DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n",
2843 scmd->cmd_len, scsi_op, dev->cdb_len);
2844 scmd->result = DID_ERROR << 16;
2845 done(scmd);
2846 return 0;
Brian Kingeb3f0f92006-03-23 17:30:02 -06002847}
2848
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849/**
2850 * ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device
2851 * @cmd: SCSI command to be sent
2852 * @done: Completion function, called when command is complete
2853 *
2854 * In some cases, this function translates SCSI commands into
2855 * ATA taskfiles, and queues the taskfiles to be sent to
2856 * hardware. In other cases, this function simulates a
2857 * SCSI device by evaluating and responding to certain
2858 * SCSI commands. This creates the overall effect of
2859 * ATA and ATAPI devices appearing as SCSI devices.
2860 *
2861 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002862 * Releases scsi-layer-held lock, and obtains host lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863 *
2864 * RETURNS:
Tejun Heo2115ea92006-05-15 21:03:39 +09002865 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
2866 * 0 otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002868int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
2869{
2870 struct ata_port *ap;
2871 struct ata_device *dev;
2872 struct scsi_device *scsidev = cmd->device;
Jeff Garzik005a5a02005-10-30 23:31:48 -05002873 struct Scsi_Host *shost = scsidev->host;
Tejun Heo2115ea92006-05-15 21:03:39 +09002874 int rc = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875
Jeff Garzik35bb94b2006-04-11 13:12:34 -04002876 ap = ata_shost_to_port(shost);
Jeff Garzik005a5a02005-10-30 23:31:48 -05002877
2878 spin_unlock(shost->host_lock);
Jeff Garzikba6a1302006-06-22 23:46:10 -04002879 spin_lock(ap->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002880
2881 ata_scsi_dump_cdb(ap, cmd);
2882
2883 dev = ata_scsi_find_dev(ap, scsidev);
Brian Kingeb3f0f92006-03-23 17:30:02 -06002884 if (likely(dev))
Tejun Heo2115ea92006-05-15 21:03:39 +09002885 rc = __ata_scsi_queuecmd(cmd, done, dev);
Brian Kingeb3f0f92006-03-23 17:30:02 -06002886 else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887 cmd->result = (DID_BAD_TARGET << 16);
2888 done(cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 }
2890
Jeff Garzikba6a1302006-06-22 23:46:10 -04002891 spin_unlock(ap->lock);
Jeff Garzik005a5a02005-10-30 23:31:48 -05002892 spin_lock(shost->host_lock);
Tejun Heo2115ea92006-05-15 21:03:39 +09002893 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894}
2895
2896/**
2897 * ata_scsi_simulate - simulate SCSI command on ATA device
Randy Dunlapc893a3a2006-01-28 13:15:32 -05002898 * @dev: the target device
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 * @cmd: SCSI command being sent to device.
2900 * @done: SCSI command completion function.
2901 *
2902 * Interprets and directly executes a select list of SCSI commands
2903 * that can be handled internally.
2904 *
2905 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002906 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907 */
2908
Tejun Heo3373efd2006-05-15 20:57:53 +09002909void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910 void (*done)(struct scsi_cmnd *))
2911{
2912 struct ata_scsi_args args;
Jeff Garzik057ace52005-10-22 14:27:05 -04002913 const u8 *scsicmd = cmd->cmnd;
Jeff Garzik45394142007-09-21 06:23:42 -04002914 u8 tmp8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915
Tejun Heo9a3dccc2006-01-06 09:56:18 +01002916 args.dev = dev;
2917 args.id = dev->id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002918 args.cmd = cmd;
2919 args.done = done;
2920
2921 switch(scsicmd[0]) {
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002922 /* TODO: worth improving? */
2923 case FORMAT_UNIT:
2924 ata_scsi_invalid_field(cmd, done);
2925 break;
2926
2927 case INQUIRY:
2928 if (scsicmd[1] & 2) /* is CmdDt set? */
Jeff Garzik00bd0202007-09-21 07:26:08 -04002929 ata_scsi_invalid_field(cmd, done);
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002930 else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
2931 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
2932 else switch (scsicmd[2]) {
2933 case 0x00:
2934 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002936 case 0x80:
2937 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002939 case 0x83:
2940 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002942 case 0x89:
2943 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945 default:
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002946 ata_scsi_invalid_field(cmd, done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947 break;
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002948 }
2949 break;
2950
2951 case MODE_SENSE:
2952 case MODE_SENSE_10:
2953 ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
2954 break;
2955
2956 case MODE_SELECT: /* unconditionally return */
2957 case MODE_SELECT_10: /* bad-field-in-cdb */
2958 ata_scsi_invalid_field(cmd, done);
2959 break;
2960
2961 case READ_CAPACITY:
2962 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2963 break;
2964
2965 case SERVICE_ACTION_IN:
2966 if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
2967 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2968 else
2969 ata_scsi_invalid_field(cmd, done);
2970 break;
2971
2972 case REPORT_LUNS:
2973 ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
2974 break;
2975
2976 case REQUEST_SENSE:
2977 ata_scsi_set_sense(cmd, 0, 0, 0);
2978 cmd->result = (DRIVER_SENSE << 24);
2979 done(cmd);
2980 break;
2981
2982 /* if we reach this, then writeback caching is disabled,
2983 * turning this into a no-op.
2984 */
2985 case SYNCHRONIZE_CACHE:
2986 /* fall through */
2987
2988 /* no-op's, complete with success */
2989 case REZERO_UNIT:
2990 case SEEK_6:
2991 case SEEK_10:
2992 case TEST_UNIT_READY:
2993 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
2994 break;
2995
2996 case SEND_DIAGNOSTIC:
2997 tmp8 = scsicmd[1] & ~(1 << 3);
2998 if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
2999 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
3000 else
3001 ata_scsi_invalid_field(cmd, done);
3002 break;
3003
3004 /* all other commands */
3005 default:
3006 ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
3007 /* "Invalid command operation code" */
3008 done(cmd);
3009 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 }
3011}
3012
Tejun Heof3187192007-04-17 23:44:07 +09003013int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
3014{
3015 int i, rc;
3016
3017 for (i = 0; i < host->n_ports; i++) {
3018 struct ata_port *ap = host->ports[i];
3019 struct Scsi_Host *shost;
3020
3021 rc = -ENOMEM;
3022 shost = scsi_host_alloc(sht, sizeof(struct ata_port *));
3023 if (!shost)
3024 goto err_alloc;
3025
3026 *(struct ata_port **)&shost->hostdata[0] = ap;
3027 ap->scsi_host = shost;
3028
3029 shost->transportt = &ata_scsi_transport_template;
3030 shost->unique_id = ap->print_id;
3031 shost->max_id = 16;
3032 shost->max_lun = 1;
3033 shost->max_channel = 1;
3034 shost->max_cmd_len = 16;
3035
Tejun Heo31cc23b2007-09-23 13:14:12 +09003036 /* Schedule policy is determined by ->qc_defer()
3037 * callback and it needs to see every deferred qc.
3038 * Set host_blocked to 1 to prevent SCSI midlayer from
3039 * automatically deferring requests.
3040 */
3041 shost->max_host_blocked = 1;
3042
Tejun Heof3187192007-04-17 23:44:07 +09003043 rc = scsi_add_host(ap->scsi_host, ap->host->dev);
3044 if (rc)
3045 goto err_add;
3046 }
3047
3048 return 0;
3049
3050 err_add:
3051 scsi_host_put(host->ports[i]->scsi_host);
3052 err_alloc:
3053 while (--i >= 0) {
3054 struct Scsi_Host *shost = host->ports[i]->scsi_host;
3055
3056 scsi_remove_host(shost);
3057 scsi_host_put(shost);
3058 }
3059 return rc;
3060}
3061
Tejun Heo1ae46312007-07-16 14:29:40 +09003062void ata_scsi_scan_host(struct ata_port *ap, int sync)
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003063{
Tejun Heo1ae46312007-07-16 14:29:40 +09003064 int tries = 5;
3065 struct ata_device *last_failed_dev = NULL;
Tejun Heo41bda9c2007-08-06 18:36:24 +09003066 struct ata_link *link;
Tejun Heo1ae46312007-07-16 14:29:40 +09003067 struct ata_device *dev;
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003068
Tejun Heo198e0fe2006-04-02 18:51:52 +09003069 if (ap->flags & ATA_FLAG_DISABLED)
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003070 return;
3071
Tejun Heo1ae46312007-07-16 14:29:40 +09003072 repeat:
Tejun Heo41bda9c2007-08-06 18:36:24 +09003073 ata_port_for_each_link(link, ap) {
3074 ata_link_for_each_dev(dev, link) {
3075 struct scsi_device *sdev;
3076 int channel = 0, id = 0;
Jeff Garzik3f19ee82005-10-03 21:36:41 -04003077
Tejun Heo41bda9c2007-08-06 18:36:24 +09003078 if (!ata_dev_enabled(dev) || dev->sdev)
3079 continue;
Tejun Heo3edebac2006-05-31 18:27:40 +09003080
Tejun Heo41bda9c2007-08-06 18:36:24 +09003081 if (ata_is_host_link(link))
3082 id = dev->devno;
3083 else
3084 channel = link->pmp;
3085
3086 sdev = __scsi_add_device(ap->scsi_host, channel, id, 0,
3087 NULL);
3088 if (!IS_ERR(sdev)) {
3089 dev->sdev = sdev;
3090 scsi_device_put(sdev);
3091 }
Tejun Heo3edebac2006-05-31 18:27:40 +09003092 }
Jeff Garzik3f19ee82005-10-03 21:36:41 -04003093 }
Tejun Heo1ae46312007-07-16 14:29:40 +09003094
3095 /* If we scanned while EH was in progress or allocation
3096 * failure occurred, scan would have failed silently. Check
3097 * whether all devices are attached.
3098 */
Tejun Heo41bda9c2007-08-06 18:36:24 +09003099 ata_port_for_each_link(link, ap) {
3100 ata_link_for_each_dev(dev, link) {
3101 if (ata_dev_enabled(dev) && !dev->sdev)
3102 goto exit_loop;
3103 }
Tejun Heo1ae46312007-07-16 14:29:40 +09003104 }
Tejun Heo41bda9c2007-08-06 18:36:24 +09003105 exit_loop:
3106 if (!link)
Tejun Heo1ae46312007-07-16 14:29:40 +09003107 return;
3108
3109 /* we're missing some SCSI devices */
3110 if (sync) {
3111 /* If caller requested synchrnous scan && we've made
3112 * any progress, sleep briefly and repeat.
3113 */
3114 if (dev != last_failed_dev) {
3115 msleep(100);
3116 last_failed_dev = dev;
3117 goto repeat;
3118 }
3119
3120 /* We might be failing to detect boot device, give it
3121 * a few more chances.
3122 */
3123 if (--tries) {
3124 msleep(100);
3125 goto repeat;
3126 }
3127
3128 ata_port_printk(ap, KERN_ERR, "WARNING: synchronous SCSI scan "
3129 "failed without making any progress,\n"
3130 " switching to async\n");
3131 }
3132
3133 queue_delayed_work(ata_aux_wq, &ap->hotplug_task,
3134 round_jiffies_relative(HZ));
Jeff Garzik644dd0c2005-10-03 15:55:19 -04003135}
Tejun Heo0ea035a2006-05-31 18:28:01 +09003136
3137/**
3138 * ata_scsi_offline_dev - offline attached SCSI device
3139 * @dev: ATA device to offline attached SCSI device for
3140 *
3141 * This function is called from ata_eh_hotplug() and responsible
3142 * for taking the SCSI device attached to @dev offline. This
Jeff Garzikcca39742006-08-24 03:19:22 -04003143 * function is called with host lock which protects dev->sdev
Tejun Heo0ea035a2006-05-31 18:28:01 +09003144 * against clearing.
3145 *
3146 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003147 * spin_lock_irqsave(host lock)
Tejun Heo0ea035a2006-05-31 18:28:01 +09003148 *
3149 * RETURNS:
3150 * 1 if attached SCSI device exists, 0 otherwise.
3151 */
3152int ata_scsi_offline_dev(struct ata_device *dev)
3153{
3154 if (dev->sdev) {
3155 scsi_device_set_state(dev->sdev, SDEV_OFFLINE);
3156 return 1;
3157 }
3158 return 0;
3159}
Tejun Heo580b2102006-05-31 18:28:05 +09003160
3161/**
3162 * ata_scsi_remove_dev - remove attached SCSI device
3163 * @dev: ATA device to remove attached SCSI device for
3164 *
3165 * This function is called from ata_eh_scsi_hotplug() and
3166 * responsible for removing the SCSI device attached to @dev.
3167 *
3168 * LOCKING:
3169 * Kernel thread context (may sleep).
3170 */
3171static void ata_scsi_remove_dev(struct ata_device *dev)
3172{
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003173 struct ata_port *ap = dev->link->ap;
Tejun Heo580b2102006-05-31 18:28:05 +09003174 struct scsi_device *sdev;
3175 unsigned long flags;
3176
3177 /* Alas, we need to grab scan_mutex to ensure SCSI device
3178 * state doesn't change underneath us and thus
3179 * scsi_device_get() always succeeds. The mutex locking can
3180 * be removed if there is __scsi_device_get() interface which
3181 * increments reference counts regardless of device state.
3182 */
Jeff Garzikcca39742006-08-24 03:19:22 -04003183 mutex_lock(&ap->scsi_host->scan_mutex);
Jeff Garzikba6a1302006-06-22 23:46:10 -04003184 spin_lock_irqsave(ap->lock, flags);
Tejun Heo580b2102006-05-31 18:28:05 +09003185
Jeff Garzikcca39742006-08-24 03:19:22 -04003186 /* clearing dev->sdev is protected by host lock */
Tejun Heo580b2102006-05-31 18:28:05 +09003187 sdev = dev->sdev;
3188 dev->sdev = NULL;
3189
3190 if (sdev) {
3191 /* If user initiated unplug races with us, sdev can go
Jeff Garzikcca39742006-08-24 03:19:22 -04003192 * away underneath us after the host lock and
Tejun Heo580b2102006-05-31 18:28:05 +09003193 * scan_mutex are released. Hold onto it.
3194 */
3195 if (scsi_device_get(sdev) == 0) {
3196 /* The following ensures the attached sdev is
3197 * offline on return from ata_scsi_offline_dev()
3198 * regardless it wins or loses the race
3199 * against this function.
3200 */
3201 scsi_device_set_state(sdev, SDEV_OFFLINE);
3202 } else {
3203 WARN_ON(1);
3204 sdev = NULL;
3205 }
3206 }
3207
Jeff Garzikba6a1302006-06-22 23:46:10 -04003208 spin_unlock_irqrestore(ap->lock, flags);
Jeff Garzikcca39742006-08-24 03:19:22 -04003209 mutex_unlock(&ap->scsi_host->scan_mutex);
Tejun Heo580b2102006-05-31 18:28:05 +09003210
3211 if (sdev) {
3212 ata_dev_printk(dev, KERN_INFO, "detaching (SCSI %s)\n",
3213 sdev->sdev_gendev.bus_id);
3214
3215 scsi_remove_device(sdev);
3216 scsi_device_put(sdev);
3217 }
3218}
3219
Tejun Heo41bda9c2007-08-06 18:36:24 +09003220static void ata_scsi_handle_link_detach(struct ata_link *link)
3221{
3222 struct ata_port *ap = link->ap;
3223 struct ata_device *dev;
3224
3225 ata_link_for_each_dev(dev, link) {
3226 unsigned long flags;
3227
3228 if (!(dev->flags & ATA_DFLAG_DETACHED))
3229 continue;
3230
3231 spin_lock_irqsave(ap->lock, flags);
3232 dev->flags &= ~ATA_DFLAG_DETACHED;
3233 spin_unlock_irqrestore(ap->lock, flags);
3234
3235 ata_scsi_remove_dev(dev);
3236 }
3237}
3238
Tejun Heo580b2102006-05-31 18:28:05 +09003239/**
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003240 * ata_scsi_media_change_notify - send media change event
Randy Dunlapc5d0e6a2007-10-15 17:29:46 -07003241 * @dev: Pointer to the disk device with media change event
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003242 *
3243 * Tell the block layer to send a media change notification
3244 * event.
3245 *
3246 * LOCKING:
Tejun Heo854c73a2007-09-23 13:14:11 +09003247 * spin_lock_irqsave(host lock)
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003248 */
Tejun Heo854c73a2007-09-23 13:14:11 +09003249void ata_scsi_media_change_notify(struct ata_device *dev)
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003250{
3251#ifdef OTHER_AN_PATCHES_HAVE_BEEN_APPLIED
Tejun Heo854c73a2007-09-23 13:14:11 +09003252 if (dev->sdev)
3253 scsi_device_event_notify(dev->sdev, SDEV_MEDIA_CHANGE);
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003254#endif
3255}
Kristen Carlson Accardi2f294962007-08-15 04:11:25 -04003256
3257/**
Tejun Heo580b2102006-05-31 18:28:05 +09003258 * ata_scsi_hotplug - SCSI part of hotplug
David Howells65f27f32006-11-22 14:55:48 +00003259 * @work: Pointer to ATA port to perform SCSI hotplug on
Tejun Heo580b2102006-05-31 18:28:05 +09003260 *
3261 * Perform SCSI part of hotplug. It's executed from a separate
3262 * workqueue after EH completes. This is necessary because SCSI
3263 * hot plugging requires working EH and hot unplugging is
3264 * synchronized with hot plugging with a mutex.
3265 *
3266 * LOCKING:
3267 * Kernel thread context (may sleep).
3268 */
David Howells65f27f32006-11-22 14:55:48 +00003269void ata_scsi_hotplug(struct work_struct *work)
Tejun Heo580b2102006-05-31 18:28:05 +09003270{
David Howells65f27f32006-11-22 14:55:48 +00003271 struct ata_port *ap =
3272 container_of(work, struct ata_port, hotplug_task.work);
Tejun Heo41bda9c2007-08-06 18:36:24 +09003273 int i;
Tejun Heo580b2102006-05-31 18:28:05 +09003274
Tejun Heob51e9e52006-06-29 01:29:30 +09003275 if (ap->pflags & ATA_PFLAG_UNLOADING) {
Tejun Heo580b2102006-05-31 18:28:05 +09003276 DPRINTK("ENTER/EXIT - unloading\n");
3277 return;
3278 }
3279
3280 DPRINTK("ENTER\n");
3281
Tejun Heo41bda9c2007-08-06 18:36:24 +09003282 /* Unplug detached devices. We cannot use link iterator here
3283 * because PMP links have to be scanned even if PMP is
3284 * currently not attached. Iterate manually.
3285 */
3286 ata_scsi_handle_link_detach(&ap->link);
3287 if (ap->pmp_link)
3288 for (i = 0; i < SATA_PMP_MAX_PORTS; i++)
3289 ata_scsi_handle_link_detach(&ap->pmp_link[i]);
Tejun Heo580b2102006-05-31 18:28:05 +09003290
3291 /* scan for new ones */
Tejun Heo1ae46312007-07-16 14:29:40 +09003292 ata_scsi_scan_host(ap, 0);
Tejun Heo580b2102006-05-31 18:28:05 +09003293
3294 DPRINTK("EXIT\n");
3295}
Tejun Heo83c47bc2006-05-31 18:28:07 +09003296
3297/**
3298 * ata_scsi_user_scan - indication for user-initiated bus scan
3299 * @shost: SCSI host to scan
3300 * @channel: Channel to scan
3301 * @id: ID to scan
3302 * @lun: LUN to scan
3303 *
3304 * This function is called when user explicitly requests bus
3305 * scan. Set probe pending flag and invoke EH.
3306 *
3307 * LOCKING:
3308 * SCSI layer (we don't care)
3309 *
3310 * RETURNS:
3311 * Zero.
3312 */
3313static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
3314 unsigned int id, unsigned int lun)
3315{
3316 struct ata_port *ap = ata_shost_to_port(shost);
3317 unsigned long flags;
Tejun Heo41bda9c2007-08-06 18:36:24 +09003318 int devno, rc = 0;
Tejun Heo83c47bc2006-05-31 18:28:07 +09003319
3320 if (!ap->ops->error_handler)
3321 return -EOPNOTSUPP;
3322
Tejun Heo41bda9c2007-08-06 18:36:24 +09003323 if (lun != SCAN_WILD_CARD && lun)
Tejun Heo83c47bc2006-05-31 18:28:07 +09003324 return -EINVAL;
3325
Tejun Heo41bda9c2007-08-06 18:36:24 +09003326 if (ap->nr_pmp_links == 0) {
3327 if (channel != SCAN_WILD_CARD && channel)
3328 return -EINVAL;
3329 devno = id;
3330 } else {
3331 if (id != SCAN_WILD_CARD && id)
3332 return -EINVAL;
3333 devno = channel;
3334 }
3335
Jeff Garzikba6a1302006-06-22 23:46:10 -04003336 spin_lock_irqsave(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003337
Tejun Heo41bda9c2007-08-06 18:36:24 +09003338 if (devno == SCAN_WILD_CARD) {
3339 struct ata_link *link;
3340
3341 ata_port_for_each_link(link, ap) {
3342 struct ata_eh_info *ehi = &link->eh_info;
3343 ehi->probe_mask |= (1 << ata_link_max_devices(link)) - 1;
3344 ehi->action |= ATA_EH_SOFTRESET;
3345 }
Tejun Heo83c47bc2006-05-31 18:28:07 +09003346 } else {
Tejun Heo41bda9c2007-08-06 18:36:24 +09003347 struct ata_device *dev = ata_find_dev(ap, devno);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003348
3349 if (dev) {
Tejun Heo41bda9c2007-08-06 18:36:24 +09003350 struct ata_eh_info *ehi = &dev->link->eh_info;
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003351 ehi->probe_mask |= 1 << dev->devno;
3352 ehi->action |= ATA_EH_SOFTRESET;
3353 ehi->flags |= ATA_EHI_RESUME_LINK;
Tejun Heo83c47bc2006-05-31 18:28:07 +09003354 } else
3355 rc = -EINVAL;
3356 }
3357
Tejun Heo309afcb2006-09-30 18:07:17 +09003358 if (rc == 0) {
Tejun Heo83c47bc2006-05-31 18:28:07 +09003359 ata_port_schedule_eh(ap);
Tejun Heo309afcb2006-09-30 18:07:17 +09003360 spin_unlock_irqrestore(ap->lock, flags);
3361 ata_port_wait_eh(ap);
3362 } else
3363 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo83c47bc2006-05-31 18:28:07 +09003364
3365 return rc;
3366}
zhao, forrest3057ac32006-06-12 12:01:34 +08003367
3368/**
Tejun Heod0171262006-06-12 22:51:14 +09003369 * ata_scsi_dev_rescan - initiate scsi_rescan_device()
David Howells65f27f32006-11-22 14:55:48 +00003370 * @work: Pointer to ATA port to perform scsi_rescan_device()
zhao, forrest3057ac32006-06-12 12:01:34 +08003371 *
Tejun Heod0171262006-06-12 22:51:14 +09003372 * After ATA pass thru (SAT) commands are executed successfully,
3373 * libata need to propagate the changes to SCSI layer. This
3374 * function must be executed from ata_aux_wq such that sdev
3375 * attach/detach don't race with rescan.
zhao, forrest3057ac32006-06-12 12:01:34 +08003376 *
Tejun Heod0171262006-06-12 22:51:14 +09003377 * LOCKING:
3378 * Kernel thread context (may sleep).
zhao, forrest3057ac32006-06-12 12:01:34 +08003379 */
David Howells65f27f32006-11-22 14:55:48 +00003380void ata_scsi_dev_rescan(struct work_struct *work)
zhao, forrest3057ac32006-06-12 12:01:34 +08003381{
David Howells65f27f32006-11-22 14:55:48 +00003382 struct ata_port *ap =
3383 container_of(work, struct ata_port, scsi_rescan_task);
Tejun Heo41bda9c2007-08-06 18:36:24 +09003384 struct ata_link *link;
Tejun Heof58229f2007-08-06 18:36:23 +09003385 struct ata_device *dev;
Tejun Heof84e7e42006-11-22 11:21:31 +09003386 unsigned long flags;
zhao, forrest3057ac32006-06-12 12:01:34 +08003387
Tejun Heof84e7e42006-11-22 11:21:31 +09003388 spin_lock_irqsave(ap->lock, flags);
zhao, forrest3057ac32006-06-12 12:01:34 +08003389
Tejun Heo41bda9c2007-08-06 18:36:24 +09003390 ata_port_for_each_link(link, ap) {
3391 ata_link_for_each_dev(dev, link) {
3392 struct scsi_device *sdev = dev->sdev;
Tejun Heof84e7e42006-11-22 11:21:31 +09003393
Tejun Heo41bda9c2007-08-06 18:36:24 +09003394 if (!ata_dev_enabled(dev) || !sdev)
3395 continue;
3396 if (scsi_device_get(sdev))
3397 continue;
Tejun Heof84e7e42006-11-22 11:21:31 +09003398
Tejun Heo41bda9c2007-08-06 18:36:24 +09003399 spin_unlock_irqrestore(ap->lock, flags);
3400 scsi_rescan_device(&(sdev->sdev_gendev));
3401 scsi_device_put(sdev);
3402 spin_lock_irqsave(ap->lock, flags);
3403 }
zhao, forrest3057ac32006-06-12 12:01:34 +08003404 }
Tejun Heof84e7e42006-11-22 11:21:31 +09003405
3406 spin_unlock_irqrestore(ap->lock, flags);
zhao, forrest3057ac32006-06-12 12:01:34 +08003407}
Brian King80289162006-08-07 14:27:31 -05003408
3409/**
3410 * ata_sas_port_alloc - Allocate port for a SAS attached SATA device
Jeff Garzik4f931372006-09-29 05:07:25 -04003411 * @host: ATA host container for all SAS ports
Brian King80289162006-08-07 14:27:31 -05003412 * @port_info: Information from low-level host driver
Jeff Garzikcca39742006-08-24 03:19:22 -04003413 * @shost: SCSI host that the scsi device is attached to
Brian King80289162006-08-07 14:27:31 -05003414 *
3415 * LOCKING:
3416 * PCI/etc. bus probe sem.
3417 *
3418 * RETURNS:
3419 * ata_port pointer on success / NULL on failure.
3420 */
3421
Jeff Garzikcca39742006-08-24 03:19:22 -04003422struct ata_port *ata_sas_port_alloc(struct ata_host *host,
Brian King80289162006-08-07 14:27:31 -05003423 struct ata_port_info *port_info,
Jeff Garzikcca39742006-08-24 03:19:22 -04003424 struct Scsi_Host *shost)
Brian King80289162006-08-07 14:27:31 -05003425{
Tejun Heof3187192007-04-17 23:44:07 +09003426 struct ata_port *ap;
Brian King80289162006-08-07 14:27:31 -05003427
Tejun Heof3187192007-04-17 23:44:07 +09003428 ap = ata_port_alloc(host);
Brian King80289162006-08-07 14:27:31 -05003429 if (!ap)
3430 return NULL;
3431
Tejun Heof3187192007-04-17 23:44:07 +09003432 ap->port_no = 0;
Jeff Garzikcca39742006-08-24 03:19:22 -04003433 ap->lock = shost->host_lock;
Tejun Heof3187192007-04-17 23:44:07 +09003434 ap->pio_mask = port_info->pio_mask;
3435 ap->mwdma_mask = port_info->mwdma_mask;
3436 ap->udma_mask = port_info->udma_mask;
3437 ap->flags |= port_info->flags;
3438 ap->ops = port_info->port_ops;
3439 ap->cbl = ATA_CBL_SATA;
3440
Brian King80289162006-08-07 14:27:31 -05003441 return ap;
3442}
3443EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
3444
3445/**
3446 * ata_sas_port_start - Set port up for dma.
3447 * @ap: Port to initialize
3448 *
3449 * Called just after data structures for each port are
3450 * initialized. Allocates DMA pad.
3451 *
3452 * May be used as the port_start() entry in ata_port_operations.
3453 *
3454 * LOCKING:
3455 * Inherited from caller.
3456 */
3457int ata_sas_port_start(struct ata_port *ap)
3458{
3459 return ata_pad_alloc(ap, ap->dev);
3460}
3461EXPORT_SYMBOL_GPL(ata_sas_port_start);
3462
3463/**
3464 * ata_port_stop - Undo ata_sas_port_start()
3465 * @ap: Port to shut down
3466 *
3467 * Frees the DMA pad.
3468 *
3469 * May be used as the port_stop() entry in ata_port_operations.
3470 *
3471 * LOCKING:
3472 * Inherited from caller.
3473 */
3474
3475void ata_sas_port_stop(struct ata_port *ap)
3476{
3477 ata_pad_free(ap, ap->dev);
3478}
3479EXPORT_SYMBOL_GPL(ata_sas_port_stop);
3480
3481/**
3482 * ata_sas_port_init - Initialize a SATA device
3483 * @ap: SATA port to initialize
3484 *
3485 * LOCKING:
3486 * PCI/etc. bus probe sem.
3487 *
3488 * RETURNS:
3489 * Zero on success, non-zero on error.
3490 */
3491
3492int ata_sas_port_init(struct ata_port *ap)
3493{
3494 int rc = ap->ops->port_start(ap);
3495
Tejun Heof3187192007-04-17 23:44:07 +09003496 if (!rc) {
3497 ap->print_id = ata_print_id++;
Brian King80289162006-08-07 14:27:31 -05003498 rc = ata_bus_probe(ap);
Tejun Heof3187192007-04-17 23:44:07 +09003499 }
Brian King80289162006-08-07 14:27:31 -05003500
3501 return rc;
3502}
3503EXPORT_SYMBOL_GPL(ata_sas_port_init);
3504
3505/**
3506 * ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
3507 * @ap: SATA port to destroy
3508 *
3509 */
3510
3511void ata_sas_port_destroy(struct ata_port *ap)
3512{
Tejun Heof0d36ef2007-01-20 16:00:28 +09003513 if (ap->ops->port_stop)
3514 ap->ops->port_stop(ap);
Brian King80289162006-08-07 14:27:31 -05003515 kfree(ap);
3516}
3517EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
3518
3519/**
3520 * ata_sas_slave_configure - Default slave_config routine for libata devices
3521 * @sdev: SCSI device to configure
3522 * @ap: ATA port to which SCSI device is attached
3523 *
3524 * RETURNS:
3525 * Zero.
3526 */
3527
3528int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
3529{
3530 ata_scsi_sdev_config(sdev);
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003531 ata_scsi_dev_config(sdev, ap->link.device);
Brian King80289162006-08-07 14:27:31 -05003532 return 0;
3533}
3534EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
3535
3536/**
3537 * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
3538 * @cmd: SCSI command to be sent
3539 * @done: Completion function, called when command is complete
3540 * @ap: ATA port to which the command is being sent
3541 *
3542 * RETURNS:
Brian King08475a12006-11-20 13:51:56 -06003543 * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
3544 * 0 otherwise.
Brian King80289162006-08-07 14:27:31 -05003545 */
3546
3547int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
3548 struct ata_port *ap)
3549{
Brian King08475a12006-11-20 13:51:56 -06003550 int rc = 0;
3551
Brian King80289162006-08-07 14:27:31 -05003552 ata_scsi_dump_cdb(ap, cmd);
3553
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003554 if (likely(ata_scsi_dev_enabled(ap->link.device)))
3555 rc = __ata_scsi_queuecmd(cmd, done, ap->link.device);
Brian King80289162006-08-07 14:27:31 -05003556 else {
3557 cmd->result = (DID_BAD_TARGET << 16);
3558 done(cmd);
3559 }
Brian King08475a12006-11-20 13:51:56 -06003560 return rc;
Brian King80289162006-08-07 14:27:31 -05003561}
3562EXPORT_SYMBOL_GPL(ata_sas_queuecmd);