diff options
-rw-r--r-- | drivers/scsi/libata-scsi.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index f58311b8c050..4074e7877ba3 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -630,11 +630,19 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
630 | tf->lbah = scsicmd[3]; | 630 | tf->lbah = scsicmd[3]; |
631 | 631 | ||
632 | VPRINTK("ten-byte command\n"); | 632 | VPRINTK("ten-byte command\n"); |
633 | if (qc->nsect == 0) /* we don't support length==0 cmds */ | ||
634 | return 1; | ||
633 | return 0; | 635 | return 0; |
634 | } | 636 | } |
635 | 637 | ||
636 | if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) { | 638 | if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) { |
637 | qc->nsect = tf->nsect = scsicmd[4]; | 639 | qc->nsect = tf->nsect = scsicmd[4]; |
640 | if (!qc->nsect) { | ||
641 | qc->nsect = 256; | ||
642 | if (lba48) | ||
643 | tf->hob_nsect = 1; | ||
644 | } | ||
645 | |||
638 | tf->lbal = scsicmd[3]; | 646 | tf->lbal = scsicmd[3]; |
639 | tf->lbam = scsicmd[2]; | 647 | tf->lbam = scsicmd[2]; |
640 | tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */ | 648 | tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */ |
@@ -674,6 +682,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
674 | tf->lbah = scsicmd[7]; | 682 | tf->lbah = scsicmd[7]; |
675 | 683 | ||
676 | VPRINTK("sixteen-byte command\n"); | 684 | VPRINTK("sixteen-byte command\n"); |
685 | if (qc->nsect == 0) /* we don't support length==0 cmds */ | ||
686 | return 1; | ||
677 | return 0; | 687 | return 0; |
678 | } | 688 | } |
679 | 689 | ||