diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/ata_piix.c | 40 | ||||
-rw-r--r-- | drivers/scsi/libata-scsi.c | 48 |
2 files changed, 28 insertions, 60 deletions
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 333d69dd84ef..887b2b9ee4aa 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
@@ -78,9 +78,7 @@ enum { | |||
78 | ich5_sata = 1, | 78 | ich5_sata = 1, |
79 | piix4_pata = 2, | 79 | piix4_pata = 2, |
80 | ich6_sata = 3, | 80 | ich6_sata = 3, |
81 | ich6_sata_rm = 4, | 81 | ich6_sata_ahci = 4, |
82 | ich7_sata = 5, | ||
83 | esb2_sata = 6, | ||
84 | 82 | ||
85 | PIIX_AHCI_DEVICE = 6, | 83 | PIIX_AHCI_DEVICE = 6, |
86 | }; | 84 | }; |
@@ -111,11 +109,11 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
111 | { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, | 109 | { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, |
112 | { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, | 110 | { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, |
113 | { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, | 111 | { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, |
114 | { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm }, | 112 | { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
115 | { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm }, | 113 | { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
116 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata }, | 114 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
117 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata }, | 115 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
118 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb2_sata }, | 116 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
119 | 117 | ||
120 | { } /* terminate list */ | 118 | { } /* terminate list */ |
121 | }; | 119 | }; |
@@ -258,31 +256,7 @@ static struct ata_port_info piix_port_info[] = { | |||
258 | .port_ops = &piix_sata_ops, | 256 | .port_ops = &piix_sata_ops, |
259 | }, | 257 | }, |
260 | 258 | ||
261 | /* ich6_sata_rm */ | 259 | /* ich6_sata_ahci */ |
262 | { | ||
263 | .sht = &piix_sht, | ||
264 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | | ||
265 | PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | | ||
266 | ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI, | ||
267 | .pio_mask = 0x1f, /* pio0-4 */ | ||
268 | .mwdma_mask = 0x07, /* mwdma0-2 */ | ||
269 | .udma_mask = 0x7f, /* udma0-6 */ | ||
270 | .port_ops = &piix_sata_ops, | ||
271 | }, | ||
272 | |||
273 | /* ich7_sata */ | ||
274 | { | ||
275 | .sht = &piix_sht, | ||
276 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | | ||
277 | PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | | ||
278 | ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI, | ||
279 | .pio_mask = 0x1f, /* pio0-4 */ | ||
280 | .mwdma_mask = 0x07, /* mwdma0-2 */ | ||
281 | .udma_mask = 0x7f, /* udma0-6 */ | ||
282 | .port_ops = &piix_sata_ops, | ||
283 | }, | ||
284 | |||
285 | /* esb2_sata */ | ||
286 | { | 260 | { |
287 | .sht = &piix_sht, | 261 | .sht = &piix_sht, |
288 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | | 262 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | |
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 3b4ca55a3332..957a9caee305 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -969,9 +969,13 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc | |||
969 | if (dev->flags & ATA_DFLAG_LBA) { | 969 | if (dev->flags & ATA_DFLAG_LBA) { |
970 | tf->flags |= ATA_TFLAG_LBA; | 970 | tf->flags |= ATA_TFLAG_LBA; |
971 | 971 | ||
972 | if (dev->flags & ATA_DFLAG_LBA48) { | 972 | if (lba_28_ok(block, n_block)) { |
973 | if (n_block > (64 * 1024)) | 973 | /* use LBA28 */ |
974 | goto invalid_fld; | 974 | tf->command = ATA_CMD_VERIFY; |
975 | tf->device |= (block >> 24) & 0xf; | ||
976 | } else if (lba_48_ok(block, n_block)) { | ||
977 | if (!(dev->flags & ATA_DFLAG_LBA48)) | ||
978 | goto out_of_range; | ||
975 | 979 | ||
976 | /* use LBA48 */ | 980 | /* use LBA48 */ |
977 | tf->flags |= ATA_TFLAG_LBA48; | 981 | tf->flags |= ATA_TFLAG_LBA48; |
@@ -982,15 +986,9 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc | |||
982 | tf->hob_lbah = (block >> 40) & 0xff; | 986 | tf->hob_lbah = (block >> 40) & 0xff; |
983 | tf->hob_lbam = (block >> 32) & 0xff; | 987 | tf->hob_lbam = (block >> 32) & 0xff; |
984 | tf->hob_lbal = (block >> 24) & 0xff; | 988 | tf->hob_lbal = (block >> 24) & 0xff; |
985 | } else { | 989 | } else |
986 | if (n_block > 256) | 990 | /* request too large even for LBA48 */ |
987 | goto invalid_fld; | 991 | goto out_of_range; |
988 | |||
989 | /* use LBA28 */ | ||
990 | tf->command = ATA_CMD_VERIFY; | ||
991 | |||
992 | tf->device |= (block >> 24) & 0xf; | ||
993 | } | ||
994 | 992 | ||
995 | tf->nsect = n_block & 0xff; | 993 | tf->nsect = n_block & 0xff; |
996 | 994 | ||
@@ -1003,8 +1001,8 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, const u8 *sc | |||
1003 | /* CHS */ | 1001 | /* CHS */ |
1004 | u32 sect, head, cyl, track; | 1002 | u32 sect, head, cyl, track; |
1005 | 1003 | ||
1006 | if (n_block > 256) | 1004 | if (!lba_28_ok(block, n_block)) |
1007 | goto invalid_fld; | 1005 | goto out_of_range; |
1008 | 1006 | ||
1009 | /* Convert LBA to CHS */ | 1007 | /* Convert LBA to CHS */ |
1010 | track = (u32)block / dev->sectors; | 1008 | track = (u32)block / dev->sectors; |
@@ -1119,9 +1117,11 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm | |||
1119 | if (dev->flags & ATA_DFLAG_LBA) { | 1117 | if (dev->flags & ATA_DFLAG_LBA) { |
1120 | tf->flags |= ATA_TFLAG_LBA; | 1118 | tf->flags |= ATA_TFLAG_LBA; |
1121 | 1119 | ||
1122 | if (dev->flags & ATA_DFLAG_LBA48) { | 1120 | if (lba_28_ok(block, n_block)) { |
1123 | /* The request -may- be too large for LBA48. */ | 1121 | /* use LBA28 */ |
1124 | if ((block >> 48) || (n_block > 65536)) | 1122 | tf->device |= (block >> 24) & 0xf; |
1123 | } else if (lba_48_ok(block, n_block)) { | ||
1124 | if (!(dev->flags & ATA_DFLAG_LBA48)) | ||
1125 | goto out_of_range; | 1125 | goto out_of_range; |
1126 | 1126 | ||
1127 | /* use LBA48 */ | 1127 | /* use LBA48 */ |
@@ -1132,15 +1132,9 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm | |||
1132 | tf->hob_lbah = (block >> 40) & 0xff; | 1132 | tf->hob_lbah = (block >> 40) & 0xff; |
1133 | tf->hob_lbam = (block >> 32) & 0xff; | 1133 | tf->hob_lbam = (block >> 32) & 0xff; |
1134 | tf->hob_lbal = (block >> 24) & 0xff; | 1134 | tf->hob_lbal = (block >> 24) & 0xff; |
1135 | } else { | 1135 | } else |
1136 | /* use LBA28 */ | 1136 | /* request too large even for LBA48 */ |
1137 | 1137 | goto out_of_range; | |
1138 | /* The request -may- be too large for LBA28. */ | ||
1139 | if ((block >> 28) || (n_block > 256)) | ||
1140 | goto out_of_range; | ||
1141 | |||
1142 | tf->device |= (block >> 24) & 0xf; | ||
1143 | } | ||
1144 | 1138 | ||
1145 | ata_rwcmd_protocol(qc); | 1139 | ata_rwcmd_protocol(qc); |
1146 | 1140 | ||
@@ -1157,7 +1151,7 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm | |||
1157 | u32 sect, head, cyl, track; | 1151 | u32 sect, head, cyl, track; |
1158 | 1152 | ||
1159 | /* The request -may- be too large for CHS addressing. */ | 1153 | /* The request -may- be too large for CHS addressing. */ |
1160 | if ((block >> 28) || (n_block > 256)) | 1154 | if (!lba_28_ok(block, n_block)) |
1161 | goto out_of_range; | 1155 | goto out_of_range; |
1162 | 1156 | ||
1163 | ata_rwcmd_protocol(qc); | 1157 | ata_rwcmd_protocol(qc); |