aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-scsi.c104
1 files changed, 51 insertions, 53 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 5d7a1bd37e9a..b4ee28dec521 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -2760,28 +2760,6 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
2760 goto invalid_fld; 2760 goto invalid_fld;
2761 2761
2762 /* 2762 /*
2763 * Filter TPM commands by default. These provide an
2764 * essentially uncontrolled encrypted "back door" between
2765 * applications and the disk. Set libata.allow_tpm=1 if you
2766 * have a real reason for wanting to use them. This ensures
2767 * that installed software cannot easily mess stuff up without
2768 * user intent. DVR type users will probably ship with this enabled
2769 * for movie content management.
2770 *
2771 * Note that for ATA8 we can issue a DCS change and DCS freeze lock
2772 * for this and should do in future but that it is not sufficient as
2773 * DCS is an optional feature set. Thus we also do the software filter
2774 * so that we comply with the TC consortium stated goal that the user
2775 * can turn off TC features of their system.
2776 */
2777 if (tf->command >= 0x5C && tf->command <= 0x5F && !libata_allow_tpm)
2778 goto invalid_fld;
2779
2780 /* We may not issue DMA commands if no DMA mode is set */
2781 if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
2782 goto invalid_fld;
2783
2784 /*
2785 * 12 and 16 byte CDBs use different offsets to 2763 * 12 and 16 byte CDBs use different offsets to
2786 * provide the various register values. 2764 * provide the various register values.
2787 */ 2765 */
@@ -2830,6 +2808,41 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
2830 tf->device = dev->devno ? 2808 tf->device = dev->devno ?
2831 tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1; 2809 tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
2832 2810
2811 /* READ/WRITE LONG use a non-standard sect_size */
2812 qc->sect_size = ATA_SECT_SIZE;
2813 switch (tf->command) {
2814 case ATA_CMD_READ_LONG:
2815 case ATA_CMD_READ_LONG_ONCE:
2816 case ATA_CMD_WRITE_LONG:
2817 case ATA_CMD_WRITE_LONG_ONCE:
2818 if (tf->protocol != ATA_PROT_PIO || tf->nsect != 1)
2819 goto invalid_fld;
2820 qc->sect_size = scsi_bufflen(scmd);
2821 }
2822
2823 /*
2824 * Set flags so that all registers will be written, pass on
2825 * write indication (used for PIO/DMA setup), result TF is
2826 * copied back and we don't whine too much about its failure.
2827 */
2828 tf->flags = ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
2829 if (scmd->sc_data_direction == DMA_TO_DEVICE)
2830 tf->flags |= ATA_TFLAG_WRITE;
2831
2832 qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
2833
2834 /*
2835 * Set transfer length.
2836 *
2837 * TODO: find out if we need to do more here to
2838 * cover scatter/gather case.
2839 */
2840 ata_qc_set_pc_nbytes(qc);
2841
2842 /* We may not issue DMA commands if no DMA mode is set */
2843 if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
2844 goto invalid_fld;
2845
2833 /* sanity check for pio multi commands */ 2846 /* sanity check for pio multi commands */
2834 if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf)) 2847 if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf))
2835 goto invalid_fld; 2848 goto invalid_fld;
@@ -2846,18 +2859,6 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
2846 multi_count); 2859 multi_count);
2847 } 2860 }
2848 2861
2849 /* READ/WRITE LONG use a non-standard sect_size */
2850 qc->sect_size = ATA_SECT_SIZE;
2851 switch (tf->command) {
2852 case ATA_CMD_READ_LONG:
2853 case ATA_CMD_READ_LONG_ONCE:
2854 case ATA_CMD_WRITE_LONG:
2855 case ATA_CMD_WRITE_LONG_ONCE:
2856 if (tf->protocol != ATA_PROT_PIO || tf->nsect != 1)
2857 goto invalid_fld;
2858 qc->sect_size = scsi_bufflen(scmd);
2859 }
2860
2861 /* 2862 /*
2862 * Filter SET_FEATURES - XFER MODE command -- otherwise, 2863 * Filter SET_FEATURES - XFER MODE command -- otherwise,
2863 * SET_FEATURES - XFER MODE must be preceded/succeeded 2864 * SET_FEATURES - XFER MODE must be preceded/succeeded
@@ -2865,30 +2866,27 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
2865 * controller (i.e. the reason for ->set_piomode(), 2866 * controller (i.e. the reason for ->set_piomode(),
2866 * ->set_dmamode(), and ->post_set_mode() hooks). 2867 * ->set_dmamode(), and ->post_set_mode() hooks).
2867 */ 2868 */
2868 if ((tf->command == ATA_CMD_SET_FEATURES) 2869 if (tf->command == ATA_CMD_SET_FEATURES &&
2869 && (tf->feature == SETFEATURES_XFER)) 2870 tf->feature == SETFEATURES_XFER)
2870 goto invalid_fld; 2871 goto invalid_fld;
2871 2872
2872 /* 2873 /*
2873 * Set flags so that all registers will be written, 2874 * Filter TPM commands by default. These provide an
2874 * and pass on write indication (used for PIO/DMA 2875 * essentially uncontrolled encrypted "back door" between
2875 * setup.) 2876 * applications and the disk. Set libata.allow_tpm=1 if you
2876 */ 2877 * have a real reason for wanting to use them. This ensures
2877 tf->flags |= (ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE); 2878 * that installed software cannot easily mess stuff up without
2878 2879 * user intent. DVR type users will probably ship with this enabled
2879 if (scmd->sc_data_direction == DMA_TO_DEVICE) 2880 * for movie content management.
2880 tf->flags |= ATA_TFLAG_WRITE;
2881
2882 /*
2883 * Set transfer length.
2884 * 2881 *
2885 * TODO: find out if we need to do more here to 2882 * Note that for ATA8 we can issue a DCS change and DCS freeze lock
2886 * cover scatter/gather case. 2883 * for this and should do in future but that it is not sufficient as
2884 * DCS is an optional feature set. Thus we also do the software filter
2885 * so that we comply with the TC consortium stated goal that the user
2886 * can turn off TC features of their system.
2887 */ 2887 */
2888 ata_qc_set_pc_nbytes(qc); 2888 if (tf->command >= 0x5C && tf->command <= 0x5F && !libata_allow_tpm)
2889 2889 goto invalid_fld;
2890 /* request result TF and be quiet about device error */
2891 qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
2892 2890
2893 return 0; 2891 return 0;
2894 2892