blob: 22c77a113536eaa3a78f4adf962cf57ebd879730 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 libata-scsi.c - helper library for ATA
3
4 Copyright 2003-2004 Red Hat, Inc. All rights reserved.
5 Copyright 2003-2004 Jeff Garzik
6
7 The contents of this file are subject to the Open
8 Software License version 1.1 that can be found at
9 http://www.opensource.org/licenses/osl-1.1.txt and is included herein
10 by reference.
11
12 Alternatively, the contents of this file may be used under the terms
13 of the GNU General Public License version 2 (the "GPL") as distributed
14 in the kernel source COPYING file, in which case the provisions of
15 the GPL are applicable instead of the above. If you wish to allow
16 the use of your version of this file only under the terms of the
17 GPL and not to allow others to use your version of this file under
18 the OSL, indicate your decision by deleting the provisions above and
19 replace them with the notice and other provisions required by the GPL.
20 If you do not delete the provisions above, a recipient may use your
21 version of this file under either the OSL or the GPL.
22
23 */
24
25#include <linux/kernel.h>
26#include <linux/blkdev.h>
27#include <linux/spinlock.h>
28#include <scsi/scsi.h>
29#include "scsi.h"
30#include <scsi/scsi_host.h>
31#include <linux/libata.h>
Jeff Garzikb0955182005-05-12 15:45:22 -040032#include <linux/hdreg.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <asm/uaccess.h>
34
35#include "libata.h"
36
Jeff Garzikb0955182005-05-12 15:45:22 -040037#define SECTOR_SIZE 512
38
Linus Torvalds1da177e2005-04-16 15:20:36 -070039typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, u8 *scsicmd);
40static struct ata_device *
41ata_scsi_find_dev(struct ata_port *ap, struct scsi_device *scsidev);
42
43
44/**
45 * ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd.
46 * @sdev: SCSI device for which BIOS geometry is to be determined
47 * @bdev: block device associated with @sdev
48 * @capacity: capacity of SCSI device
49 * @geom: location to which geometry will be output
50 *
51 * Generic bios head/sector/cylinder calculator
52 * used by sd. Most BIOSes nowadays expect a XXX/255/16 (CHS)
53 * mapping. Some situations may arise where the disk is not
54 * bootable if this is not used.
55 *
56 * LOCKING:
57 * Defined by the SCSI layer. We don't really care.
58 *
59 * RETURNS:
60 * Zero.
61 */
62int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
63 sector_t capacity, int geom[])
64{
65 geom[0] = 255;
66 geom[1] = 63;
67 sector_div(capacity, 255*63);
68 geom[2] = capacity;
69
70 return 0;
71}
72
Jeff Garzikb0955182005-05-12 15:45:22 -040073/**
74 * ata_cmd_ioctl - Handler for HDIO_DRIVE_CMD ioctl
75 * @dev: Device to whom we are issuing command
76 * @arg: User provided data for issuing command
77 *
78 * LOCKING:
79 * Defined by the SCSI layer. We don't really care.
80 *
81 * RETURNS:
82 * Zero on success, negative errno on error.
83 */
84
85int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
86{
87 int rc = 0;
88 u8 scsi_cmd[MAX_COMMAND_SIZE];
89 u8 args[4], *argbuf = NULL;
90 int argsize = 0;
91 struct scsi_request *sreq;
92
93 if (NULL == (void *)arg)
94 return -EINVAL;
95
96 if (copy_from_user(args, arg, sizeof(args)))
97 return -EFAULT;
98
99 sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
100 if (!sreq)
101 return -EINTR;
102
103 memset(scsi_cmd, 0, sizeof(scsi_cmd));
104
105 if (args[3]) {
106 argsize = SECTOR_SIZE * args[3];
107 argbuf = kmalloc(argsize, GFP_KERNEL);
108 if (argbuf == NULL)
109 return -ENOMEM;
110
111 scsi_cmd[1] = (4 << 1); /* PIO Data-in */
112 scsi_cmd[2] = 0x0e; /* no off.line or cc, read from dev,
113 block count in sector count field */
114 sreq->sr_data_direction = DMA_FROM_DEVICE;
115 } else {
116 scsi_cmd[1] = (3 << 1); /* Non-data */
117 /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
118 sreq->sr_data_direction = DMA_NONE;
119 }
120
121 scsi_cmd[0] = ATA_16;
122
123 scsi_cmd[4] = args[2];
124 if (args[0] == WIN_SMART) { /* hack -- ide driver does this too... */
125 scsi_cmd[6] = args[3];
126 scsi_cmd[8] = args[1];
127 scsi_cmd[10] = 0x4f;
128 scsi_cmd[12] = 0xc2;
129 } else {
130 scsi_cmd[6] = args[1];
131 }
132 scsi_cmd[14] = args[0];
133
134 /* Good values for timeout and retries? Values below
135 from scsi_ioctl_send_command() for default case... */
136 scsi_wait_req(sreq, scsi_cmd, argbuf, argsize, (10*HZ), 5);
137
138 if (sreq->sr_result) {
139 rc = -EIO;
140 goto error;
141 }
142
143 /* Need code to retrieve data from check condition? */
144
145 if ((argbuf)
146 && copy_to_user((void *)(arg + sizeof(args)), argbuf, argsize))
147 rc = -EFAULT;
148error:
149 scsi_release_request(sreq);
150
151 if (argbuf)
152 kfree(argbuf);
153
154 return rc;
155}
156
157/**
158 * ata_task_ioctl - Handler for HDIO_DRIVE_TASK ioctl
159 * @dev: Device to whom we are issuing command
160 * @arg: User provided data for issuing command
161 *
162 * LOCKING:
163 * Defined by the SCSI layer. We don't really care.
164 *
165 * RETURNS:
166 * Zero on success, negative errno on error.
167 */
168int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
169{
170 int rc = 0;
171 u8 scsi_cmd[MAX_COMMAND_SIZE];
172 u8 args[7];
173 struct scsi_request *sreq;
174
175 if (NULL == (void *)arg)
176 return -EINVAL;
177
178 if (copy_from_user(args, arg, sizeof(args)))
179 return -EFAULT;
180
181 memset(scsi_cmd, 0, sizeof(scsi_cmd));
182 scsi_cmd[0] = ATA_16;
183 scsi_cmd[1] = (3 << 1); /* Non-data */
184 /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
185 scsi_cmd[4] = args[1];
186 scsi_cmd[6] = args[2];
187 scsi_cmd[8] = args[3];
188 scsi_cmd[10] = args[4];
189 scsi_cmd[12] = args[5];
190 scsi_cmd[14] = args[0];
191
192 sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
193 if (!sreq) {
194 rc = -EINTR;
195 goto error;
196 }
197
198 sreq->sr_data_direction = DMA_NONE;
199 /* Good values for timeout and retries? Values below
200 from scsi_ioctl_send_command() for default case... */
201 scsi_wait_req(sreq, scsi_cmd, NULL, 0, (10*HZ), 5);
202
203 if (sreq->sr_result) {
204 rc = -EIO;
205 goto error;
206 }
207
208 /* Need code to retrieve data from check condition? */
209
210error:
211 scsi_release_request(sreq);
212 return rc;
213}
214
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
216{
217 struct ata_port *ap;
218 struct ata_device *dev;
219 int val = -EINVAL, rc = -EINVAL;
220
221 ap = (struct ata_port *) &scsidev->host->hostdata[0];
222 if (!ap)
223 goto out;
224
225 dev = ata_scsi_find_dev(ap, scsidev);
226 if (!dev) {
227 rc = -ENODEV;
228 goto out;
229 }
230
231 switch (cmd) {
232 case ATA_IOC_GET_IO32:
233 val = 0;
234 if (copy_to_user(arg, &val, 1))
235 return -EFAULT;
236 return 0;
237
238 case ATA_IOC_SET_IO32:
239 val = (unsigned long) arg;
240 if (val != 0)
241 return -EINVAL;
242 return 0;
243
Jeff Garzikb0955182005-05-12 15:45:22 -0400244 case HDIO_DRIVE_CMD:
245 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
246 return -EACCES;
247 return ata_cmd_ioctl(scsidev, arg);
248
249 case HDIO_DRIVE_TASK:
250 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
251 return -EACCES;
252 return ata_task_ioctl(scsidev, arg);
253
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 default:
255 rc = -ENOTTY;
256 break;
257 }
258
259out:
260 return rc;
261}
262
263/**
264 * ata_scsi_qc_new - acquire new ata_queued_cmd reference
265 * @ap: ATA port to which the new command is attached
266 * @dev: ATA device to which the new command is attached
267 * @cmd: SCSI command that originated this ATA command
268 * @done: SCSI command completion function
269 *
270 * Obtain a reference to an unused ata_queued_cmd structure,
271 * which is the basic libata structure representing a single
272 * ATA command sent to the hardware.
273 *
274 * If a command was available, fill in the SCSI-specific
275 * portions of the structure with information on the
276 * current command.
277 *
278 * LOCKING:
279 * spin_lock_irqsave(host_set lock)
280 *
281 * RETURNS:
282 * Command allocated, or %NULL if none available.
283 */
284struct ata_queued_cmd *ata_scsi_qc_new(struct ata_port *ap,
285 struct ata_device *dev,
286 struct scsi_cmnd *cmd,
287 void (*done)(struct scsi_cmnd *))
288{
289 struct ata_queued_cmd *qc;
290
291 qc = ata_qc_new_init(ap, dev);
292 if (qc) {
293 qc->scsicmd = cmd;
294 qc->scsidone = done;
295
296 if (cmd->use_sg) {
297 qc->sg = (struct scatterlist *) cmd->request_buffer;
298 qc->n_elem = cmd->use_sg;
299 } else {
300 qc->sg = &qc->sgent;
301 qc->n_elem = 1;
302 }
303 } else {
304 cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
305 done(cmd);
306 }
307
308 return qc;
309}
310
311/**
Jeff Garzikb0955182005-05-12 15:45:22 -0400312 * ata_dump_status - user friendly display of error info
313 * @id: id of the port in question
314 * @tf: ptr to filled out taskfile
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 *
Jeff Garzikb0955182005-05-12 15:45:22 -0400316 * Decode and dump the ATA error/status registers for the user so
317 * that they have some idea what really happened at the non
318 * make-believe layer.
319 *
320 * LOCKING:
321 * inherited from caller
322 */
323void ata_dump_status(unsigned id, struct ata_taskfile *tf)
324{
325 u8 stat = tf->command, err = tf->feature;
326
327 printk(KERN_WARNING "ata%u: status=0x%02x { ", id, stat);
328 if (stat & ATA_BUSY) {
329 printk("Busy }\n"); /* Data is not valid in this case */
330 } else {
331 if (stat & 0x40) printk("DriveReady ");
332 if (stat & 0x20) printk("DeviceFault ");
333 if (stat & 0x10) printk("SeekComplete ");
334 if (stat & 0x08) printk("DataRequest ");
335 if (stat & 0x04) printk("CorrectedError ");
336 if (stat & 0x02) printk("Index ");
337 if (stat & 0x01) printk("Error ");
338 printk("}\n");
339
340 if (err) {
341 printk(KERN_WARNING "ata%u: error=0x%02x { ", id, err);
342 if (err & 0x04) printk("DriveStatusError ");
343 if (err & 0x80) {
344 if (err & 0x04) printk("BadCRC ");
345 else printk("Sector ");
346 }
347 if (err & 0x40) printk("UncorrectableError ");
348 if (err & 0x10) printk("SectorIdNotFound ");
349 if (err & 0x02) printk("TrackZeroNotFound ");
350 if (err & 0x01) printk("AddrMarkNotFound ");
351 printk("}\n");
352 }
353 }
354}
355
356/**
357 * ata_to_sense_error - convert ATA error to SCSI error
358 * @drv_stat: value contained in ATA status register
359 * @drv_err: value contained in ATA error register
360 * @sk: the sense key we'll fill out
361 * @asc: the additional sense code we'll fill out
362 * @ascq: the additional sense code qualifier we'll fill out
363 *
364 * Converts an ATA error into a SCSI error. Fill out pointers to
365 * SK, ASC, and ASCQ bytes for later use in fixed or descriptor
366 * format sense blocks.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 *
368 * LOCKING:
369 * spin_lock_irqsave(host_set lock)
370 */
Jeff Garzikb0955182005-05-12 15:45:22 -0400371void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
372 u8 *ascq)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373{
Jeff Garzikb0955182005-05-12 15:45:22 -0400374 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 /* Based on the 3ware driver translation table */
376 static unsigned char sense_table[][4] = {
377 /* BBD|ECC|ID|MAR */
378 {0xd1, ABORTED_COMMAND, 0x00, 0x00}, // Device busy Aborted command
379 /* BBD|ECC|ID */
380 {0xd0, ABORTED_COMMAND, 0x00, 0x00}, // Device busy Aborted command
381 /* ECC|MC|MARK */
382 {0x61, HARDWARE_ERROR, 0x00, 0x00}, // Device fault Hardware error
383 /* ICRC|ABRT */ /* NB: ICRC & !ABRT is BBD */
384 {0x84, ABORTED_COMMAND, 0x47, 0x00}, // Data CRC error SCSI parity error
385 /* MC|ID|ABRT|TRK0|MARK */
386 {0x37, NOT_READY, 0x04, 0x00}, // Unit offline Not ready
387 /* MCR|MARK */
388 {0x09, NOT_READY, 0x04, 0x00}, // Unrecovered disk error Not ready
389 /* Bad address mark */
390 {0x01, MEDIUM_ERROR, 0x13, 0x00}, // Address mark not found Address mark not found for data field
391 /* TRK0 */
392 {0x02, HARDWARE_ERROR, 0x00, 0x00}, // Track 0 not found Hardware error
393 /* Abort & !ICRC */
394 {0x04, ABORTED_COMMAND, 0x00, 0x00}, // Aborted command Aborted command
395 /* Media change request */
396 {0x08, NOT_READY, 0x04, 0x00}, // Media change request FIXME: faking offline
397 /* SRV */
398 {0x10, ABORTED_COMMAND, 0x14, 0x00}, // ID not found Recorded entity not found
399 /* Media change */
400 {0x08, NOT_READY, 0x04, 0x00}, // Media change FIXME: faking offline
401 /* ECC */
402 {0x40, MEDIUM_ERROR, 0x11, 0x04}, // Uncorrectable ECC error Unrecovered read error
403 /* BBD - block marked bad */
404 {0x80, MEDIUM_ERROR, 0x11, 0x04}, // Block marked bad Medium error, unrecovered read error
405 {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
406 };
407 static unsigned char stat_table[][4] = {
408 /* Must be first because BUSY means no other bits valid */
409 {0x80, ABORTED_COMMAND, 0x47, 0x00}, // Busy, fake parity for now
410 {0x20, HARDWARE_ERROR, 0x00, 0x00}, // Device fault
411 {0x08, ABORTED_COMMAND, 0x47, 0x00}, // Timed out in xfer, fake parity for now
412 {0x04, RECOVERED_ERROR, 0x11, 0x00}, // Recovered ECC error Medium error, recovered
413 {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
414 };
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415
416 /*
417 * Is this an error we can process/parse
418 */
Jeff Garzikb0955182005-05-12 15:45:22 -0400419 if (drv_stat & ATA_BUSY) {
420 drv_err = 0; /* Ignore the err bits, they're invalid */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422
Jeff Garzikb0955182005-05-12 15:45:22 -0400423 if (drv_err) {
424 /* Look for drv_err */
425 for (i = 0; sense_table[i][0] != 0xFF; i++) {
426 /* Look for best matches first */
427 if ((sense_table[i][0] & drv_err) ==
428 sense_table[i][0]) {
429 *sk = sense_table[i][1];
430 *asc = sense_table[i][2];
431 *ascq = sense_table[i][3];
432 goto translate_done;
433 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400435 /* No immediate match */
436 printk(KERN_WARNING "ata%u: no sense translation for "
437 "error 0x%02x\n", id, drv_err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438 }
439
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440 /* Fall back to interpreting status bits */
Jeff Garzikb0955182005-05-12 15:45:22 -0400441 for (i = 0; stat_table[i][0] != 0xFF; i++) {
442 if (stat_table[i][0] & drv_stat) {
443 *sk = stat_table[i][1];
444 *asc = stat_table[i][2];
445 *ascq = stat_table[i][3];
446 goto translate_done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 }
Jeff Garzikb0955182005-05-12 15:45:22 -0400449 /* No error? Undecoded? */
450 printk(KERN_WARNING "ata%u: no sense translation for status: 0x%02x\n",
451 id, drv_stat);
452
453 /* For our last chance pick, use medium read error because
454 * it's much more common than an ATA drive telling you a write
455 * has failed.
456 */
457 *sk = MEDIUM_ERROR;
458 *asc = 0x11; /* "unrecovered read error" */
459 *ascq = 0x04; /* "auto-reallocation failed" */
460
461 translate_done:
462 printk(KERN_ERR "ata%u: translated ATA stat/err 0x%02x/%02x to "
463 "SCSI SK/ASC/ASCQ 0x%x/%02x/%02x\n", id, drv_stat, drv_err,
464 *sk, *asc, *ascq);
465 return;
466}
467
468/*
469 * ata_gen_ata_desc_sense - Generate check condition sense block.
470 * @qc: Command that completed.
471 *
472 * This function is specific to the ATA descriptor format sense
473 * block specified for the ATA pass through commands. Regardless
474 * of whether the command errored or not, return a sense
475 * block. Copy all controller registers into the sense
476 * block. Clear sense key, ASC & ASCQ if there is no error.
477 *
478 * LOCKING:
479 * spin_lock_irqsave(host_set lock)
480 */
481void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc)
482{
483 struct scsi_cmnd *cmd = qc->scsicmd;
484 struct ata_taskfile *tf = &qc->tf;
485 unsigned char *sb = cmd->sense_buffer;
486 unsigned char *desc = sb + 8;
487
488 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
489
490 cmd->result = SAM_STAT_CHECK_CONDITION;
491
492 /*
493 * Read the controller registers.
494 */
495 assert(NULL != qc->ap->ops->tf_read);
496 qc->ap->ops->tf_read(qc->ap, tf);
497
498 /*
499 * Use ata_to_sense_error() to map status register bits
500 * onto sense key, asc & ascq.
501 */
502 if (unlikely(tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ))) {
503 ata_to_sense_error(qc->ap->id, tf->command, tf->feature,
504 &sb[1], &sb[2], &sb[3]);
505 sb[1] &= 0x0f;
506 }
507
508 /*
509 * Sense data is current and format is descriptor.
510 */
511 sb[0] = 0x72;
512
513 desc[0] = 0x09;
514
515 /*
516 * Set length of additional sense data.
517 * Since we only populate descriptor 0, the total
518 * length is the same (fixed) length as descriptor 0.
519 */
520 desc[1] = sb[7] = 14;
521
522 /*
523 * Copy registers into sense buffer.
524 */
525 desc[2] = 0x00;
526 desc[3] = tf->feature; /* == error reg */
527 desc[5] = tf->nsect;
528 desc[7] = tf->lbal;
529 desc[9] = tf->lbam;
530 desc[11] = tf->lbah;
531 desc[12] = tf->device;
532 desc[13] = tf->command; /* == status reg */
533
534 /*
535 * Fill in Extend bit, and the high order bytes
536 * if applicable.
537 */
538 if (tf->flags & ATA_TFLAG_LBA48) {
539 desc[2] |= 0x01;
540 desc[4] = tf->hob_nsect;
541 desc[6] = tf->hob_lbal;
542 desc[8] = tf->hob_lbam;
543 desc[10] = tf->hob_lbah;
544 }
545}
546
547/**
548 * ata_gen_fixed_sense - generate a SCSI fixed sense block
549 * @qc: Command that we are erroring out
550 *
551 * Leverage ata_to_sense_error() to give us the codes. Fit our
552 * LBA in here if there's room.
553 *
554 * LOCKING:
555 * inherited from caller
556 */
557void ata_gen_fixed_sense(struct ata_queued_cmd *qc)
558{
559 struct scsi_cmnd *cmd = qc->scsicmd;
560 struct ata_taskfile *tf = &qc->tf;
561 unsigned char *sb = cmd->sense_buffer;
562
563 memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
564
565 cmd->result = SAM_STAT_CHECK_CONDITION;
566
567 /*
568 * Read the controller registers.
569 */
570 assert(NULL != qc->ap->ops->tf_read);
571 qc->ap->ops->tf_read(qc->ap, tf);
572
573 /*
574 * Use ata_to_sense_error() to map status register bits
575 * onto sense key, asc & ascq.
576 */
577 if (unlikely(tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ))) {
578 ata_to_sense_error(qc->ap->id, tf->command, tf->feature,
579 &sb[2], &sb[12], &sb[13]);
580 sb[2] &= 0x0f;
581 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582
583 sb[0] = 0x70;
Jeff Garzikb0955182005-05-12 15:45:22 -0400584 sb[7] = 0x0a;
585 if (tf->flags & ATA_TFLAG_LBA && !(tf->flags & ATA_TFLAG_LBA48)) {
586 /* A small (28b) LBA will fit in the 32b info field */
587 sb[0] |= 0x80; /* set valid bit */
588 sb[3] = tf->device & 0x0f;
589 sb[4] = tf->lbah;
590 sb[5] = tf->lbam;
591 sb[6] = tf->lbal;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 }
593}
594
595/**
596 * ata_scsi_slave_config - Set SCSI device attributes
597 * @sdev: SCSI device to examine
598 *
599 * This is called before we actually start reading
600 * and writing to the device, to configure certain
601 * SCSI mid-layer behaviors.
602 *
603 * LOCKING:
604 * Defined by SCSI layer. We don't really care.
605 */
606
607int ata_scsi_slave_config(struct scsi_device *sdev)
608{
609 sdev->use_10_for_rw = 1;
610 sdev->use_10_for_ms = 1;
611
612 blk_queue_max_phys_segments(sdev->request_queue, LIBATA_MAX_PRD);
613
614 if (sdev->id < ATA_MAX_DEVICES) {
615 struct ata_port *ap;
616 struct ata_device *dev;
617
618 ap = (struct ata_port *) &sdev->host->hostdata[0];
619 dev = &ap->device[sdev->id];
620
621 /* TODO: 1024 is an arbitrary number, not the
622 * hardware maximum. This should be increased to
623 * 65534 when Jens Axboe's patch for dynamically
624 * determining max_sectors is merged.
625 */
626 if ((dev->flags & ATA_DFLAG_LBA48) &&
627 ((dev->flags & ATA_DFLAG_LOCK_SECTORS) == 0)) {
628 sdev->host->max_sectors = 2048;
629 blk_queue_max_sectors(sdev->request_queue, 2048);
630 }
631 }
632
633 return 0; /* scsi layer doesn't check return value, sigh */
634}
635
636/**
637 * ata_scsi_error - SCSI layer error handler callback
638 * @host: SCSI host on which error occurred
639 *
640 * Handles SCSI-layer-thrown error events.
641 *
642 * LOCKING:
643 * Inherited from SCSI layer (none, can sleep)
644 *
645 * RETURNS:
646 * Zero.
647 */
648
649int ata_scsi_error(struct Scsi_Host *host)
650{
651 struct ata_port *ap;
652
653 DPRINTK("ENTER\n");
654
655 ap = (struct ata_port *) &host->hostdata[0];
656 ap->ops->eng_timeout(ap);
657
658 /* TODO: this is per-command; when queueing is supported
659 * this code will either change or move to a more
660 * appropriate place
661 */
662 host->host_failed--;
663
664 DPRINTK("EXIT\n");
665 return 0;
666}
667
668/**
669 * ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command
670 * @qc: Storage for translated ATA taskfile
671 * @scsicmd: SCSI command to translate (ignored)
672 *
673 * Sets up an ATA taskfile to issue FLUSH CACHE or
674 * FLUSH CACHE EXT.
675 *
676 * LOCKING:
677 * spin_lock_irqsave(host_set lock)
678 *
679 * RETURNS:
680 * Zero on success, non-zero on error.
681 */
682
683static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
684{
685 struct ata_taskfile *tf = &qc->tf;
686
687 tf->flags |= ATA_TFLAG_DEVICE;
688 tf->protocol = ATA_PROT_NODATA;
689
690 if ((tf->flags & ATA_TFLAG_LBA48) &&
691 (ata_id_has_flush_ext(qc->dev->id)))
692 tf->command = ATA_CMD_FLUSH_EXT;
693 else
694 tf->command = ATA_CMD_FLUSH;
695
696 return 0;
697}
698
699/**
700 * ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one
701 * @qc: Storage for translated ATA taskfile
702 * @scsicmd: SCSI command to translate
703 *
704 * Converts SCSI VERIFY command to an ATA READ VERIFY command.
705 *
706 * LOCKING:
707 * spin_lock_irqsave(host_set lock)
708 *
709 * RETURNS:
710 * Zero on success, non-zero on error.
711 */
712
713static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
714{
715 struct ata_taskfile *tf = &qc->tf;
716 unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
717 u64 dev_sectors = qc->dev->n_sectors;
718 u64 sect = 0;
719 u32 n_sect = 0;
720
721 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
722 tf->protocol = ATA_PROT_NODATA;
723 tf->device |= ATA_LBA;
724
725 if (scsicmd[0] == VERIFY) {
726 sect |= ((u64)scsicmd[2]) << 24;
727 sect |= ((u64)scsicmd[3]) << 16;
728 sect |= ((u64)scsicmd[4]) << 8;
729 sect |= ((u64)scsicmd[5]);
730
731 n_sect |= ((u32)scsicmd[7]) << 8;
732 n_sect |= ((u32)scsicmd[8]);
733 }
734
735 else if (scsicmd[0] == VERIFY_16) {
736 sect |= ((u64)scsicmd[2]) << 56;
737 sect |= ((u64)scsicmd[3]) << 48;
738 sect |= ((u64)scsicmd[4]) << 40;
739 sect |= ((u64)scsicmd[5]) << 32;
740 sect |= ((u64)scsicmd[6]) << 24;
741 sect |= ((u64)scsicmd[7]) << 16;
742 sect |= ((u64)scsicmd[8]) << 8;
743 sect |= ((u64)scsicmd[9]);
744
745 n_sect |= ((u32)scsicmd[10]) << 24;
746 n_sect |= ((u32)scsicmd[11]) << 16;
747 n_sect |= ((u32)scsicmd[12]) << 8;
748 n_sect |= ((u32)scsicmd[13]);
749 }
750
751 else
752 return 1;
753
754 if (!n_sect)
755 return 1;
756 if (sect >= dev_sectors)
757 return 1;
758 if ((sect + n_sect) > dev_sectors)
759 return 1;
760 if (lba48) {
761 if (n_sect > (64 * 1024))
762 return 1;
763 } else {
764 if (n_sect > 256)
765 return 1;
766 }
767
768 if (lba48) {
769 tf->command = ATA_CMD_VERIFY_EXT;
770
771 tf->hob_nsect = (n_sect >> 8) & 0xff;
772
773 tf->hob_lbah = (sect >> 40) & 0xff;
774 tf->hob_lbam = (sect >> 32) & 0xff;
775 tf->hob_lbal = (sect >> 24) & 0xff;
776 } else {
777 tf->command = ATA_CMD_VERIFY;
778
779 tf->device |= (sect >> 24) & 0xf;
780 }
781
782 tf->nsect = n_sect & 0xff;
783
784 tf->lbah = (sect >> 16) & 0xff;
785 tf->lbam = (sect >> 8) & 0xff;
786 tf->lbal = sect & 0xff;
787
788 return 0;
789}
790
791/**
792 * ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
793 * @qc: Storage for translated ATA taskfile
794 * @scsicmd: SCSI command to translate
795 *
796 * Converts any of six SCSI read/write commands into the
797 * ATA counterpart, including starting sector (LBA),
798 * sector count, and taking into account the device's LBA48
799 * support.
800 *
801 * Commands %READ_6, %READ_10, %READ_16, %WRITE_6, %WRITE_10, and
802 * %WRITE_16 are currently supported.
803 *
804 * LOCKING:
805 * spin_lock_irqsave(host_set lock)
806 *
807 * RETURNS:
808 * Zero on success, non-zero on error.
809 */
810
811static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
812{
813 struct ata_taskfile *tf = &qc->tf;
814 unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
815
816 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
817 tf->protocol = qc->dev->xfer_protocol;
818 tf->device |= ATA_LBA;
819
820 if (scsicmd[0] == READ_10 || scsicmd[0] == READ_6 ||
821 scsicmd[0] == READ_16) {
822 tf->command = qc->dev->read_cmd;
823 } else {
824 tf->command = qc->dev->write_cmd;
825 tf->flags |= ATA_TFLAG_WRITE;
826 }
827
828 if (scsicmd[0] == READ_10 || scsicmd[0] == WRITE_10) {
829 if (lba48) {
830 tf->hob_nsect = scsicmd[7];
831 tf->hob_lbal = scsicmd[2];
832
833 qc->nsect = ((unsigned int)scsicmd[7] << 8) |
834 scsicmd[8];
835 } else {
836 /* if we don't support LBA48 addressing, the request
837 * -may- be too large. */
838 if ((scsicmd[2] & 0xf0) || scsicmd[7])
839 return 1;
840
841 /* stores LBA27:24 in lower 4 bits of device reg */
842 tf->device |= scsicmd[2];
843
844 qc->nsect = scsicmd[8];
845 }
846
847 tf->nsect = scsicmd[8];
848 tf->lbal = scsicmd[5];
849 tf->lbam = scsicmd[4];
850 tf->lbah = scsicmd[3];
851
852 VPRINTK("ten-byte command\n");
853 return 0;
854 }
855
856 if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) {
857 qc->nsect = tf->nsect = scsicmd[4];
858 tf->lbal = scsicmd[3];
859 tf->lbam = scsicmd[2];
860 tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */
861
862 VPRINTK("six-byte command\n");
863 return 0;
864 }
865
866 if (scsicmd[0] == READ_16 || scsicmd[0] == WRITE_16) {
867 /* rule out impossible LBAs and sector counts */
868 if (scsicmd[2] || scsicmd[3] || scsicmd[10] || scsicmd[11])
869 return 1;
870
871 if (lba48) {
872 tf->hob_nsect = scsicmd[12];
873 tf->hob_lbal = scsicmd[6];
874 tf->hob_lbam = scsicmd[5];
875 tf->hob_lbah = scsicmd[4];
876
877 qc->nsect = ((unsigned int)scsicmd[12] << 8) |
878 scsicmd[13];
879 } else {
880 /* once again, filter out impossible non-zero values */
881 if (scsicmd[4] || scsicmd[5] || scsicmd[12] ||
882 (scsicmd[6] & 0xf0))
883 return 1;
884
885 /* stores LBA27:24 in lower 4 bits of device reg */
886 tf->device |= scsicmd[6];
887
888 qc->nsect = scsicmd[13];
889 }
890
891 tf->nsect = scsicmd[13];
892 tf->lbal = scsicmd[9];
893 tf->lbam = scsicmd[8];
894 tf->lbah = scsicmd[7];
895
896 VPRINTK("sixteen-byte command\n");
897 return 0;
898 }
899
900 DPRINTK("no-byte command\n");
901 return 1;
902}
903
904static int ata_scsi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat)
905{
906 struct scsi_cmnd *cmd = qc->scsicmd;
Jeff Garzikb0955182005-05-12 15:45:22 -0400907 int need_sense = drv_stat & (ATA_ERR | ATA_BUSY | ATA_DRQ);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908
Jeff Garzikb0955182005-05-12 15:45:22 -0400909 /* For ATA pass thru (SAT) commands, generate a sense block if
910 * user mandated it or if there's an error. Note that if we
911 * generate because the user forced us to, a check condition
912 * is generated and the ATA register values are returned
913 * whether the command completed successfully or not. If there
914 * was no error, SK, ASC and ASCQ will all be zero.
915 */
916 if (((cmd->cmnd[0] == ATA_16) || (cmd->cmnd[0] == ATA_12)) &&
917 ((cmd->cmnd[2] & 0x20) || need_sense)) {
918 ata_gen_ata_desc_sense(qc);
919 } else {
920 if (!need_sense) {
921 cmd->result = SAM_STAT_GOOD;
922 } else {
923 /* TODO: decide which descriptor format to use
924 * for 48b LBA devices and call that here
925 * instead of the fixed desc, which is only
926 * good for smaller LBA (and maybe CHS?)
927 * devices.
928 */
929 ata_gen_fixed_sense(qc);
930 }
931 }
932
933 if (need_sense) {
934 /* The ata_gen_..._sense routines fill in tf */
935 ata_dump_status(qc->ap->id, &qc->tf);
936 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937
938 qc->scsidone(cmd);
939
940 return 0;
941}
942
943/**
944 * ata_scsi_translate - Translate then issue SCSI command to ATA device
945 * @ap: ATA port to which the command is addressed
946 * @dev: ATA device to which the command is addressed
947 * @cmd: SCSI command to execute
948 * @done: SCSI command completion function
949 * @xlat_func: Actor which translates @cmd to an ATA taskfile
950 *
951 * Our ->queuecommand() function has decided that the SCSI
952 * command issued can be directly translated into an ATA
953 * command, rather than handled internally.
954 *
955 * This function sets up an ata_queued_cmd structure for the
956 * SCSI command, and sends that ata_queued_cmd to the hardware.
957 *
958 * LOCKING:
959 * spin_lock_irqsave(host_set lock)
960 */
961
962static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
963 struct scsi_cmnd *cmd,
964 void (*done)(struct scsi_cmnd *),
965 ata_xlat_func_t xlat_func)
966{
967 struct ata_queued_cmd *qc;
968 u8 *scsicmd = cmd->cmnd;
969
970 VPRINTK("ENTER\n");
971
972 qc = ata_scsi_qc_new(ap, dev, cmd, done);
973 if (!qc)
974 return;
975
976 /* data is present; dma-map it */
Jeff Garzikb0955182005-05-12 15:45:22 -0400977 if (cmd->sc_data_direction == SCSI_DATA_READ ||
978 cmd->sc_data_direction == SCSI_DATA_WRITE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 if (unlikely(cmd->request_bufflen < 1)) {
980 printk(KERN_WARNING "ata%u(%u): WARNING: zero len r/w req\n",
981 ap->id, dev->devno);
982 goto err_out;
983 }
984
985 if (cmd->use_sg)
986 ata_sg_init(qc, cmd->request_buffer, cmd->use_sg);
987 else
988 ata_sg_init_one(qc, cmd->request_buffer,
989 cmd->request_bufflen);
990
991 qc->dma_dir = cmd->sc_data_direction;
992 }
993
994 qc->complete_fn = ata_scsi_qc_complete;
995
996 if (xlat_func(qc, scsicmd))
997 goto err_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 /* select device, send command to hardware */
999 if (ata_qc_issue(qc))
1000 goto err_out;
1001
1002 VPRINTK("EXIT\n");
1003 return;
1004
1005err_out:
1006 ata_qc_free(qc);
1007 ata_bad_cdb(cmd, done);
1008 DPRINTK("EXIT - badcmd\n");
1009}
1010
1011/**
1012 * ata_scsi_rbuf_get - Map response buffer.
1013 * @cmd: SCSI command containing buffer to be mapped.
1014 * @buf_out: Pointer to mapped area.
1015 *
1016 * Maps buffer contained within SCSI command @cmd.
1017 *
1018 * LOCKING:
1019 * spin_lock_irqsave(host_set lock)
1020 *
1021 * RETURNS:
1022 * Length of response buffer.
1023 */
1024
1025static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
1026{
1027 u8 *buf;
1028 unsigned int buflen;
1029
1030 if (cmd->use_sg) {
1031 struct scatterlist *sg;
1032
1033 sg = (struct scatterlist *) cmd->request_buffer;
1034 buf = kmap_atomic(sg->page, KM_USER0) + sg->offset;
1035 buflen = sg->length;
1036 } else {
1037 buf = cmd->request_buffer;
1038 buflen = cmd->request_bufflen;
1039 }
1040
1041 *buf_out = buf;
1042 return buflen;
1043}
1044
1045/**
1046 * ata_scsi_rbuf_put - Unmap response buffer.
1047 * @cmd: SCSI command containing buffer to be unmapped.
1048 * @buf: buffer to unmap
1049 *
1050 * Unmaps response buffer contained within @cmd.
1051 *
1052 * LOCKING:
1053 * spin_lock_irqsave(host_set lock)
1054 */
1055
1056static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
1057{
1058 if (cmd->use_sg) {
1059 struct scatterlist *sg;
1060
1061 sg = (struct scatterlist *) cmd->request_buffer;
1062 kunmap_atomic(buf - sg->offset, KM_USER0);
1063 }
1064}
1065
1066/**
1067 * ata_scsi_rbuf_fill - wrapper for SCSI command simulators
1068 * @args: device IDENTIFY data / SCSI command of interest.
1069 * @actor: Callback hook for desired SCSI command simulator
1070 *
1071 * Takes care of the hard work of simulating a SCSI command...
1072 * Mapping the response buffer, calling the command's handler,
1073 * and handling the handler's return value. This return value
1074 * indicates whether the handler wishes the SCSI command to be
1075 * completed successfully, or not.
1076 *
1077 * LOCKING:
1078 * spin_lock_irqsave(host_set lock)
1079 */
1080
1081void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
1082 unsigned int (*actor) (struct ata_scsi_args *args,
1083 u8 *rbuf, unsigned int buflen))
1084{
1085 u8 *rbuf;
1086 unsigned int buflen, rc;
1087 struct scsi_cmnd *cmd = args->cmd;
1088
1089 buflen = ata_scsi_rbuf_get(cmd, &rbuf);
1090 memset(rbuf, 0, buflen);
1091 rc = actor(args, rbuf, buflen);
1092 ata_scsi_rbuf_put(cmd, rbuf);
1093
1094 if (rc)
1095 ata_bad_cdb(cmd, args->done);
1096 else {
1097 cmd->result = SAM_STAT_GOOD;
1098 args->done(cmd);
1099 }
1100}
1101
1102/**
1103 * ata_scsiop_inq_std - Simulate INQUIRY command
1104 * @args: device IDENTIFY data / SCSI command of interest.
1105 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1106 * @buflen: Response buffer length.
1107 *
1108 * Returns standard device identification data associated
1109 * with non-EVPD INQUIRY command output.
1110 *
1111 * LOCKING:
1112 * spin_lock_irqsave(host_set lock)
1113 */
1114
1115unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
1116 unsigned int buflen)
1117{
1118 u8 hdr[] = {
1119 TYPE_DISK,
1120 0,
1121 0x5, /* claim SPC-3 version compatibility */
1122 2,
1123 95 - 4
1124 };
1125
1126 /* set scsi removeable (RMB) bit per ata bit */
1127 if (ata_id_removeable(args->id))
1128 hdr[1] |= (1 << 7);
1129
1130 VPRINTK("ENTER\n");
1131
1132 memcpy(rbuf, hdr, sizeof(hdr));
1133
1134 if (buflen > 35) {
1135 memcpy(&rbuf[8], "ATA ", 8);
1136 ata_dev_id_string(args->id, &rbuf[16], ATA_ID_PROD_OFS, 16);
1137 ata_dev_id_string(args->id, &rbuf[32], ATA_ID_FW_REV_OFS, 4);
1138 if (rbuf[32] == 0 || rbuf[32] == ' ')
1139 memcpy(&rbuf[32], "n/a ", 4);
1140 }
1141
1142 if (buflen > 63) {
1143 const u8 versions[] = {
1144 0x60, /* SAM-3 (no version claimed) */
1145
1146 0x03,
1147 0x20, /* SBC-2 (no version claimed) */
1148
1149 0x02,
1150 0x60 /* SPC-3 (no version claimed) */
1151 };
1152
1153 memcpy(rbuf + 59, versions, sizeof(versions));
1154 }
1155
1156 return 0;
1157}
1158
1159/**
1160 * ata_scsiop_inq_00 - Simulate INQUIRY EVPD page 0, list of pages
1161 * @args: device IDENTIFY data / SCSI command of interest.
1162 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1163 * @buflen: Response buffer length.
1164 *
1165 * Returns list of inquiry EVPD pages available.
1166 *
1167 * LOCKING:
1168 * spin_lock_irqsave(host_set lock)
1169 */
1170
1171unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf,
1172 unsigned int buflen)
1173{
1174 const u8 pages[] = {
1175 0x00, /* page 0x00, this page */
1176 0x80, /* page 0x80, unit serial no page */
1177 0x83 /* page 0x83, device ident page */
1178 };
1179 rbuf[3] = sizeof(pages); /* number of supported EVPD pages */
1180
1181 if (buflen > 6)
1182 memcpy(rbuf + 4, pages, sizeof(pages));
1183
1184 return 0;
1185}
1186
1187/**
1188 * ata_scsiop_inq_80 - Simulate INQUIRY EVPD page 80, device serial number
1189 * @args: device IDENTIFY data / SCSI command of interest.
1190 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1191 * @buflen: Response buffer length.
1192 *
1193 * Returns ATA device serial number.
1194 *
1195 * LOCKING:
1196 * spin_lock_irqsave(host_set lock)
1197 */
1198
1199unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
1200 unsigned int buflen)
1201{
1202 const u8 hdr[] = {
1203 0,
1204 0x80, /* this page code */
1205 0,
1206 ATA_SERNO_LEN, /* page len */
1207 };
1208 memcpy(rbuf, hdr, sizeof(hdr));
1209
1210 if (buflen > (ATA_SERNO_LEN + 4 - 1))
1211 ata_dev_id_string(args->id, (unsigned char *) &rbuf[4],
1212 ATA_ID_SERNO_OFS, ATA_SERNO_LEN);
1213
1214 return 0;
1215}
1216
1217static const char *inq_83_str = "Linux ATA-SCSI simulator";
1218
1219/**
1220 * ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity
1221 * @args: device IDENTIFY data / SCSI command of interest.
1222 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1223 * @buflen: Response buffer length.
1224 *
1225 * Returns device identification. Currently hardcoded to
1226 * return "Linux ATA-SCSI simulator".
1227 *
1228 * LOCKING:
1229 * spin_lock_irqsave(host_set lock)
1230 */
1231
1232unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
1233 unsigned int buflen)
1234{
1235 rbuf[1] = 0x83; /* this page code */
1236 rbuf[3] = 4 + strlen(inq_83_str); /* page len */
1237
1238 /* our one and only identification descriptor (vendor-specific) */
1239 if (buflen > (strlen(inq_83_str) + 4 + 4 - 1)) {
1240 rbuf[4 + 0] = 2; /* code set: ASCII */
1241 rbuf[4 + 3] = strlen(inq_83_str);
1242 memcpy(rbuf + 4 + 4, inq_83_str, strlen(inq_83_str));
1243 }
1244
1245 return 0;
1246}
1247
1248/**
1249 * ata_scsiop_noop -
1250 * @args: device IDENTIFY data / SCSI command of interest.
1251 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1252 * @buflen: Response buffer length.
1253 *
1254 * No operation. Simply returns success to caller, to indicate
1255 * that the caller should successfully complete this SCSI command.
1256 *
1257 * LOCKING:
1258 * spin_lock_irqsave(host_set lock)
1259 */
1260
1261unsigned int ata_scsiop_noop(struct ata_scsi_args *args, u8 *rbuf,
1262 unsigned int buflen)
1263{
1264 VPRINTK("ENTER\n");
1265 return 0;
1266}
1267
1268/**
1269 * ata_msense_push - Push data onto MODE SENSE data output buffer
1270 * @ptr_io: (input/output) Location to store more output data
1271 * @last: End of output data buffer
1272 * @buf: Pointer to BLOB being added to output buffer
1273 * @buflen: Length of BLOB
1274 *
1275 * Store MODE SENSE data on an output buffer.
1276 *
1277 * LOCKING:
1278 * None.
1279 */
1280
1281static void ata_msense_push(u8 **ptr_io, const u8 *last,
1282 const u8 *buf, unsigned int buflen)
1283{
1284 u8 *ptr = *ptr_io;
1285
1286 if ((ptr + buflen - 1) > last)
1287 return;
1288
1289 memcpy(ptr, buf, buflen);
1290
1291 ptr += buflen;
1292
1293 *ptr_io = ptr;
1294}
1295
1296/**
1297 * ata_msense_caching - Simulate MODE SENSE caching info page
1298 * @id: device IDENTIFY data
1299 * @ptr_io: (input/output) Location to store more output data
1300 * @last: End of output data buffer
1301 *
1302 * Generate a caching info page, which conditionally indicates
1303 * write caching to the SCSI layer, depending on device
1304 * capabilities.
1305 *
1306 * LOCKING:
1307 * None.
1308 */
1309
1310static unsigned int ata_msense_caching(u16 *id, u8 **ptr_io,
1311 const u8 *last)
1312{
1313 u8 page[] = {
1314 0x8, /* page code */
1315 0x12, /* page length */
1316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 zeroes */
1317 0, 0, 0, 0, 0, 0, 0, 0 /* 8 zeroes */
1318 };
1319
1320 if (ata_id_wcache_enabled(id))
1321 page[2] |= (1 << 2); /* write cache enable */
1322 if (!ata_id_rahead_enabled(id))
1323 page[12] |= (1 << 5); /* disable read ahead */
1324
1325 ata_msense_push(ptr_io, last, page, sizeof(page));
1326 return sizeof(page);
1327}
1328
1329/**
1330 * ata_msense_ctl_mode - Simulate MODE SENSE control mode page
1331 * @dev: Device associated with this MODE SENSE command
1332 * @ptr_io: (input/output) Location to store more output data
1333 * @last: End of output data buffer
1334 *
1335 * Generate a generic MODE SENSE control mode page.
1336 *
1337 * LOCKING:
1338 * None.
1339 */
1340
1341static unsigned int ata_msense_ctl_mode(u8 **ptr_io, const u8 *last)
1342{
1343 const u8 page[] = {0xa, 0xa, 6, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 30};
1344
1345 /* byte 2: set the descriptor format sense data bit (bit 2)
1346 * since we need to support returning this format for SAT
1347 * commands and any SCSI commands against a 48b LBA device.
1348 */
1349
1350 ata_msense_push(ptr_io, last, page, sizeof(page));
1351 return sizeof(page);
1352}
1353
1354/**
1355 * ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page
1356 * @dev: Device associated with this MODE SENSE command
1357 * @ptr_io: (input/output) Location to store more output data
1358 * @last: End of output data buffer
1359 *
1360 * Generate a generic MODE SENSE r/w error recovery page.
1361 *
1362 * LOCKING:
1363 * None.
1364 */
1365
1366static unsigned int ata_msense_rw_recovery(u8 **ptr_io, const u8 *last)
1367{
1368 const u8 page[] = {
1369 0x1, /* page code */
1370 0xa, /* page length */
1371 (1 << 7) | (1 << 6), /* note auto r/w reallocation */
1372 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 9 zeroes */
1373 };
1374
1375 ata_msense_push(ptr_io, last, page, sizeof(page));
1376 return sizeof(page);
1377}
1378
1379/**
1380 * ata_scsiop_mode_sense - Simulate MODE SENSE 6, 10 commands
1381 * @args: device IDENTIFY data / SCSI command of interest.
1382 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1383 * @buflen: Response buffer length.
1384 *
1385 * Simulate MODE SENSE commands.
1386 *
1387 * LOCKING:
1388 * spin_lock_irqsave(host_set lock)
1389 */
1390
1391unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf,
1392 unsigned int buflen)
1393{
1394 u8 *scsicmd = args->cmd->cmnd, *p, *last;
1395 unsigned int page_control, six_byte, output_len;
1396
1397 VPRINTK("ENTER\n");
1398
1399 six_byte = (scsicmd[0] == MODE_SENSE);
1400
1401 /* we only support saved and current values (which we treat
1402 * in the same manner)
1403 */
1404 page_control = scsicmd[2] >> 6;
1405 if ((page_control != 0) && (page_control != 3))
1406 return 1;
1407
1408 if (six_byte)
1409 output_len = 4;
1410 else
1411 output_len = 8;
1412
1413 p = rbuf + output_len;
1414 last = rbuf + buflen - 1;
1415
1416 switch(scsicmd[2] & 0x3f) {
1417 case 0x01: /* r/w error recovery */
1418 output_len += ata_msense_rw_recovery(&p, last);
1419 break;
1420
1421 case 0x08: /* caching */
1422 output_len += ata_msense_caching(args->id, &p, last);
1423 break;
1424
1425 case 0x0a: { /* control mode */
1426 output_len += ata_msense_ctl_mode(&p, last);
1427 break;
1428 }
1429
1430 case 0x3f: /* all pages */
1431 output_len += ata_msense_rw_recovery(&p, last);
1432 output_len += ata_msense_caching(args->id, &p, last);
1433 output_len += ata_msense_ctl_mode(&p, last);
1434 break;
1435
1436 default: /* invalid page code */
1437 return 1;
1438 }
1439
1440 if (six_byte) {
1441 output_len--;
1442 rbuf[0] = output_len;
1443 } else {
1444 output_len -= 2;
1445 rbuf[0] = output_len >> 8;
1446 rbuf[1] = output_len;
1447 }
1448
1449 return 0;
1450}
1451
1452/**
1453 * ata_scsiop_read_cap - Simulate READ CAPACITY[ 16] commands
1454 * @args: device IDENTIFY data / SCSI command of interest.
1455 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1456 * @buflen: Response buffer length.
1457 *
1458 * Simulate READ CAPACITY commands.
1459 *
1460 * LOCKING:
1461 * spin_lock_irqsave(host_set lock)
1462 */
1463
1464unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
1465 unsigned int buflen)
1466{
1467 u64 n_sectors;
1468 u32 tmp;
1469
1470 VPRINTK("ENTER\n");
1471
1472 if (ata_id_has_lba48(args->id))
1473 n_sectors = ata_id_u64(args->id, 100);
1474 else
1475 n_sectors = ata_id_u32(args->id, 60);
1476 n_sectors--; /* ATA TotalUserSectors - 1 */
1477
1478 tmp = n_sectors; /* note: truncates, if lba48 */
1479 if (args->cmd->cmnd[0] == READ_CAPACITY) {
1480 /* sector count, 32-bit */
1481 rbuf[0] = tmp >> (8 * 3);
1482 rbuf[1] = tmp >> (8 * 2);
1483 rbuf[2] = tmp >> (8 * 1);
1484 rbuf[3] = tmp;
1485
1486 /* sector size */
1487 tmp = ATA_SECT_SIZE;
1488 rbuf[6] = tmp >> 8;
1489 rbuf[7] = tmp;
1490
1491 } else {
1492 /* sector count, 64-bit */
1493 rbuf[2] = n_sectors >> (8 * 7);
1494 rbuf[3] = n_sectors >> (8 * 6);
1495 rbuf[4] = n_sectors >> (8 * 5);
1496 rbuf[5] = n_sectors >> (8 * 4);
1497 rbuf[6] = tmp >> (8 * 3);
1498 rbuf[7] = tmp >> (8 * 2);
1499 rbuf[8] = tmp >> (8 * 1);
1500 rbuf[9] = tmp;
1501
1502 /* sector size */
1503 tmp = ATA_SECT_SIZE;
1504 rbuf[12] = tmp >> 8;
1505 rbuf[13] = tmp;
1506 }
1507
1508 return 0;
1509}
1510
1511/**
1512 * ata_scsiop_report_luns - Simulate REPORT LUNS command
1513 * @args: device IDENTIFY data / SCSI command of interest.
1514 * @rbuf: Response buffer, to which simulated SCSI cmd output is sent.
1515 * @buflen: Response buffer length.
1516 *
1517 * Simulate REPORT LUNS command.
1518 *
1519 * LOCKING:
1520 * spin_lock_irqsave(host_set lock)
1521 */
1522
1523unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
1524 unsigned int buflen)
1525{
1526 VPRINTK("ENTER\n");
1527 rbuf[3] = 8; /* just one lun, LUN 0, size 8 bytes */
1528
1529 return 0;
1530}
1531
1532/**
1533 * ata_scsi_badcmd - End a SCSI request with an error
1534 * @cmd: SCSI request to be handled
1535 * @done: SCSI command completion function
1536 * @asc: SCSI-defined additional sense code
1537 * @ascq: SCSI-defined additional sense code qualifier
1538 *
1539 * Helper function that completes a SCSI command with
1540 * %SAM_STAT_CHECK_CONDITION, with a sense key %ILLEGAL_REQUEST
1541 * and the specified additional sense codes.
1542 *
1543 * LOCKING:
1544 * spin_lock_irqsave(host_set lock)
1545 */
1546
1547void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq)
1548{
1549 DPRINTK("ENTER\n");
1550 cmd->result = SAM_STAT_CHECK_CONDITION;
1551
1552 cmd->sense_buffer[0] = 0x70;
1553 cmd->sense_buffer[2] = ILLEGAL_REQUEST;
1554 cmd->sense_buffer[7] = 14 - 8; /* addnl. sense len. FIXME: correct? */
1555 cmd->sense_buffer[12] = asc;
1556 cmd->sense_buffer[13] = ascq;
1557
1558 done(cmd);
1559}
1560
1561static int atapi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat)
1562{
1563 struct scsi_cmnd *cmd = qc->scsicmd;
1564
1565 if (unlikely(drv_stat & (ATA_ERR | ATA_BUSY | ATA_DRQ))) {
1566 DPRINTK("request check condition\n");
1567
1568 cmd->result = SAM_STAT_CHECK_CONDITION;
1569
1570 qc->scsidone(cmd);
1571
1572 return 1;
1573 } else {
1574 u8 *scsicmd = cmd->cmnd;
1575
1576 if (scsicmd[0] == INQUIRY) {
1577 u8 *buf = NULL;
1578 unsigned int buflen;
1579
1580 buflen = ata_scsi_rbuf_get(cmd, &buf);
1581 buf[2] = 0x5;
1582 buf[3] = (buf[3] & 0xf0) | 2;
1583 ata_scsi_rbuf_put(cmd, buf);
1584 }
1585 cmd->result = SAM_STAT_GOOD;
1586 }
1587
1588 qc->scsidone(cmd);
1589
1590 return 0;
1591}
1592/**
1593 * atapi_xlat - Initialize PACKET taskfile
1594 * @qc: command structure to be initialized
1595 * @scsicmd: SCSI CDB associated with this PACKET command
1596 *
1597 * LOCKING:
1598 * spin_lock_irqsave(host_set lock)
1599 *
1600 * RETURNS:
1601 * Zero on success, non-zero on failure.
1602 */
1603
1604static unsigned int atapi_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
1605{
1606 struct scsi_cmnd *cmd = qc->scsicmd;
1607 struct ata_device *dev = qc->dev;
1608 int using_pio = (dev->flags & ATA_DFLAG_PIO);
Jeff Garzikb0955182005-05-12 15:45:22 -04001609 int nodata = (cmd->sc_data_direction == SCSI_DATA_NONE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001610
1611 if (!using_pio)
1612 /* Check whether ATAPI DMA is safe */
1613 if (ata_check_atapi_dma(qc))
1614 using_pio = 1;
1615
1616 memcpy(&qc->cdb, scsicmd, qc->ap->cdb_len);
1617
1618 qc->complete_fn = atapi_qc_complete;
1619
1620 qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
Jeff Garzikb0955182005-05-12 15:45:22 -04001621 if (cmd->sc_data_direction == SCSI_DATA_WRITE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 qc->tf.flags |= ATA_TFLAG_WRITE;
1623 DPRINTK("direction: write\n");
1624 }
1625
1626 qc->tf.command = ATA_CMD_PACKET;
1627
1628 /* no data, or PIO data xfer */
1629 if (using_pio || nodata) {
1630 if (nodata)
1631 qc->tf.protocol = ATA_PROT_ATAPI_NODATA;
1632 else
1633 qc->tf.protocol = ATA_PROT_ATAPI;
1634 qc->tf.lbam = (8 * 1024) & 0xff;
1635 qc->tf.lbah = (8 * 1024) >> 8;
1636 }
1637
1638 /* DMA data xfer */
1639 else {
1640 qc->tf.protocol = ATA_PROT_ATAPI_DMA;
1641 qc->tf.feature |= ATAPI_PKT_DMA;
1642
1643#ifdef ATAPI_ENABLE_DMADIR
1644 /* some SATA bridges need us to indicate data xfer direction */
Jeff Garzikb0955182005-05-12 15:45:22 -04001645 if (cmd->sc_data_direction != SCSI_DATA_WRITE)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 qc->tf.feature |= ATAPI_DMADIR;
1647#endif
1648 }
1649
1650 qc->nbytes = cmd->bufflen;
1651
1652 return 0;
1653}
1654
1655/**
1656 * ata_scsi_find_dev - lookup ata_device from scsi_cmnd
1657 * @ap: ATA port to which the device is attached
1658 * @scsidev: SCSI device from which we derive the ATA device
1659 *
1660 * Given various information provided in struct scsi_cmnd,
1661 * map that onto an ATA bus, and using that mapping
1662 * determine which ata_device is associated with the
1663 * SCSI command to be sent.
1664 *
1665 * LOCKING:
1666 * spin_lock_irqsave(host_set lock)
1667 *
1668 * RETURNS:
1669 * Associated ATA device, or %NULL if not found.
1670 */
1671
1672static struct ata_device *
1673ata_scsi_find_dev(struct ata_port *ap, struct scsi_device *scsidev)
1674{
1675 struct ata_device *dev;
1676
1677 /* skip commands not addressed to targets we simulate */
1678 if (likely(scsidev->id < ATA_MAX_DEVICES))
1679 dev = &ap->device[scsidev->id];
1680 else
1681 return NULL;
1682
1683 if (unlikely((scsidev->channel != 0) ||
1684 (scsidev->lun != 0)))
1685 return NULL;
1686
1687 if (unlikely(!ata_dev_present(dev)))
1688 return NULL;
1689
1690#ifndef ATA_ENABLE_ATAPI
1691 if (unlikely(dev->class == ATA_DEV_ATAPI))
1692 return NULL;
1693#endif
1694
1695 return dev;
1696}
1697
Jeff Garzikb0955182005-05-12 15:45:22 -04001698/*
1699 * ata_scsi_map_proto - Map pass-thru protocol value to taskfile value.
1700 * @byte1: Byte 1 from pass-thru CDB.
1701 *
1702 * RETURNS:
1703 * ATA_PROT_UNKNOWN if mapping failed/unimplemented, protocol otherwise.
1704 */
1705static u8
1706ata_scsi_map_proto(u8 byte1)
1707{
1708 switch((byte1 & 0x1e) >> 1) {
1709 case 3: /* Non-data */
1710 return ATA_PROT_NODATA;
1711
1712 case 6: /* DMA */
1713 return ATA_PROT_DMA;
1714
1715 case 4: /* PIO Data-in */
1716 case 5: /* PIO Data-out */
1717 if (byte1 & 0xe0) {
1718 return ATA_PROT_PIO_MULT;
1719 }
1720 return ATA_PROT_PIO;
1721
1722 case 10: /* Device Reset */
1723 case 0: /* Hard Reset */
1724 case 1: /* SRST */
1725 case 2: /* Bus Idle */
1726 case 7: /* Packet */
1727 case 8: /* DMA Queued */
1728 case 9: /* Device Diagnostic */
1729 case 11: /* UDMA Data-in */
1730 case 12: /* UDMA Data-Out */
1731 case 13: /* FPDMA */
1732 default: /* Reserved */
1733 break;
1734 }
1735
1736 return ATA_PROT_UNKNOWN;
1737}
1738
1739/**
1740 * ata_scsi_pass_thru - convert ATA pass-thru CDB to taskfile
1741 * @qc: command structure to be initialized
1742 * @cmd: SCSI command to convert
1743 *
1744 * Handles either 12 or 16-byte versions of the CDB.
1745 *
1746 * RETURNS:
1747 * Zero on success, non-zero on failure.
1748 */
1749static unsigned int
1750ata_scsi_pass_thru(struct ata_queued_cmd *qc, u8 *scsicmd)
1751{
1752 struct ata_taskfile *tf = &(qc->tf);
1753 struct scsi_cmnd *cmd = qc->scsicmd;
1754
1755 if ((tf->protocol = ata_scsi_map_proto(scsicmd[1])) == ATA_PROT_UNKNOWN)
1756 return 1;
1757
1758 /*
1759 * 12 and 16 byte CDBs use different offsets to
1760 * provide the various register values.
1761 */
1762 if (scsicmd[0] == ATA_16) {
1763 /*
1764 * 16-byte CDB - may contain extended commands.
1765 *
1766 * If that is the case, copy the upper byte register values.
1767 */
1768 if (scsicmd[1] & 0x01) {
1769 tf->hob_feature = scsicmd[3];
1770 tf->hob_nsect = scsicmd[5];
1771 tf->hob_lbal = scsicmd[7];
1772 tf->hob_lbam = scsicmd[9];
1773 tf->hob_lbah = scsicmd[11];
1774 tf->flags |= ATA_TFLAG_LBA48;
1775 } else
1776 tf->flags &= ~ATA_TFLAG_LBA48;
1777
1778 /*
1779 * Always copy low byte, device and command registers.
1780 */
1781 tf->feature = scsicmd[4];
1782 tf->nsect = scsicmd[6];
1783 tf->lbal = scsicmd[8];
1784 tf->lbam = scsicmd[10];
1785 tf->lbah = scsicmd[12];
1786 tf->device = scsicmd[13];
1787 tf->command = scsicmd[14];
1788 } else {
1789 /*
1790 * 12-byte CDB - incapable of extended commands.
1791 */
1792 tf->flags &= ~ATA_TFLAG_LBA48;
1793
1794 tf->feature = scsicmd[3];
1795 tf->nsect = scsicmd[4];
1796 tf->lbal = scsicmd[5];
1797 tf->lbam = scsicmd[6];
1798 tf->lbah = scsicmd[7];
1799 tf->device = scsicmd[8];
1800 tf->command = scsicmd[9];
1801 }
1802
1803 /*
1804 * Filter SET_FEATURES - XFER MODE command -- otherwise,
1805 * SET_FEATURES - XFER MODE must be preceded/succeeded
1806 * by an update to hardware-specific registers for each
1807 * controller (i.e. the reason for ->set_piomode(),
1808 * ->set_dmamode(), and ->post_set_mode() hooks).
1809 */
1810 if ((tf->command == ATA_CMD_SET_FEATURES)
1811 && (tf->feature == SETFEATURES_XFER))
1812 return 1;
1813
1814 /*
1815 * Set flags so that all registers will be written,
1816 * and pass on write indication (used for PIO/DMA
1817 * setup.)
1818 */
1819 tf->flags |= (ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE);
1820
1821 if (cmd->sc_data_direction == SCSI_DATA_WRITE)
1822 tf->flags |= ATA_TFLAG_WRITE;
1823
1824 /*
1825 * Set transfer length.
1826 *
1827 * TODO: find out if we need to do more here to
1828 * cover scatter/gather case.
1829 */
1830 qc->nsect = cmd->bufflen / ATA_SECT_SIZE;
1831
1832 return 0;
1833}
1834
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835/**
1836 * ata_get_xlat_func - check if SCSI to ATA translation is possible
1837 * @dev: ATA device
1838 * @cmd: SCSI command opcode to consider
1839 *
1840 * Look up the SCSI command given, and determine whether the
1841 * SCSI command is to be translated or simulated.
1842 *
1843 * RETURNS:
1844 * Pointer to translation function if possible, %NULL if not.
1845 */
1846
1847static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
1848{
1849 switch (cmd) {
1850 case READ_6:
1851 case READ_10:
1852 case READ_16:
1853
1854 case WRITE_6:
1855 case WRITE_10:
1856 case WRITE_16:
1857 return ata_scsi_rw_xlat;
1858
1859 case SYNCHRONIZE_CACHE:
1860 if (ata_try_flush_cache(dev))
1861 return ata_scsi_flush_xlat;
1862 break;
1863
1864 case VERIFY:
1865 case VERIFY_16:
1866 return ata_scsi_verify_xlat;
Jeff Garzikb0955182005-05-12 15:45:22 -04001867
1868 case ATA_12:
1869 case ATA_16:
1870 return ata_scsi_pass_thru;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 }
1872
1873 return NULL;
1874}
1875
1876/**
1877 * ata_scsi_dump_cdb - dump SCSI command contents to dmesg
1878 * @ap: ATA port to which the command was being sent
1879 * @cmd: SCSI command to dump
1880 *
1881 * Prints the contents of a SCSI command via printk().
1882 */
1883
1884static inline void ata_scsi_dump_cdb(struct ata_port *ap,
1885 struct scsi_cmnd *cmd)
1886{
1887#ifdef ATA_DEBUG
1888 struct scsi_device *scsidev = cmd->device;
1889 u8 *scsicmd = cmd->cmnd;
1890
1891 DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
1892 ap->id,
1893 scsidev->channel, scsidev->id, scsidev->lun,
1894 scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
1895 scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
1896 scsicmd[8]);
1897#endif
1898}
1899
1900/**
1901 * ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device
1902 * @cmd: SCSI command to be sent
1903 * @done: Completion function, called when command is complete
1904 *
1905 * In some cases, this function translates SCSI commands into
1906 * ATA taskfiles, and queues the taskfiles to be sent to
1907 * hardware. In other cases, this function simulates a
1908 * SCSI device by evaluating and responding to certain
1909 * SCSI commands. This creates the overall effect of
1910 * ATA and ATAPI devices appearing as SCSI devices.
1911 *
1912 * LOCKING:
1913 * Releases scsi-layer-held lock, and obtains host_set lock.
1914 *
1915 * RETURNS:
1916 * Zero.
1917 */
1918
1919int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
1920{
1921 struct ata_port *ap;
1922 struct ata_device *dev;
1923 struct scsi_device *scsidev = cmd->device;
1924
1925 ap = (struct ata_port *) &scsidev->host->hostdata[0];
1926
1927 ata_scsi_dump_cdb(ap, cmd);
1928
1929 dev = ata_scsi_find_dev(ap, scsidev);
1930 if (unlikely(!dev)) {
1931 cmd->result = (DID_BAD_TARGET << 16);
1932 done(cmd);
1933 goto out_unlock;
1934 }
1935
1936 if (dev->class == ATA_DEV_ATA) {
1937 ata_xlat_func_t xlat_func = ata_get_xlat_func(dev,
1938 cmd->cmnd[0]);
1939
1940 if (xlat_func)
1941 ata_scsi_translate(ap, dev, cmd, done, xlat_func);
1942 else
1943 ata_scsi_simulate(dev->id, cmd, done);
1944 } else
1945 ata_scsi_translate(ap, dev, cmd, done, atapi_xlat);
1946
1947out_unlock:
1948 return 0;
1949}
1950
1951/**
1952 * ata_scsi_simulate - simulate SCSI command on ATA device
1953 * @id: current IDENTIFY data for target device.
1954 * @cmd: SCSI command being sent to device.
1955 * @done: SCSI command completion function.
1956 *
1957 * Interprets and directly executes a select list of SCSI commands
1958 * that can be handled internally.
1959 *
1960 * LOCKING:
1961 * spin_lock_irqsave(host_set lock)
1962 */
1963
1964void ata_scsi_simulate(u16 *id,
1965 struct scsi_cmnd *cmd,
1966 void (*done)(struct scsi_cmnd *))
1967{
1968 struct ata_scsi_args args;
1969 u8 *scsicmd = cmd->cmnd;
1970
1971 args.id = id;
1972 args.cmd = cmd;
1973 args.done = done;
1974
1975 switch(scsicmd[0]) {
1976 /* no-op's, complete with success */
1977 case SYNCHRONIZE_CACHE:
1978 case REZERO_UNIT:
1979 case SEEK_6:
1980 case SEEK_10:
1981 case TEST_UNIT_READY:
1982 case FORMAT_UNIT: /* FIXME: correct? */
1983 case SEND_DIAGNOSTIC: /* FIXME: correct? */
1984 ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
1985 break;
1986
1987 case INQUIRY:
1988 if (scsicmd[1] & 2) /* is CmdDt set? */
1989 ata_bad_cdb(cmd, done);
1990 else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
1991 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
1992 else if (scsicmd[2] == 0x00)
1993 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
1994 else if (scsicmd[2] == 0x80)
1995 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
1996 else if (scsicmd[2] == 0x83)
1997 ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
1998 else
1999 ata_bad_cdb(cmd, done);
2000 break;
2001
2002 case MODE_SENSE:
2003 case MODE_SENSE_10:
2004 ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
2005 break;
2006
2007 case MODE_SELECT: /* unconditionally return */
2008 case MODE_SELECT_10: /* bad-field-in-cdb */
2009 ata_bad_cdb(cmd, done);
2010 break;
2011
2012 case READ_CAPACITY:
2013 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2014 break;
2015
2016 case SERVICE_ACTION_IN:
2017 if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
2018 ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
2019 else
2020 ata_bad_cdb(cmd, done);
2021 break;
2022
2023 case REPORT_LUNS:
2024 ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
2025 break;
2026
Jeff Garzikb0955182005-05-12 15:45:22 -04002027 /* mandatory commands we haven't implemented yet */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 case REQUEST_SENSE:
2029
2030 /* all other commands */
2031 default:
2032 ata_bad_scsiop(cmd, done);
2033 break;
2034 }
2035}
2036