aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/ata_piix.c40
-rw-r--r--drivers/scsi/libata-scsi.c48
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);