diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-28 12:06:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-28 12:06:50 -0400 |
commit | 5fadd053d9bb4345ec6f405d24db4e7eb49cf81e (patch) | |
tree | 73924189ef46511301d004946fbdd9937b00c484 /drivers/scsi/libata-scsi.c | |
parent | e5dfa9282f3db461a896a6692b529e1823ba98c6 (diff) | |
parent | 26ba2a7a9f4d8921f095af646a7d22c15a148028 (diff) |
Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
Diffstat (limited to 'drivers/scsi/libata-scsi.c')
-rw-r--r-- | drivers/scsi/libata-scsi.c | 730 |
1 files changed, 526 insertions, 204 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 104fd9a63e73..58858886d751 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -44,11 +44,19 @@ | |||
44 | 44 | ||
45 | #include "libata.h" | 45 | #include "libata.h" |
46 | 46 | ||
47 | typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, u8 *scsicmd); | 47 | typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, const u8 *scsicmd); |
48 | static struct ata_device * | 48 | static struct ata_device * |
49 | ata_scsi_find_dev(struct ata_port *ap, struct scsi_device *scsidev); | 49 | ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev); |
50 | 50 | ||
51 | 51 | ||
52 | static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, | ||
53 | void (*done)(struct scsi_cmnd *)) | ||
54 | { | ||
55 | ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x24, 0x0); | ||
56 | /* "Invalid field in cbd" */ | ||
57 | done(cmd); | ||
58 | } | ||
59 | |||
52 | /** | 60 | /** |
53 | * ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd. | 61 | * ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd. |
54 | * @sdev: SCSI device for which BIOS geometry is to be determined | 62 | * @sdev: SCSI device for which BIOS geometry is to be determined |
@@ -182,7 +190,6 @@ void ata_to_sense_error(struct ata_queued_cmd *qc, u8 drv_stat) | |||
182 | { | 190 | { |
183 | struct scsi_cmnd *cmd = qc->scsicmd; | 191 | struct scsi_cmnd *cmd = qc->scsicmd; |
184 | u8 err = 0; | 192 | u8 err = 0; |
185 | unsigned char *sb = cmd->sense_buffer; | ||
186 | /* Based on the 3ware driver translation table */ | 193 | /* Based on the 3ware driver translation table */ |
187 | static unsigned char sense_table[][4] = { | 194 | static unsigned char sense_table[][4] = { |
188 | /* BBD|ECC|ID|MAR */ | 195 | /* BBD|ECC|ID|MAR */ |
@@ -225,8 +232,6 @@ void ata_to_sense_error(struct ata_queued_cmd *qc, u8 drv_stat) | |||
225 | }; | 232 | }; |
226 | int i = 0; | 233 | int i = 0; |
227 | 234 | ||
228 | cmd->result = SAM_STAT_CHECK_CONDITION; | ||
229 | |||
230 | /* | 235 | /* |
231 | * Is this an error we can process/parse | 236 | * Is this an error we can process/parse |
232 | */ | 237 | */ |
@@ -281,11 +286,9 @@ void ata_to_sense_error(struct ata_queued_cmd *qc, u8 drv_stat) | |||
281 | /* Look for best matches first */ | 286 | /* Look for best matches first */ |
282 | if((sense_table[i][0] & err) == sense_table[i][0]) | 287 | if((sense_table[i][0] & err) == sense_table[i][0]) |
283 | { | 288 | { |
284 | sb[0] = 0x70; | 289 | ata_scsi_set_sense(cmd, sense_table[i][1] /* sk */, |
285 | sb[2] = sense_table[i][1]; | 290 | sense_table[i][2] /* asc */, |
286 | sb[7] = 0x0a; | 291 | sense_table[i][3] /* ascq */ ); |
287 | sb[12] = sense_table[i][2]; | ||
288 | sb[13] = sense_table[i][3]; | ||
289 | return; | 292 | return; |
290 | } | 293 | } |
291 | i++; | 294 | i++; |
@@ -300,11 +303,9 @@ void ata_to_sense_error(struct ata_queued_cmd *qc, u8 drv_stat) | |||
300 | { | 303 | { |
301 | if(stat_table[i][0] & drv_stat) | 304 | if(stat_table[i][0] & drv_stat) |
302 | { | 305 | { |
303 | sb[0] = 0x70; | 306 | ata_scsi_set_sense(cmd, sense_table[i][1] /* sk */, |
304 | sb[2] = stat_table[i][1]; | 307 | sense_table[i][2] /* asc */, |
305 | sb[7] = 0x0a; | 308 | sense_table[i][3] /* ascq */ ); |
306 | sb[12] = stat_table[i][2]; | ||
307 | sb[13] = stat_table[i][3]; | ||
308 | return; | 309 | return; |
309 | } | 310 | } |
310 | i++; | 311 | i++; |
@@ -313,15 +314,12 @@ void ata_to_sense_error(struct ata_queued_cmd *qc, u8 drv_stat) | |||
313 | printk(KERN_ERR "ata%u: called with no error (%02X)!\n", qc->ap->id, drv_stat); | 314 | printk(KERN_ERR "ata%u: called with no error (%02X)!\n", qc->ap->id, drv_stat); |
314 | /* additional-sense-code[-qualifier] */ | 315 | /* additional-sense-code[-qualifier] */ |
315 | 316 | ||
316 | sb[0] = 0x70; | ||
317 | sb[2] = MEDIUM_ERROR; | ||
318 | sb[7] = 0x0A; | ||
319 | if (cmd->sc_data_direction == DMA_FROM_DEVICE) { | 317 | if (cmd->sc_data_direction == DMA_FROM_DEVICE) { |
320 | sb[12] = 0x11; /* "unrecovered read error" */ | 318 | ata_scsi_set_sense(cmd, MEDIUM_ERROR, 0x11, 0x4); |
321 | sb[13] = 0x04; | 319 | /* "unrecovered read error" */ |
322 | } else { | 320 | } else { |
323 | sb[12] = 0x0C; /* "write error - */ | 321 | ata_scsi_set_sense(cmd, MEDIUM_ERROR, 0xc, 0x2); |
324 | sb[13] = 0x02; /* auto-reallocation failed" */ | 322 | /* "write error - auto-reallocation failed" */ |
325 | } | 323 | } |
326 | } | 324 | } |
327 | 325 | ||
@@ -420,7 +418,7 @@ int ata_scsi_error(struct Scsi_Host *host) | |||
420 | */ | 418 | */ |
421 | 419 | ||
422 | static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, | 420 | static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, |
423 | u8 *scsicmd) | 421 | const u8 *scsicmd) |
424 | { | 422 | { |
425 | struct ata_taskfile *tf = &qc->tf; | 423 | struct ata_taskfile *tf = &qc->tf; |
426 | 424 | ||
@@ -430,15 +428,26 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, | |||
430 | ; /* ignore IMMED bit, violates sat-r05 */ | 428 | ; /* ignore IMMED bit, violates sat-r05 */ |
431 | } | 429 | } |
432 | if (scsicmd[4] & 0x2) | 430 | if (scsicmd[4] & 0x2) |
433 | return 1; /* LOEJ bit set not supported */ | 431 | goto invalid_fld; /* LOEJ bit set not supported */ |
434 | if (((scsicmd[4] >> 4) & 0xf) != 0) | 432 | if (((scsicmd[4] >> 4) & 0xf) != 0) |
435 | return 1; /* power conditions not supported */ | 433 | goto invalid_fld; /* power conditions not supported */ |
436 | if (scsicmd[4] & 0x1) { | 434 | if (scsicmd[4] & 0x1) { |
437 | tf->nsect = 1; /* 1 sector, lba=0 */ | 435 | tf->nsect = 1; /* 1 sector, lba=0 */ |
438 | tf->lbah = 0x0; | 436 | |
439 | tf->lbam = 0x0; | 437 | if (qc->dev->flags & ATA_DFLAG_LBA) { |
440 | tf->lbal = 0x0; | 438 | qc->tf.flags |= ATA_TFLAG_LBA; |
441 | tf->device |= ATA_LBA; | 439 | |
440 | tf->lbah = 0x0; | ||
441 | tf->lbam = 0x0; | ||
442 | tf->lbal = 0x0; | ||
443 | tf->device |= ATA_LBA; | ||
444 | } else { | ||
445 | /* CHS */ | ||
446 | tf->lbal = 0x1; /* sect */ | ||
447 | tf->lbam = 0x0; /* cyl low */ | ||
448 | tf->lbah = 0x0; /* cyl high */ | ||
449 | } | ||
450 | |||
442 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ | 451 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ |
443 | } else { | 452 | } else { |
444 | tf->nsect = 0; /* time period value (0 implies now) */ | 453 | tf->nsect = 0; /* time period value (0 implies now) */ |
@@ -453,6 +462,11 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, | |||
453 | */ | 462 | */ |
454 | 463 | ||
455 | return 0; | 464 | return 0; |
465 | |||
466 | invalid_fld: | ||
467 | ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x24, 0x0); | ||
468 | /* "Invalid field in cbd" */ | ||
469 | return 1; | ||
456 | } | 470 | } |
457 | 471 | ||
458 | 472 | ||
@@ -471,14 +485,14 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, | |||
471 | * Zero on success, non-zero on error. | 485 | * Zero on success, non-zero on error. |
472 | */ | 486 | */ |
473 | 487 | ||
474 | static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | 488 | static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) |
475 | { | 489 | { |
476 | struct ata_taskfile *tf = &qc->tf; | 490 | struct ata_taskfile *tf = &qc->tf; |
477 | 491 | ||
478 | tf->flags |= ATA_TFLAG_DEVICE; | 492 | tf->flags |= ATA_TFLAG_DEVICE; |
479 | tf->protocol = ATA_PROT_NODATA; | 493 | tf->protocol = ATA_PROT_NODATA; |
480 | 494 | ||
481 | if ((tf->flags & ATA_TFLAG_LBA48) && | 495 | if ((qc->dev->flags & ATA_DFLAG_LBA48) && |
482 | (ata_id_has_flush_ext(qc->dev->id))) | 496 | (ata_id_has_flush_ext(qc->dev->id))) |
483 | tf->command = ATA_CMD_FLUSH_EXT; | 497 | tf->command = ATA_CMD_FLUSH_EXT; |
484 | else | 498 | else |
@@ -488,6 +502,99 @@ static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
488 | } | 502 | } |
489 | 503 | ||
490 | /** | 504 | /** |
505 | * scsi_6_lba_len - Get LBA and transfer length | ||
506 | * @scsicmd: SCSI command to translate | ||
507 | * | ||
508 | * Calculate LBA and transfer length for 6-byte commands. | ||
509 | * | ||
510 | * RETURNS: | ||
511 | * @plba: the LBA | ||
512 | * @plen: the transfer length | ||
513 | */ | ||
514 | |||
515 | static void scsi_6_lba_len(const u8 *scsicmd, u64 *plba, u32 *plen) | ||
516 | { | ||
517 | u64 lba = 0; | ||
518 | u32 len = 0; | ||
519 | |||
520 | VPRINTK("six-byte command\n"); | ||
521 | |||
522 | lba |= ((u64)scsicmd[2]) << 8; | ||
523 | lba |= ((u64)scsicmd[3]); | ||
524 | |||
525 | len |= ((u32)scsicmd[4]); | ||
526 | |||
527 | *plba = lba; | ||
528 | *plen = len; | ||
529 | } | ||
530 | |||
531 | /** | ||
532 | * scsi_10_lba_len - Get LBA and transfer length | ||
533 | * @scsicmd: SCSI command to translate | ||
534 | * | ||
535 | * Calculate LBA and transfer length for 10-byte commands. | ||
536 | * | ||
537 | * RETURNS: | ||
538 | * @plba: the LBA | ||
539 | * @plen: the transfer length | ||
540 | */ | ||
541 | |||
542 | static void scsi_10_lba_len(const u8 *scsicmd, u64 *plba, u32 *plen) | ||
543 | { | ||
544 | u64 lba = 0; | ||
545 | u32 len = 0; | ||
546 | |||
547 | VPRINTK("ten-byte command\n"); | ||
548 | |||
549 | lba |= ((u64)scsicmd[2]) << 24; | ||
550 | lba |= ((u64)scsicmd[3]) << 16; | ||
551 | lba |= ((u64)scsicmd[4]) << 8; | ||
552 | lba |= ((u64)scsicmd[5]); | ||
553 | |||
554 | len |= ((u32)scsicmd[7]) << 8; | ||
555 | len |= ((u32)scsicmd[8]); | ||
556 | |||
557 | *plba = lba; | ||
558 | *plen = len; | ||
559 | } | ||
560 | |||
561 | /** | ||
562 | * scsi_16_lba_len - Get LBA and transfer length | ||
563 | * @scsicmd: SCSI command to translate | ||
564 | * | ||
565 | * Calculate LBA and transfer length for 16-byte commands. | ||
566 | * | ||
567 | * RETURNS: | ||
568 | * @plba: the LBA | ||
569 | * @plen: the transfer length | ||
570 | */ | ||
571 | |||
572 | static void scsi_16_lba_len(const u8 *scsicmd, u64 *plba, u32 *plen) | ||
573 | { | ||
574 | u64 lba = 0; | ||
575 | u32 len = 0; | ||
576 | |||
577 | VPRINTK("sixteen-byte command\n"); | ||
578 | |||
579 | lba |= ((u64)scsicmd[2]) << 56; | ||
580 | lba |= ((u64)scsicmd[3]) << 48; | ||
581 | lba |= ((u64)scsicmd[4]) << 40; | ||
582 | lba |= ((u64)scsicmd[5]) << 32; | ||
583 | lba |= ((u64)scsicmd[6]) << 24; | ||
584 | lba |= ((u64)scsicmd[7]) << 16; | ||
585 | lba |= ((u64)scsicmd[8]) << 8; | ||
586 | lba |= ((u64)scsicmd[9]); | ||
587 | |||
588 | len |= ((u32)scsicmd[10]) << 24; | ||
589 | len |= ((u32)scsicmd[11]) << 16; | ||
590 | len |= ((u32)scsicmd[12]) << 8; | ||
591 | len |= ((u32)scsicmd[13]); | ||
592 | |||
593 | *plba = lba; | ||
594 | *plen = len; | ||
595 | } | ||
596 | |||
597 | /** | ||
491 | * ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one | 598 | * ata_scsi_verify_xlat - Translate SCSI VERIFY command into an ATA one |
492 | * @qc: Storage for translated ATA taskfile | 599 | * @qc: Storage for translated ATA taskfile |
493 | * @scsicmd: SCSI command to translate | 600 | * @scsicmd: SCSI command to translate |
@@ -501,82 +608,110 @@ static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
501 | * Zero on success, non-zero on error. | 608 | * Zero on success, non-zero on error. |
502 | */ | 609 | */ |
503 | 610 | ||
504 | static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | 611 | static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) |
505 | { | 612 | { |
506 | struct ata_taskfile *tf = &qc->tf; | 613 | struct ata_taskfile *tf = &qc->tf; |
507 | unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48; | 614 | struct ata_device *dev = qc->dev; |
508 | u64 dev_sectors = qc->dev->n_sectors; | 615 | u64 dev_sectors = qc->dev->n_sectors; |
509 | u64 sect = 0; | 616 | u64 block; |
510 | u32 n_sect = 0; | 617 | u32 n_block; |
511 | 618 | ||
512 | tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 619 | tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; |
513 | tf->protocol = ATA_PROT_NODATA; | 620 | tf->protocol = ATA_PROT_NODATA; |
514 | tf->device |= ATA_LBA; | ||
515 | 621 | ||
516 | if (scsicmd[0] == VERIFY) { | 622 | if (scsicmd[0] == VERIFY) |
517 | sect |= ((u64)scsicmd[2]) << 24; | 623 | scsi_10_lba_len(scsicmd, &block, &n_block); |
518 | sect |= ((u64)scsicmd[3]) << 16; | 624 | else if (scsicmd[0] == VERIFY_16) |
519 | sect |= ((u64)scsicmd[4]) << 8; | 625 | scsi_16_lba_len(scsicmd, &block, &n_block); |
520 | sect |= ((u64)scsicmd[5]); | 626 | else |
627 | goto invalid_fld; | ||
521 | 628 | ||
522 | n_sect |= ((u32)scsicmd[7]) << 8; | 629 | if (!n_block) |
523 | n_sect |= ((u32)scsicmd[8]); | 630 | goto nothing_to_do; |
524 | } | 631 | if (block >= dev_sectors) |
632 | goto out_of_range; | ||
633 | if ((block + n_block) > dev_sectors) | ||
634 | goto out_of_range; | ||
525 | 635 | ||
526 | else if (scsicmd[0] == VERIFY_16) { | 636 | if (dev->flags & ATA_DFLAG_LBA) { |
527 | sect |= ((u64)scsicmd[2]) << 56; | 637 | tf->flags |= ATA_TFLAG_LBA; |
528 | sect |= ((u64)scsicmd[3]) << 48; | ||
529 | sect |= ((u64)scsicmd[4]) << 40; | ||
530 | sect |= ((u64)scsicmd[5]) << 32; | ||
531 | sect |= ((u64)scsicmd[6]) << 24; | ||
532 | sect |= ((u64)scsicmd[7]) << 16; | ||
533 | sect |= ((u64)scsicmd[8]) << 8; | ||
534 | sect |= ((u64)scsicmd[9]); | ||
535 | |||
536 | n_sect |= ((u32)scsicmd[10]) << 24; | ||
537 | n_sect |= ((u32)scsicmd[11]) << 16; | ||
538 | n_sect |= ((u32)scsicmd[12]) << 8; | ||
539 | n_sect |= ((u32)scsicmd[13]); | ||
540 | } | ||
541 | 638 | ||
542 | else | 639 | if (dev->flags & ATA_DFLAG_LBA48) { |
543 | return 1; | 640 | if (n_block > (64 * 1024)) |
641 | goto invalid_fld; | ||
544 | 642 | ||
545 | if (!n_sect) | 643 | /* use LBA48 */ |
546 | return 1; | 644 | tf->flags |= ATA_TFLAG_LBA48; |
547 | if (sect >= dev_sectors) | 645 | tf->command = ATA_CMD_VERIFY_EXT; |
548 | return 1; | ||
549 | if ((sect + n_sect) > dev_sectors) | ||
550 | return 1; | ||
551 | if (lba48) { | ||
552 | if (n_sect > (64 * 1024)) | ||
553 | return 1; | ||
554 | } else { | ||
555 | if (n_sect > 256) | ||
556 | return 1; | ||
557 | } | ||
558 | 646 | ||
559 | if (lba48) { | 647 | tf->hob_nsect = (n_block >> 8) & 0xff; |
560 | tf->command = ATA_CMD_VERIFY_EXT; | ||
561 | 648 | ||
562 | tf->hob_nsect = (n_sect >> 8) & 0xff; | 649 | tf->hob_lbah = (block >> 40) & 0xff; |
650 | tf->hob_lbam = (block >> 32) & 0xff; | ||
651 | tf->hob_lbal = (block >> 24) & 0xff; | ||
652 | } else { | ||
653 | if (n_block > 256) | ||
654 | goto invalid_fld; | ||
563 | 655 | ||
564 | tf->hob_lbah = (sect >> 40) & 0xff; | 656 | /* use LBA28 */ |
565 | tf->hob_lbam = (sect >> 32) & 0xff; | 657 | tf->command = ATA_CMD_VERIFY; |
566 | tf->hob_lbal = (sect >> 24) & 0xff; | 658 | |
659 | tf->device |= (block >> 24) & 0xf; | ||
660 | } | ||
661 | |||
662 | tf->nsect = n_block & 0xff; | ||
663 | |||
664 | tf->lbah = (block >> 16) & 0xff; | ||
665 | tf->lbam = (block >> 8) & 0xff; | ||
666 | tf->lbal = block & 0xff; | ||
667 | |||
668 | tf->device |= ATA_LBA; | ||
567 | } else { | 669 | } else { |
670 | /* CHS */ | ||
671 | u32 sect, head, cyl, track; | ||
672 | |||
673 | if (n_block > 256) | ||
674 | goto invalid_fld; | ||
675 | |||
676 | /* Convert LBA to CHS */ | ||
677 | track = (u32)block / dev->sectors; | ||
678 | cyl = track / dev->heads; | ||
679 | head = track % dev->heads; | ||
680 | sect = (u32)block % dev->sectors + 1; | ||
681 | |||
682 | DPRINTK("block %u track %u cyl %u head %u sect %u\n", | ||
683 | (u32)block, track, cyl, head, sect); | ||
684 | |||
685 | /* Check whether the converted CHS can fit. | ||
686 | Cylinder: 0-65535 | ||
687 | Head: 0-15 | ||
688 | Sector: 1-255*/ | ||
689 | if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect)) | ||
690 | goto out_of_range; | ||
691 | |||
568 | tf->command = ATA_CMD_VERIFY; | 692 | tf->command = ATA_CMD_VERIFY; |
569 | 693 | tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */ | |
570 | tf->device |= (sect >> 24) & 0xf; | 694 | tf->lbal = sect; |
695 | tf->lbam = cyl; | ||
696 | tf->lbah = cyl >> 8; | ||
697 | tf->device |= head; | ||
571 | } | 698 | } |
572 | 699 | ||
573 | tf->nsect = n_sect & 0xff; | 700 | return 0; |
701 | |||
702 | invalid_fld: | ||
703 | ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x24, 0x0); | ||
704 | /* "Invalid field in cbd" */ | ||
705 | return 1; | ||
574 | 706 | ||
575 | tf->lbah = (sect >> 16) & 0xff; | 707 | out_of_range: |
576 | tf->lbam = (sect >> 8) & 0xff; | 708 | ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x21, 0x0); |
577 | tf->lbal = sect & 0xff; | 709 | /* "Logical Block Address out of range" */ |
710 | return 1; | ||
578 | 711 | ||
579 | return 0; | 712 | nothing_to_do: |
713 | qc->scsicmd->result = SAM_STAT_GOOD; | ||
714 | return 1; | ||
580 | } | 715 | } |
581 | 716 | ||
582 | /** | 717 | /** |
@@ -599,106 +734,137 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
599 | * Zero on success, non-zero on error. | 734 | * Zero on success, non-zero on error. |
600 | */ | 735 | */ |
601 | 736 | ||
602 | static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | 737 | static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) |
603 | { | 738 | { |
604 | struct ata_taskfile *tf = &qc->tf; | 739 | struct ata_taskfile *tf = &qc->tf; |
605 | unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48; | 740 | struct ata_device *dev = qc->dev; |
741 | u64 block; | ||
742 | u32 n_block; | ||
606 | 743 | ||
607 | tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 744 | tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; |
608 | tf->protocol = qc->dev->xfer_protocol; | ||
609 | tf->device |= ATA_LBA; | ||
610 | 745 | ||
611 | if (scsicmd[0] == READ_10 || scsicmd[0] == READ_6 || | 746 | if (scsicmd[0] == WRITE_10 || scsicmd[0] == WRITE_6 || |
612 | scsicmd[0] == READ_16) { | 747 | scsicmd[0] == WRITE_16) |
613 | tf->command = qc->dev->read_cmd; | ||
614 | } else { | ||
615 | tf->command = qc->dev->write_cmd; | ||
616 | tf->flags |= ATA_TFLAG_WRITE; | 748 | tf->flags |= ATA_TFLAG_WRITE; |
617 | } | ||
618 | 749 | ||
619 | if (scsicmd[0] == READ_10 || scsicmd[0] == WRITE_10) { | 750 | /* Calculate the SCSI LBA and transfer length. */ |
620 | if (lba48) { | 751 | switch (scsicmd[0]) { |
621 | tf->hob_nsect = scsicmd[7]; | 752 | case READ_10: |
622 | tf->hob_lbal = scsicmd[2]; | 753 | case WRITE_10: |
754 | scsi_10_lba_len(scsicmd, &block, &n_block); | ||
755 | break; | ||
756 | case READ_6: | ||
757 | case WRITE_6: | ||
758 | scsi_6_lba_len(scsicmd, &block, &n_block); | ||
623 | 759 | ||
624 | qc->nsect = ((unsigned int)scsicmd[7] << 8) | | 760 | /* for 6-byte r/w commands, transfer length 0 |
625 | scsicmd[8]; | 761 | * means 256 blocks of data, not 0 block. |
626 | } else { | 762 | */ |
627 | /* if we don't support LBA48 addressing, the request | 763 | if (!n_block) |
628 | * -may- be too large. */ | 764 | n_block = 256; |
629 | if ((scsicmd[2] & 0xf0) || scsicmd[7]) | 765 | break; |
630 | return 1; | 766 | case READ_16: |
767 | case WRITE_16: | ||
768 | scsi_16_lba_len(scsicmd, &block, &n_block); | ||
769 | break; | ||
770 | default: | ||
771 | DPRINTK("no-byte command\n"); | ||
772 | goto invalid_fld; | ||
773 | } | ||
631 | 774 | ||
632 | /* stores LBA27:24 in lower 4 bits of device reg */ | 775 | /* Check and compose ATA command */ |
633 | tf->device |= scsicmd[2]; | 776 | if (!n_block) |
777 | /* For 10-byte and 16-byte SCSI R/W commands, transfer | ||
778 | * length 0 means transfer 0 block of data. | ||
779 | * However, for ATA R/W commands, sector count 0 means | ||
780 | * 256 or 65536 sectors, not 0 sectors as in SCSI. | ||
781 | */ | ||
782 | goto nothing_to_do; | ||
634 | 783 | ||
635 | qc->nsect = scsicmd[8]; | 784 | if (dev->flags & ATA_DFLAG_LBA) { |
636 | } | 785 | tf->flags |= ATA_TFLAG_LBA; |
637 | 786 | ||
638 | tf->nsect = scsicmd[8]; | 787 | if (dev->flags & ATA_DFLAG_LBA48) { |
639 | tf->lbal = scsicmd[5]; | 788 | /* The request -may- be too large for LBA48. */ |
640 | tf->lbam = scsicmd[4]; | 789 | if ((block >> 48) || (n_block > 65536)) |
641 | tf->lbah = scsicmd[3]; | 790 | goto out_of_range; |
642 | 791 | ||
643 | VPRINTK("ten-byte command\n"); | 792 | /* use LBA48 */ |
644 | if (qc->nsect == 0) /* we don't support length==0 cmds */ | 793 | tf->flags |= ATA_TFLAG_LBA48; |
645 | return 1; | ||
646 | return 0; | ||
647 | } | ||
648 | 794 | ||
649 | if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) { | 795 | tf->hob_nsect = (n_block >> 8) & 0xff; |
650 | qc->nsect = tf->nsect = scsicmd[4]; | ||
651 | if (!qc->nsect) { | ||
652 | qc->nsect = 256; | ||
653 | if (lba48) | ||
654 | tf->hob_nsect = 1; | ||
655 | } | ||
656 | 796 | ||
657 | tf->lbal = scsicmd[3]; | 797 | tf->hob_lbah = (block >> 40) & 0xff; |
658 | tf->lbam = scsicmd[2]; | 798 | tf->hob_lbam = (block >> 32) & 0xff; |
659 | tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */ | 799 | tf->hob_lbal = (block >> 24) & 0xff; |
800 | } else { | ||
801 | /* use LBA28 */ | ||
660 | 802 | ||
661 | VPRINTK("six-byte command\n"); | 803 | /* The request -may- be too large for LBA28. */ |
662 | return 0; | 804 | if ((block >> 28) || (n_block > 256)) |
663 | } | 805 | goto out_of_range; |
664 | 806 | ||
665 | if (scsicmd[0] == READ_16 || scsicmd[0] == WRITE_16) { | 807 | tf->device |= (block >> 24) & 0xf; |
666 | /* rule out impossible LBAs and sector counts */ | 808 | } |
667 | if (scsicmd[2] || scsicmd[3] || scsicmd[10] || scsicmd[11]) | ||
668 | return 1; | ||
669 | 809 | ||
670 | if (lba48) { | 810 | ata_rwcmd_protocol(qc); |
671 | tf->hob_nsect = scsicmd[12]; | ||
672 | tf->hob_lbal = scsicmd[6]; | ||
673 | tf->hob_lbam = scsicmd[5]; | ||
674 | tf->hob_lbah = scsicmd[4]; | ||
675 | 811 | ||
676 | qc->nsect = ((unsigned int)scsicmd[12] << 8) | | 812 | qc->nsect = n_block; |
677 | scsicmd[13]; | 813 | tf->nsect = n_block & 0xff; |
678 | } else { | ||
679 | /* once again, filter out impossible non-zero values */ | ||
680 | if (scsicmd[4] || scsicmd[5] || scsicmd[12] || | ||
681 | (scsicmd[6] & 0xf0)) | ||
682 | return 1; | ||
683 | 814 | ||
684 | /* stores LBA27:24 in lower 4 bits of device reg */ | 815 | tf->lbah = (block >> 16) & 0xff; |
685 | tf->device |= scsicmd[6]; | 816 | tf->lbam = (block >> 8) & 0xff; |
817 | tf->lbal = block & 0xff; | ||
686 | 818 | ||
687 | qc->nsect = scsicmd[13]; | 819 | tf->device |= ATA_LBA; |
688 | } | 820 | } else { |
821 | /* CHS */ | ||
822 | u32 sect, head, cyl, track; | ||
823 | |||
824 | /* The request -may- be too large for CHS addressing. */ | ||
825 | if ((block >> 28) || (n_block > 256)) | ||
826 | goto out_of_range; | ||
827 | |||
828 | ata_rwcmd_protocol(qc); | ||
829 | |||
830 | /* Convert LBA to CHS */ | ||
831 | track = (u32)block / dev->sectors; | ||
832 | cyl = track / dev->heads; | ||
833 | head = track % dev->heads; | ||
834 | sect = (u32)block % dev->sectors + 1; | ||
835 | |||
836 | DPRINTK("block %u track %u cyl %u head %u sect %u\n", | ||
837 | (u32)block, track, cyl, head, sect); | ||
838 | |||
839 | /* Check whether the converted CHS can fit. | ||
840 | Cylinder: 0-65535 | ||
841 | Head: 0-15 | ||
842 | Sector: 1-255*/ | ||
843 | if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect)) | ||
844 | goto out_of_range; | ||
845 | |||
846 | qc->nsect = n_block; | ||
847 | tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */ | ||
848 | tf->lbal = sect; | ||
849 | tf->lbam = cyl; | ||
850 | tf->lbah = cyl >> 8; | ||
851 | tf->device |= head; | ||
852 | } | ||
689 | 853 | ||
690 | tf->nsect = scsicmd[13]; | 854 | return 0; |
691 | tf->lbal = scsicmd[9]; | ||
692 | tf->lbam = scsicmd[8]; | ||
693 | tf->lbah = scsicmd[7]; | ||
694 | 855 | ||
695 | VPRINTK("sixteen-byte command\n"); | 856 | invalid_fld: |
696 | if (qc->nsect == 0) /* we don't support length==0 cmds */ | 857 | ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x24, 0x0); |
697 | return 1; | 858 | /* "Invalid field in cbd" */ |
698 | return 0; | 859 | return 1; |
699 | } | 860 | |
861 | out_of_range: | ||
862 | ata_scsi_set_sense(qc->scsicmd, ILLEGAL_REQUEST, 0x21, 0x0); | ||
863 | /* "Logical Block Address out of range" */ | ||
864 | return 1; | ||
700 | 865 | ||
701 | DPRINTK("no-byte command\n"); | 866 | nothing_to_do: |
867 | qc->scsicmd->result = SAM_STAT_GOOD; | ||
702 | return 1; | 868 | return 1; |
703 | } | 869 | } |
704 | 870 | ||
@@ -731,6 +897,12 @@ static int ata_scsi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | |||
731 | * This function sets up an ata_queued_cmd structure for the | 897 | * This function sets up an ata_queued_cmd structure for the |
732 | * SCSI command, and sends that ata_queued_cmd to the hardware. | 898 | * SCSI command, and sends that ata_queued_cmd to the hardware. |
733 | * | 899 | * |
900 | * The xlat_func argument (actor) returns 0 if ready to execute | ||
901 | * ATA command, else 1 to finish translation. If 1 is returned | ||
902 | * then cmd->result (and possibly cmd->sense_buffer) are assumed | ||
903 | * to be set reflecting an error condition or clean (early) | ||
904 | * termination. | ||
905 | * | ||
734 | * LOCKING: | 906 | * LOCKING: |
735 | * spin_lock_irqsave(host_set lock) | 907 | * spin_lock_irqsave(host_set lock) |
736 | */ | 908 | */ |
@@ -747,7 +919,7 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev, | |||
747 | 919 | ||
748 | qc = ata_scsi_qc_new(ap, dev, cmd, done); | 920 | qc = ata_scsi_qc_new(ap, dev, cmd, done); |
749 | if (!qc) | 921 | if (!qc) |
750 | return; | 922 | goto err_mem; |
751 | 923 | ||
752 | /* data is present; dma-map it */ | 924 | /* data is present; dma-map it */ |
753 | if (cmd->sc_data_direction == DMA_FROM_DEVICE || | 925 | if (cmd->sc_data_direction == DMA_FROM_DEVICE || |
@@ -755,7 +927,7 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev, | |||
755 | if (unlikely(cmd->request_bufflen < 1)) { | 927 | if (unlikely(cmd->request_bufflen < 1)) { |
756 | printk(KERN_WARNING "ata%u(%u): WARNING: zero len r/w req\n", | 928 | printk(KERN_WARNING "ata%u(%u): WARNING: zero len r/w req\n", |
757 | ap->id, dev->devno); | 929 | ap->id, dev->devno); |
758 | goto err_out; | 930 | goto err_did; |
759 | } | 931 | } |
760 | 932 | ||
761 | if (cmd->use_sg) | 933 | if (cmd->use_sg) |
@@ -770,19 +942,28 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev, | |||
770 | qc->complete_fn = ata_scsi_qc_complete; | 942 | qc->complete_fn = ata_scsi_qc_complete; |
771 | 943 | ||
772 | if (xlat_func(qc, scsicmd)) | 944 | if (xlat_func(qc, scsicmd)) |
773 | goto err_out; | 945 | goto early_finish; |
774 | 946 | ||
775 | /* select device, send command to hardware */ | 947 | /* select device, send command to hardware */ |
776 | if (ata_qc_issue(qc)) | 948 | if (ata_qc_issue(qc)) |
777 | goto err_out; | 949 | goto err_did; |
778 | 950 | ||
779 | VPRINTK("EXIT\n"); | 951 | VPRINTK("EXIT\n"); |
780 | return; | 952 | return; |
781 | 953 | ||
782 | err_out: | 954 | early_finish: |
955 | ata_qc_free(qc); | ||
956 | done(cmd); | ||
957 | DPRINTK("EXIT - early finish (good or error)\n"); | ||
958 | return; | ||
959 | |||
960 | err_did: | ||
783 | ata_qc_free(qc); | 961 | ata_qc_free(qc); |
784 | ata_bad_cdb(cmd, done); | 962 | err_mem: |
785 | DPRINTK("EXIT - badcmd\n"); | 963 | cmd->result = (DID_ERROR << 16); |
964 | done(cmd); | ||
965 | DPRINTK("EXIT - internal\n"); | ||
966 | return; | ||
786 | } | 967 | } |
787 | 968 | ||
788 | /** | 969 | /** |
@@ -849,7 +1030,8 @@ static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf) | |||
849 | * Mapping the response buffer, calling the command's handler, | 1030 | * Mapping the response buffer, calling the command's handler, |
850 | * and handling the handler's return value. This return value | 1031 | * and handling the handler's return value. This return value |
851 | * indicates whether the handler wishes the SCSI command to be | 1032 | * indicates whether the handler wishes the SCSI command to be |
852 | * completed successfully, or not. | 1033 | * completed successfully (0), or not (in which case cmd->result |
1034 | * and sense buffer are assumed to be set). | ||
853 | * | 1035 | * |
854 | * LOCKING: | 1036 | * LOCKING: |
855 | * spin_lock_irqsave(host_set lock) | 1037 | * spin_lock_irqsave(host_set lock) |
@@ -868,12 +1050,9 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args, | |||
868 | rc = actor(args, rbuf, buflen); | 1050 | rc = actor(args, rbuf, buflen); |
869 | ata_scsi_rbuf_put(cmd, rbuf); | 1051 | ata_scsi_rbuf_put(cmd, rbuf); |
870 | 1052 | ||
871 | if (rc) | 1053 | if (rc == 0) |
872 | ata_bad_cdb(cmd, args->done); | ||
873 | else { | ||
874 | cmd->result = SAM_STAT_GOOD; | 1054 | cmd->result = SAM_STAT_GOOD; |
875 | args->done(cmd); | 1055 | args->done(cmd); |
876 | } | ||
877 | } | 1056 | } |
878 | 1057 | ||
879 | /** | 1058 | /** |
@@ -1179,8 +1358,16 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, | |||
1179 | * in the same manner) | 1358 | * in the same manner) |
1180 | */ | 1359 | */ |
1181 | page_control = scsicmd[2] >> 6; | 1360 | page_control = scsicmd[2] >> 6; |
1182 | if ((page_control != 0) && (page_control != 3)) | 1361 | switch (page_control) { |
1183 | return 1; | 1362 | case 0: /* current */ |
1363 | break; /* supported */ | ||
1364 | case 3: /* saved */ | ||
1365 | goto saving_not_supp; | ||
1366 | case 1: /* changeable */ | ||
1367 | case 2: /* defaults */ | ||
1368 | default: | ||
1369 | goto invalid_fld; | ||
1370 | } | ||
1184 | 1371 | ||
1185 | if (six_byte) | 1372 | if (six_byte) |
1186 | output_len = 4; | 1373 | output_len = 4; |
@@ -1211,7 +1398,7 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, | |||
1211 | break; | 1398 | break; |
1212 | 1399 | ||
1213 | default: /* invalid page code */ | 1400 | default: /* invalid page code */ |
1214 | return 1; | 1401 | goto invalid_fld; |
1215 | } | 1402 | } |
1216 | 1403 | ||
1217 | if (six_byte) { | 1404 | if (six_byte) { |
@@ -1224,6 +1411,16 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, | |||
1224 | } | 1411 | } |
1225 | 1412 | ||
1226 | return 0; | 1413 | return 0; |
1414 | |||
1415 | invalid_fld: | ||
1416 | ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x24, 0x0); | ||
1417 | /* "Invalid field in cbd" */ | ||
1418 | return 1; | ||
1419 | |||
1420 | saving_not_supp: | ||
1421 | ata_scsi_set_sense(args->cmd, ILLEGAL_REQUEST, 0x39, 0x0); | ||
1422 | /* "Saving parameters not supported" */ | ||
1423 | return 1; | ||
1227 | } | 1424 | } |
1228 | 1425 | ||
1229 | /** | 1426 | /** |
@@ -1246,10 +1443,20 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf, | |||
1246 | 1443 | ||
1247 | VPRINTK("ENTER\n"); | 1444 | VPRINTK("ENTER\n"); |
1248 | 1445 | ||
1249 | if (ata_id_has_lba48(args->id)) | 1446 | if (ata_id_has_lba(args->id)) { |
1250 | n_sectors = ata_id_u64(args->id, 100); | 1447 | if (ata_id_has_lba48(args->id)) |
1251 | else | 1448 | n_sectors = ata_id_u64(args->id, 100); |
1252 | n_sectors = ata_id_u32(args->id, 60); | 1449 | else |
1450 | n_sectors = ata_id_u32(args->id, 60); | ||
1451 | } else { | ||
1452 | /* CHS default translation */ | ||
1453 | n_sectors = args->id[1] * args->id[3] * args->id[6]; | ||
1454 | |||
1455 | if (ata_id_current_chs_valid(args->id)) | ||
1456 | /* CHS current translation */ | ||
1457 | n_sectors = ata_id_u32(args->id, 57); | ||
1458 | } | ||
1459 | |||
1253 | n_sectors--; /* ATA TotalUserSectors - 1 */ | 1460 | n_sectors--; /* ATA TotalUserSectors - 1 */ |
1254 | 1461 | ||
1255 | if (args->cmd->cmnd[0] == READ_CAPACITY) { | 1462 | if (args->cmd->cmnd[0] == READ_CAPACITY) { |
@@ -1313,6 +1520,34 @@ unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf, | |||
1313 | } | 1520 | } |
1314 | 1521 | ||
1315 | /** | 1522 | /** |
1523 | * ata_scsi_set_sense - Set SCSI sense data and status | ||
1524 | * @cmd: SCSI request to be handled | ||
1525 | * @sk: SCSI-defined sense key | ||
1526 | * @asc: SCSI-defined additional sense code | ||
1527 | * @ascq: SCSI-defined additional sense code qualifier | ||
1528 | * | ||
1529 | * Helper function that builds a valid fixed format, current | ||
1530 | * response code and the given sense key (sk), additional sense | ||
1531 | * code (asc) and additional sense code qualifier (ascq) with | ||
1532 | * a SCSI command status of %SAM_STAT_CHECK_CONDITION and | ||
1533 | * DRIVER_SENSE set in the upper bits of scsi_cmnd::result . | ||
1534 | * | ||
1535 | * LOCKING: | ||
1536 | * Not required | ||
1537 | */ | ||
1538 | |||
1539 | void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq) | ||
1540 | { | ||
1541 | cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; | ||
1542 | |||
1543 | cmd->sense_buffer[0] = 0x70; /* fixed format, current */ | ||
1544 | cmd->sense_buffer[2] = sk; | ||
1545 | cmd->sense_buffer[7] = 18 - 8; /* additional sense length */ | ||
1546 | cmd->sense_buffer[12] = asc; | ||
1547 | cmd->sense_buffer[13] = ascq; | ||
1548 | } | ||
1549 | |||
1550 | /** | ||
1316 | * ata_scsi_badcmd - End a SCSI request with an error | 1551 | * ata_scsi_badcmd - End a SCSI request with an error |
1317 | * @cmd: SCSI request to be handled | 1552 | * @cmd: SCSI request to be handled |
1318 | * @done: SCSI command completion function | 1553 | * @done: SCSI command completion function |
@@ -1330,30 +1565,84 @@ unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf, | |||
1330 | void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq) | 1565 | void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq) |
1331 | { | 1566 | { |
1332 | DPRINTK("ENTER\n"); | 1567 | DPRINTK("ENTER\n"); |
1333 | cmd->result = SAM_STAT_CHECK_CONDITION; | 1568 | ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, asc, ascq); |
1334 | |||
1335 | cmd->sense_buffer[0] = 0x70; | ||
1336 | cmd->sense_buffer[2] = ILLEGAL_REQUEST; | ||
1337 | cmd->sense_buffer[7] = 14 - 8; /* addnl. sense len. FIXME: correct? */ | ||
1338 | cmd->sense_buffer[12] = asc; | ||
1339 | cmd->sense_buffer[13] = ascq; | ||
1340 | 1569 | ||
1341 | done(cmd); | 1570 | done(cmd); |
1342 | } | 1571 | } |
1343 | 1572 | ||
1573 | void atapi_request_sense(struct ata_port *ap, struct ata_device *dev, | ||
1574 | struct scsi_cmnd *cmd) | ||
1575 | { | ||
1576 | DECLARE_COMPLETION(wait); | ||
1577 | struct ata_queued_cmd *qc; | ||
1578 | unsigned long flags; | ||
1579 | int rc; | ||
1580 | |||
1581 | DPRINTK("ATAPI request sense\n"); | ||
1582 | |||
1583 | qc = ata_qc_new_init(ap, dev); | ||
1584 | BUG_ON(qc == NULL); | ||
1585 | |||
1586 | /* FIXME: is this needed? */ | ||
1587 | memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer)); | ||
1588 | |||
1589 | ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer)); | ||
1590 | qc->dma_dir = DMA_FROM_DEVICE; | ||
1591 | |||
1592 | memset(&qc->cdb, 0, ap->cdb_len); | ||
1593 | qc->cdb[0] = REQUEST_SENSE; | ||
1594 | qc->cdb[4] = SCSI_SENSE_BUFFERSIZE; | ||
1595 | |||
1596 | qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | ||
1597 | qc->tf.command = ATA_CMD_PACKET; | ||
1598 | |||
1599 | qc->tf.protocol = ATA_PROT_ATAPI; | ||
1600 | qc->tf.lbam = (8 * 1024) & 0xff; | ||
1601 | qc->tf.lbah = (8 * 1024) >> 8; | ||
1602 | qc->nbytes = SCSI_SENSE_BUFFERSIZE; | ||
1603 | |||
1604 | qc->waiting = &wait; | ||
1605 | qc->complete_fn = ata_qc_complete_noop; | ||
1606 | |||
1607 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
1608 | rc = ata_qc_issue(qc); | ||
1609 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
1610 | |||
1611 | if (rc) | ||
1612 | ata_port_disable(ap); | ||
1613 | else | ||
1614 | wait_for_completion(&wait); | ||
1615 | |||
1616 | DPRINTK("EXIT\n"); | ||
1617 | } | ||
1618 | |||
1344 | static int atapi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | 1619 | static int atapi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) |
1345 | { | 1620 | { |
1346 | struct scsi_cmnd *cmd = qc->scsicmd; | 1621 | struct scsi_cmnd *cmd = qc->scsicmd; |
1347 | 1622 | ||
1348 | if (unlikely(drv_stat & (ATA_ERR | ATA_BUSY | ATA_DRQ))) { | 1623 | VPRINTK("ENTER, drv_stat == 0x%x\n", drv_stat); |
1624 | |||
1625 | if (unlikely(drv_stat & (ATA_BUSY | ATA_DRQ))) | ||
1626 | ata_to_sense_error(qc, drv_stat); | ||
1627 | |||
1628 | else if (unlikely(drv_stat & ATA_ERR)) { | ||
1349 | DPRINTK("request check condition\n"); | 1629 | DPRINTK("request check condition\n"); |
1350 | 1630 | ||
1631 | /* FIXME: command completion with check condition | ||
1632 | * but no sense causes the error handler to run, | ||
1633 | * which then issues REQUEST SENSE, fills in the sense | ||
1634 | * buffer, and completes the command (for the second | ||
1635 | * time). We need to issue REQUEST SENSE some other | ||
1636 | * way, to avoid completing the command twice. | ||
1637 | */ | ||
1351 | cmd->result = SAM_STAT_CHECK_CONDITION; | 1638 | cmd->result = SAM_STAT_CHECK_CONDITION; |
1352 | 1639 | ||
1353 | qc->scsidone(cmd); | 1640 | qc->scsidone(cmd); |
1354 | 1641 | ||
1355 | return 1; | 1642 | return 1; |
1356 | } else { | 1643 | } |
1644 | |||
1645 | else { | ||
1357 | u8 *scsicmd = cmd->cmnd; | 1646 | u8 *scsicmd = cmd->cmnd; |
1358 | 1647 | ||
1359 | if (scsicmd[0] == INQUIRY) { | 1648 | if (scsicmd[0] == INQUIRY) { |
@@ -1361,15 +1650,30 @@ static int atapi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | |||
1361 | unsigned int buflen; | 1650 | unsigned int buflen; |
1362 | 1651 | ||
1363 | buflen = ata_scsi_rbuf_get(cmd, &buf); | 1652 | buflen = ata_scsi_rbuf_get(cmd, &buf); |
1364 | buf[2] = 0x5; | 1653 | |
1365 | buf[3] = (buf[3] & 0xf0) | 2; | 1654 | /* ATAPI devices typically report zero for their SCSI version, |
1655 | * and sometimes deviate from the spec WRT response data | ||
1656 | * format. If SCSI version is reported as zero like normal, | ||
1657 | * then we make the following fixups: 1) Fake MMC-5 version, | ||
1658 | * to indicate to the Linux scsi midlayer this is a modern | ||
1659 | * device. 2) Ensure response data format / ATAPI information | ||
1660 | * are always correct. | ||
1661 | */ | ||
1662 | /* FIXME: do we ever override EVPD pages and the like, with | ||
1663 | * this code? | ||
1664 | */ | ||
1665 | if (buf[2] == 0) { | ||
1666 | buf[2] = 0x5; | ||
1667 | buf[3] = 0x32; | ||
1668 | } | ||
1669 | |||
1366 | ata_scsi_rbuf_put(cmd, buf); | 1670 | ata_scsi_rbuf_put(cmd, buf); |
1367 | } | 1671 | } |
1672 | |||
1368 | cmd->result = SAM_STAT_GOOD; | 1673 | cmd->result = SAM_STAT_GOOD; |
1369 | } | 1674 | } |
1370 | 1675 | ||
1371 | qc->scsidone(cmd); | 1676 | qc->scsidone(cmd); |
1372 | |||
1373 | return 0; | 1677 | return 0; |
1374 | } | 1678 | } |
1375 | /** | 1679 | /** |
@@ -1384,7 +1688,7 @@ static int atapi_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | |||
1384 | * Zero on success, non-zero on failure. | 1688 | * Zero on success, non-zero on failure. |
1385 | */ | 1689 | */ |
1386 | 1690 | ||
1387 | static unsigned int atapi_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | 1691 | static unsigned int atapi_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) |
1388 | { | 1692 | { |
1389 | struct scsi_cmnd *cmd = qc->scsicmd; | 1693 | struct scsi_cmnd *cmd = qc->scsicmd; |
1390 | struct ata_device *dev = qc->dev; | 1694 | struct ata_device *dev = qc->dev; |
@@ -1453,7 +1757,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
1453 | */ | 1757 | */ |
1454 | 1758 | ||
1455 | static struct ata_device * | 1759 | static struct ata_device * |
1456 | ata_scsi_find_dev(struct ata_port *ap, struct scsi_device *scsidev) | 1760 | ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev) |
1457 | { | 1761 | { |
1458 | struct ata_device *dev; | 1762 | struct ata_device *dev; |
1459 | 1763 | ||
@@ -1610,7 +1914,7 @@ void ata_scsi_simulate(u16 *id, | |||
1610 | void (*done)(struct scsi_cmnd *)) | 1914 | void (*done)(struct scsi_cmnd *)) |
1611 | { | 1915 | { |
1612 | struct ata_scsi_args args; | 1916 | struct ata_scsi_args args; |
1613 | u8 *scsicmd = cmd->cmnd; | 1917 | const u8 *scsicmd = cmd->cmnd; |
1614 | 1918 | ||
1615 | args.id = id; | 1919 | args.id = id; |
1616 | args.cmd = cmd; | 1920 | args.cmd = cmd; |
@@ -1630,7 +1934,7 @@ void ata_scsi_simulate(u16 *id, | |||
1630 | 1934 | ||
1631 | case INQUIRY: | 1935 | case INQUIRY: |
1632 | if (scsicmd[1] & 2) /* is CmdDt set? */ | 1936 | if (scsicmd[1] & 2) /* is CmdDt set? */ |
1633 | ata_bad_cdb(cmd, done); | 1937 | ata_scsi_invalid_field(cmd, done); |
1634 | else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */ | 1938 | else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */ |
1635 | ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std); | 1939 | ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std); |
1636 | else if (scsicmd[2] == 0x00) | 1940 | else if (scsicmd[2] == 0x00) |
@@ -1640,7 +1944,7 @@ void ata_scsi_simulate(u16 *id, | |||
1640 | else if (scsicmd[2] == 0x83) | 1944 | else if (scsicmd[2] == 0x83) |
1641 | ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83); | 1945 | ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83); |
1642 | else | 1946 | else |
1643 | ata_bad_cdb(cmd, done); | 1947 | ata_scsi_invalid_field(cmd, done); |
1644 | break; | 1948 | break; |
1645 | 1949 | ||
1646 | case MODE_SENSE: | 1950 | case MODE_SENSE: |
@@ -1650,7 +1954,7 @@ void ata_scsi_simulate(u16 *id, | |||
1650 | 1954 | ||
1651 | case MODE_SELECT: /* unconditionally return */ | 1955 | case MODE_SELECT: /* unconditionally return */ |
1652 | case MODE_SELECT_10: /* bad-field-in-cdb */ | 1956 | case MODE_SELECT_10: /* bad-field-in-cdb */ |
1653 | ata_bad_cdb(cmd, done); | 1957 | ata_scsi_invalid_field(cmd, done); |
1654 | break; | 1958 | break; |
1655 | 1959 | ||
1656 | case READ_CAPACITY: | 1960 | case READ_CAPACITY: |
@@ -1661,7 +1965,7 @@ void ata_scsi_simulate(u16 *id, | |||
1661 | if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16) | 1965 | if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16) |
1662 | ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap); | 1966 | ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap); |
1663 | else | 1967 | else |
1664 | ata_bad_cdb(cmd, done); | 1968 | ata_scsi_invalid_field(cmd, done); |
1665 | break; | 1969 | break; |
1666 | 1970 | ||
1667 | case REPORT_LUNS: | 1971 | case REPORT_LUNS: |
@@ -1673,8 +1977,26 @@ void ata_scsi_simulate(u16 *id, | |||
1673 | 1977 | ||
1674 | /* all other commands */ | 1978 | /* all other commands */ |
1675 | default: | 1979 | default: |
1676 | ata_bad_scsiop(cmd, done); | 1980 | ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0); |
1981 | /* "Invalid command operation code" */ | ||
1982 | done(cmd); | ||
1677 | break; | 1983 | break; |
1678 | } | 1984 | } |
1679 | } | 1985 | } |
1680 | 1986 | ||
1987 | void ata_scsi_scan_host(struct ata_port *ap) | ||
1988 | { | ||
1989 | struct ata_device *dev; | ||
1990 | unsigned int i; | ||
1991 | |||
1992 | if (ap->flags & ATA_FLAG_PORT_DISABLED) | ||
1993 | return; | ||
1994 | |||
1995 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | ||
1996 | dev = &ap->device[i]; | ||
1997 | |||
1998 | if (ata_dev_present(dev)) | ||
1999 | scsi_scan_target(&ap->host->shost_gendev, 0, i, 0, 0); | ||
2000 | } | ||
2001 | } | ||
2002 | |||