diff options
Diffstat (limited to 'drivers/ata')
| -rw-r--r-- | drivers/ata/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/ata/ahci.c | 62 | ||||
| -rw-r--r-- | drivers/ata/ata_generic.c | 6 | ||||
| -rw-r--r-- | drivers/ata/libata-core.c | 16 | ||||
| -rw-r--r-- | drivers/ata/libata-eh.c | 2 | ||||
| -rw-r--r-- | drivers/ata/libata-scsi.c | 60 | ||||
| -rw-r--r-- | drivers/ata/libata-sff.c | 21 | ||||
| -rw-r--r-- | drivers/ata/pata_cmd64x.c | 23 | ||||
| -rw-r--r-- | drivers/ata/pata_hpt3x2n.c | 6 | ||||
| -rw-r--r-- | drivers/ata/pata_it821x.c | 4 | ||||
| -rw-r--r-- | drivers/ata/pata_ixp4xx_cf.c | 5 | ||||
| -rw-r--r-- | drivers/ata/pata_legacy.c | 4 | ||||
| -rw-r--r-- | drivers/ata/pata_platform.c | 3 | ||||
| -rw-r--r-- | drivers/ata/pata_rz1000.c | 6 | ||||
| -rw-r--r-- | drivers/ata/pata_sil680.c | 2 | ||||
| -rw-r--r-- | drivers/ata/pata_via.c | 1 | ||||
| -rw-r--r-- | drivers/ata/sata_uli.c | 3 | ||||
| -rw-r--r-- | drivers/ata/sata_via.c | 12 |
18 files changed, 175 insertions, 65 deletions
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index da21552d2b1c..1c94b43d2c9b 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
| @@ -19,6 +19,10 @@ config ATA | |||
| 19 | 19 | ||
| 20 | if ATA | 20 | if ATA |
| 21 | 21 | ||
| 22 | config ATA_NONSTANDARD | ||
| 23 | bool | ||
| 24 | default n | ||
| 25 | |||
| 22 | config SATA_AHCI | 26 | config SATA_AHCI |
| 23 | tristate "AHCI SATA support" | 27 | tristate "AHCI SATA support" |
| 24 | depends on PCI | 28 | depends on PCI |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index e3c7b312287a..48616c6fee9d 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -75,6 +75,7 @@ enum { | |||
| 75 | AHCI_CMD_CLR_BUSY = (1 << 10), | 75 | AHCI_CMD_CLR_BUSY = (1 << 10), |
| 76 | 76 | ||
| 77 | RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */ | 77 | RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */ |
| 78 | RX_FIS_SDB = 0x58, /* offset of SDB FIS data */ | ||
| 78 | RX_FIS_UNK = 0x60, /* offset of Unknown FIS data */ | 79 | RX_FIS_UNK = 0x60, /* offset of Unknown FIS data */ |
| 79 | 80 | ||
| 80 | board_ahci = 0, | 81 | board_ahci = 0, |
| @@ -202,6 +203,10 @@ struct ahci_port_priv { | |||
| 202 | dma_addr_t cmd_tbl_dma; | 203 | dma_addr_t cmd_tbl_dma; |
| 203 | void *rx_fis; | 204 | void *rx_fis; |
| 204 | dma_addr_t rx_fis_dma; | 205 | dma_addr_t rx_fis_dma; |
| 206 | /* for NCQ spurious interrupt analysis */ | ||
| 207 | int ncq_saw_spurious_sdb_cnt; | ||
| 208 | unsigned int ncq_saw_d2h:1; | ||
| 209 | unsigned int ncq_saw_dmas:1; | ||
| 205 | }; | 210 | }; |
| 206 | 211 | ||
| 207 | static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg); | 212 | static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg); |
| @@ -898,7 +903,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class) | |||
| 898 | 903 | ||
| 899 | /* clear D2H reception area to properly wait for D2H FIS */ | 904 | /* clear D2H reception area to properly wait for D2H FIS */ |
| 900 | ata_tf_init(ap->device, &tf); | 905 | ata_tf_init(ap->device, &tf); |
| 901 | tf.command = 0xff; | 906 | tf.command = 0x80; |
| 902 | ata_tf_to_fis(&tf, d2h_fis, 0); | 907 | ata_tf_to_fis(&tf, d2h_fis, 0); |
| 903 | 908 | ||
| 904 | rc = sata_std_hardreset(ap, class); | 909 | rc = sata_std_hardreset(ap, class); |
| @@ -1109,8 +1114,9 @@ static void ahci_host_intr(struct ata_port *ap) | |||
| 1109 | void __iomem *mmio = ap->host->mmio_base; | 1114 | void __iomem *mmio = ap->host->mmio_base; |
| 1110 | void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); | 1115 | void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); |
| 1111 | struct ata_eh_info *ehi = &ap->eh_info; | 1116 | struct ata_eh_info *ehi = &ap->eh_info; |
| 1117 | struct ahci_port_priv *pp = ap->private_data; | ||
| 1112 | u32 status, qc_active; | 1118 | u32 status, qc_active; |
| 1113 | int rc; | 1119 | int rc, known_irq = 0; |
| 1114 | 1120 | ||
| 1115 | status = readl(port_mmio + PORT_IRQ_STAT); | 1121 | status = readl(port_mmio + PORT_IRQ_STAT); |
| 1116 | writel(status, port_mmio + PORT_IRQ_STAT); | 1122 | writel(status, port_mmio + PORT_IRQ_STAT); |
| @@ -1137,17 +1143,53 @@ static void ahci_host_intr(struct ata_port *ap) | |||
| 1137 | 1143 | ||
| 1138 | /* hmmm... a spurious interupt */ | 1144 | /* hmmm... a spurious interupt */ |
| 1139 | 1145 | ||
| 1140 | /* some devices send D2H reg with I bit set during NCQ command phase */ | 1146 | /* if !NCQ, ignore. No modern ATA device has broken HSM |
| 1141 | if (ap->sactive && (status & PORT_IRQ_D2H_REG_FIS)) | 1147 | * implementation for non-NCQ commands. |
| 1148 | */ | ||
| 1149 | if (!ap->sactive) | ||
| 1142 | return; | 1150 | return; |
| 1143 | 1151 | ||
| 1144 | /* ignore interim PIO setup fis interrupts */ | 1152 | if (status & PORT_IRQ_D2H_REG_FIS) { |
| 1145 | if (ata_tag_valid(ap->active_tag) && (status & PORT_IRQ_PIOS_FIS)) | 1153 | if (!pp->ncq_saw_d2h) |
| 1146 | return; | 1154 | ata_port_printk(ap, KERN_INFO, |
| 1155 | "D2H reg with I during NCQ, " | ||
| 1156 | "this message won't be printed again\n"); | ||
| 1157 | pp->ncq_saw_d2h = 1; | ||
| 1158 | known_irq = 1; | ||
| 1159 | } | ||
| 1160 | |||
| 1161 | if (status & PORT_IRQ_DMAS_FIS) { | ||
| 1162 | if (!pp->ncq_saw_dmas) | ||
| 1163 | ata_port_printk(ap, KERN_INFO, | ||
| 1164 | "DMAS FIS during NCQ, " | ||
| 1165 | "this message won't be printed again\n"); | ||
| 1166 | pp->ncq_saw_dmas = 1; | ||
| 1167 | known_irq = 1; | ||
| 1168 | } | ||
| 1169 | |||
| 1170 | if (status & PORT_IRQ_SDB_FIS && | ||
| 1171 | pp->ncq_saw_spurious_sdb_cnt < 10) { | ||
| 1172 | /* SDB FIS containing spurious completions might be | ||
| 1173 | * dangerous, we need to know more about them. Print | ||
| 1174 | * more of it. | ||
| 1175 | */ | ||
| 1176 | const u32 *f = pp->rx_fis + RX_FIS_SDB; | ||
| 1177 | |||
| 1178 | ata_port_printk(ap, KERN_INFO, "Spurious SDB FIS during NCQ " | ||
| 1179 | "issue=0x%x SAct=0x%x FIS=%08x:%08x%s\n", | ||
| 1180 | readl(port_mmio + PORT_CMD_ISSUE), | ||
| 1181 | readl(port_mmio + PORT_SCR_ACT), | ||
| 1182 | le32_to_cpu(f[0]), le32_to_cpu(f[1]), | ||
| 1183 | pp->ncq_saw_spurious_sdb_cnt < 10 ? | ||
| 1184 | "" : ", shutting up"); | ||
| 1185 | |||
| 1186 | pp->ncq_saw_spurious_sdb_cnt++; | ||
| 1187 | known_irq = 1; | ||
| 1188 | } | ||
| 1147 | 1189 | ||
| 1148 | if (ata_ratelimit()) | 1190 | if (!known_irq) |
| 1149 | ata_port_printk(ap, KERN_INFO, "spurious interrupt " | 1191 | ata_port_printk(ap, KERN_INFO, "spurious interrupt " |
| 1150 | "(irq_stat 0x%x active_tag %d sactive 0x%x)\n", | 1192 | "(irq_stat 0x%x active_tag 0x%x sactive 0x%x)\n", |
| 1151 | status, ap->active_tag, ap->sactive); | 1193 | status, ap->active_tag, ap->sactive); |
| 1152 | } | 1194 | } |
| 1153 | 1195 | ||
| @@ -1240,7 +1282,7 @@ static void ahci_thaw(struct ata_port *ap) | |||
| 1240 | /* clear IRQ */ | 1282 | /* clear IRQ */ |
| 1241 | tmp = readl(port_mmio + PORT_IRQ_STAT); | 1283 | tmp = readl(port_mmio + PORT_IRQ_STAT); |
| 1242 | writel(tmp, port_mmio + PORT_IRQ_STAT); | 1284 | writel(tmp, port_mmio + PORT_IRQ_STAT); |
| 1243 | writel(1 << ap->id, mmio + HOST_IRQ_STAT); | 1285 | writel(1 << ap->port_no, mmio + HOST_IRQ_STAT); |
| 1244 | 1286 | ||
| 1245 | /* turn IRQ back on */ | 1287 | /* turn IRQ back on */ |
| 1246 | writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); | 1288 | writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); |
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 908751d27e76..24af56081b5d 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
| @@ -64,6 +64,7 @@ static void generic_error_handler(struct ata_port *ap) | |||
| 64 | /** | 64 | /** |
| 65 | * generic_set_mode - mode setting | 65 | * generic_set_mode - mode setting |
| 66 | * @ap: interface to set up | 66 | * @ap: interface to set up |
| 67 | * @unused: returned device on error | ||
| 67 | * | 68 | * |
| 68 | * Use a non standard set_mode function. We don't want to be tuned. | 69 | * Use a non standard set_mode function. We don't want to be tuned. |
| 69 | * The BIOS configured everything. Our job is not to fiddle. We | 70 | * The BIOS configured everything. Our job is not to fiddle. We |
| @@ -71,7 +72,7 @@ static void generic_error_handler(struct ata_port *ap) | |||
| 71 | * and respect them. | 72 | * and respect them. |
| 72 | */ | 73 | */ |
| 73 | 74 | ||
| 74 | static void generic_set_mode(struct ata_port *ap) | 75 | static int generic_set_mode(struct ata_port *ap, struct ata_device **unused) |
| 75 | { | 76 | { |
| 76 | int dma_enabled = 0; | 77 | int dma_enabled = 0; |
| 77 | int i; | 78 | int i; |
| @@ -82,7 +83,7 @@ static void generic_set_mode(struct ata_port *ap) | |||
| 82 | 83 | ||
| 83 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 84 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 84 | struct ata_device *dev = &ap->device[i]; | 85 | struct ata_device *dev = &ap->device[i]; |
| 85 | if (ata_dev_enabled(dev)) { | 86 | if (ata_dev_ready(dev)) { |
| 86 | /* We don't really care */ | 87 | /* We don't really care */ |
| 87 | dev->pio_mode = XFER_PIO_0; | 88 | dev->pio_mode = XFER_PIO_0; |
| 88 | dev->dma_mode = XFER_MW_DMA_0; | 89 | dev->dma_mode = XFER_MW_DMA_0; |
| @@ -99,6 +100,7 @@ static void generic_set_mode(struct ata_port *ap) | |||
| 99 | } | 100 | } |
| 100 | } | 101 | } |
| 101 | } | 102 | } |
| 103 | return 0; | ||
| 102 | } | 104 | } |
| 103 | 105 | ||
| 104 | static struct scsi_host_template generic_sht = { | 106 | static struct scsi_host_template generic_sht = { |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 0d51d13b16bf..cf707029352e 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -1037,7 +1037,7 @@ static unsigned int ata_id_xfermask(const u16 *id) | |||
| 1037 | * the PIO timing number for the maximum. Turn it into | 1037 | * the PIO timing number for the maximum. Turn it into |
| 1038 | * a mask. | 1038 | * a mask. |
| 1039 | */ | 1039 | */ |
| 1040 | u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF; | 1040 | u8 mode = (id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF; |
| 1041 | if (mode < 5) /* Valid PIO range */ | 1041 | if (mode < 5) /* Valid PIO range */ |
| 1042 | pio_mask = (2 << mode) - 1; | 1042 | pio_mask = (2 << mode) - 1; |
| 1043 | else | 1043 | else |
| @@ -2431,18 +2431,8 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev) | |||
| 2431 | int i, rc = 0, used_dma = 0, found = 0; | 2431 | int i, rc = 0, used_dma = 0, found = 0; |
| 2432 | 2432 | ||
| 2433 | /* has private set_mode? */ | 2433 | /* has private set_mode? */ |
| 2434 | if (ap->ops->set_mode) { | 2434 | if (ap->ops->set_mode) |
| 2435 | /* FIXME: make ->set_mode handle no device case and | 2435 | return ap->ops->set_mode(ap, r_failed_dev); |
| 2436 | * return error code and failing device on failure. | ||
| 2437 | */ | ||
| 2438 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | ||
| 2439 | if (ata_dev_ready(&ap->device[i])) { | ||
| 2440 | ap->ops->set_mode(ap); | ||
| 2441 | break; | ||
| 2442 | } | ||
| 2443 | } | ||
| 2444 | return 0; | ||
| 2445 | } | ||
| 2446 | 2436 | ||
| 2447 | /* step 1: calculate xfer_mask */ | 2437 | /* step 1: calculate xfer_mask */ |
| 2448 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 2438 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 56cf59b60ec4..748435807d68 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -1796,7 +1796,7 @@ static int ata_eh_suspend(struct ata_port *ap, struct ata_device **r_failed_dev) | |||
| 1796 | *r_failed_dev = dev; | 1796 | *r_failed_dev = dev; |
| 1797 | 1797 | ||
| 1798 | DPRINTK("EXIT\n"); | 1798 | DPRINTK("EXIT\n"); |
| 1799 | return 0; | 1799 | return rc; |
| 1800 | } | 1800 | } |
| 1801 | 1801 | ||
| 1802 | /** | 1802 | /** |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 7cc5a4a910a4..73902d335767 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -273,8 +273,8 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
| 273 | { | 273 | { |
| 274 | int rc = 0; | 274 | int rc = 0; |
| 275 | u8 scsi_cmd[MAX_COMMAND_SIZE]; | 275 | u8 scsi_cmd[MAX_COMMAND_SIZE]; |
| 276 | u8 args[7]; | 276 | u8 args[7], *sensebuf = NULL; |
| 277 | struct scsi_sense_hdr sshdr; | 277 | int cmd_result; |
| 278 | 278 | ||
| 279 | if (arg == NULL) | 279 | if (arg == NULL) |
| 280 | return -EINVAL; | 280 | return -EINVAL; |
| @@ -282,10 +282,14 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
| 282 | if (copy_from_user(args, arg, sizeof(args))) | 282 | if (copy_from_user(args, arg, sizeof(args))) |
| 283 | return -EFAULT; | 283 | return -EFAULT; |
| 284 | 284 | ||
| 285 | sensebuf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO); | ||
| 286 | if (!sensebuf) | ||
| 287 | return -ENOMEM; | ||
| 288 | |||
| 285 | memset(scsi_cmd, 0, sizeof(scsi_cmd)); | 289 | memset(scsi_cmd, 0, sizeof(scsi_cmd)); |
| 286 | scsi_cmd[0] = ATA_16; | 290 | scsi_cmd[0] = ATA_16; |
| 287 | scsi_cmd[1] = (3 << 1); /* Non-data */ | 291 | scsi_cmd[1] = (3 << 1); /* Non-data */ |
| 288 | /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */ | 292 | scsi_cmd[2] = 0x20; /* cc but no off.line or data xfer */ |
| 289 | scsi_cmd[4] = args[1]; | 293 | scsi_cmd[4] = args[1]; |
| 290 | scsi_cmd[6] = args[2]; | 294 | scsi_cmd[6] = args[2]; |
| 291 | scsi_cmd[8] = args[3]; | 295 | scsi_cmd[8] = args[3]; |
| @@ -295,11 +299,46 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
| 295 | 299 | ||
| 296 | /* Good values for timeout and retries? Values below | 300 | /* Good values for timeout and retries? Values below |
| 297 | from scsi_ioctl_send_command() for default case... */ | 301 | from scsi_ioctl_send_command() for default case... */ |
| 298 | if (scsi_execute_req(scsidev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr, | 302 | cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0, |
| 299 | (10*HZ), 5)) | 303 | sensebuf, (10*HZ), 5, 0); |
| 304 | |||
| 305 | if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */ | ||
| 306 | u8 *desc = sensebuf + 8; | ||
| 307 | cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */ | ||
| 308 | |||
| 309 | /* If we set cc then ATA pass-through will cause a | ||
| 310 | * check condition even if no error. Filter that. */ | ||
| 311 | if (cmd_result & SAM_STAT_CHECK_CONDITION) { | ||
| 312 | struct scsi_sense_hdr sshdr; | ||
| 313 | scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE, | ||
| 314 | &sshdr); | ||
| 315 | if (sshdr.sense_key==0 && | ||
| 316 | sshdr.asc==0 && sshdr.ascq==0) | ||
| 317 | cmd_result &= ~SAM_STAT_CHECK_CONDITION; | ||
| 318 | } | ||
| 319 | |||
| 320 | /* Send userspace ATA registers */ | ||
| 321 | if (sensebuf[0] == 0x72 && /* format is "descriptor" */ | ||
| 322 | desc[0] == 0x09) {/* code is "ATA Descriptor" */ | ||
| 323 | args[0] = desc[13]; /* status */ | ||
| 324 | args[1] = desc[3]; /* error */ | ||
| 325 | args[2] = desc[5]; /* sector count (0:7) */ | ||
| 326 | args[3] = desc[7]; /* lbal */ | ||
| 327 | args[4] = desc[9]; /* lbam */ | ||
| 328 | args[5] = desc[11]; /* lbah */ | ||
| 329 | args[6] = desc[12]; /* select */ | ||
| 330 | if (copy_to_user(arg, args, sizeof(args))) | ||
| 331 | rc = -EFAULT; | ||
| 332 | } | ||
| 333 | } | ||
| 334 | |||
| 335 | if (cmd_result) { | ||
| 300 | rc = -EIO; | 336 | rc = -EIO; |
| 337 | goto error; | ||
| 338 | } | ||
| 301 | 339 | ||
| 302 | /* Need code to retrieve data from check condition? */ | 340 | error: |
| 341 | kfree(sensebuf); | ||
| 303 | return rc; | 342 | return rc; |
| 304 | } | 343 | } |
| 305 | 344 | ||
| @@ -983,11 +1022,10 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc) | |||
| 983 | } | 1022 | } |
| 984 | 1023 | ||
| 985 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ | 1024 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ |
| 986 | } else { | 1025 | } else |
| 987 | tf->nsect = 0; /* time period value (0 implies now) */ | 1026 | /* Issue ATA STANDBY IMMEDIATE command */ |
| 988 | tf->command = ATA_CMD_STANDBY; | 1027 | tf->command = ATA_CMD_STANDBYNOW1; |
| 989 | /* Consider: ATA STANDBY IMMEDIATE command */ | 1028 | |
| 990 | } | ||
| 991 | /* | 1029 | /* |
| 992 | * Standby and Idle condition timers could be implemented but that | 1030 | * Standby and Idle condition timers could be implemented but that |
| 993 | * would require libata to implement the Power condition mode page | 1031 | * would require libata to implement the Power condition mode page |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 623cec914c9b..12c88c588039 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
| @@ -827,7 +827,8 @@ void ata_bmdma_error_handler(struct ata_port *ap) | |||
| 827 | */ | 827 | */ |
| 828 | void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc) | 828 | void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc) |
| 829 | { | 829 | { |
| 830 | ata_bmdma_stop(qc); | 830 | if (qc->ap->ioaddr.bmdma_addr) |
| 831 | ata_bmdma_stop(qc); | ||
| 831 | } | 832 | } |
| 832 | 833 | ||
| 833 | #ifdef CONFIG_PCI | 834 | #ifdef CONFIG_PCI |
| @@ -870,7 +871,8 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int | |||
| 870 | pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS; | 871 | pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS; |
| 871 | bmdma = pci_resource_start(pdev, 4); | 872 | bmdma = pci_resource_start(pdev, 4); |
| 872 | if (bmdma) { | 873 | if (bmdma) { |
| 873 | if (inb(bmdma + 2) & 0x80) | 874 | if ((!(port[p]->flags & ATA_FLAG_IGN_SIMPLEX)) && |
| 875 | (inb(bmdma + 2) & 0x80)) | ||
| 874 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; | 876 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; |
| 875 | probe_ent->port[p].bmdma_addr = bmdma; | 877 | probe_ent->port[p].bmdma_addr = bmdma; |
| 876 | } | 878 | } |
| @@ -886,7 +888,8 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int | |||
| 886 | bmdma = pci_resource_start(pdev, 4); | 888 | bmdma = pci_resource_start(pdev, 4); |
| 887 | if (bmdma) { | 889 | if (bmdma) { |
| 888 | bmdma += 8; | 890 | bmdma += 8; |
| 889 | if(inb(bmdma + 2) & 0x80) | 891 | if ((!(port[p]->flags & ATA_FLAG_IGN_SIMPLEX)) && |
| 892 | (inb(bmdma + 2) & 0x80)) | ||
| 890 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; | 893 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; |
| 891 | probe_ent->port[p].bmdma_addr = bmdma; | 894 | probe_ent->port[p].bmdma_addr = bmdma; |
| 892 | } | 895 | } |
| @@ -914,13 +917,14 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, | |||
| 914 | probe_ent->irq_flags = IRQF_SHARED; | 917 | probe_ent->irq_flags = IRQF_SHARED; |
| 915 | 918 | ||
| 916 | if (port_mask & ATA_PORT_PRIMARY) { | 919 | if (port_mask & ATA_PORT_PRIMARY) { |
| 917 | probe_ent->irq = ATA_PRIMARY_IRQ; | 920 | probe_ent->irq = ATA_PRIMARY_IRQ(pdev); |
| 918 | probe_ent->port[0].cmd_addr = ATA_PRIMARY_CMD; | 921 | probe_ent->port[0].cmd_addr = ATA_PRIMARY_CMD; |
| 919 | probe_ent->port[0].altstatus_addr = | 922 | probe_ent->port[0].altstatus_addr = |
| 920 | probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL; | 923 | probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL; |
| 921 | if (bmdma) { | 924 | if (bmdma) { |
| 922 | probe_ent->port[0].bmdma_addr = bmdma; | 925 | probe_ent->port[0].bmdma_addr = bmdma; |
| 923 | if (inb(bmdma + 2) & 0x80) | 926 | if ((!(port[0]->flags & ATA_FLAG_IGN_SIMPLEX)) && |
| 927 | (inb(bmdma + 2) & 0x80)) | ||
| 924 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; | 928 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; |
| 925 | } | 929 | } |
| 926 | ata_std_ports(&probe_ent->port[0]); | 930 | ata_std_ports(&probe_ent->port[0]); |
| @@ -929,15 +933,16 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, | |||
| 929 | 933 | ||
| 930 | if (port_mask & ATA_PORT_SECONDARY) { | 934 | if (port_mask & ATA_PORT_SECONDARY) { |
| 931 | if (probe_ent->irq) | 935 | if (probe_ent->irq) |
| 932 | probe_ent->irq2 = ATA_SECONDARY_IRQ; | 936 | probe_ent->irq2 = ATA_SECONDARY_IRQ(pdev); |
| 933 | else | 937 | else |
| 934 | probe_ent->irq = ATA_SECONDARY_IRQ; | 938 | probe_ent->irq = ATA_SECONDARY_IRQ(pdev); |
| 935 | probe_ent->port[1].cmd_addr = ATA_SECONDARY_CMD; | 939 | probe_ent->port[1].cmd_addr = ATA_SECONDARY_CMD; |
| 936 | probe_ent->port[1].altstatus_addr = | 940 | probe_ent->port[1].altstatus_addr = |
| 937 | probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL; | 941 | probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL; |
| 938 | if (bmdma) { | 942 | if (bmdma) { |
| 939 | probe_ent->port[1].bmdma_addr = bmdma + 8; | 943 | probe_ent->port[1].bmdma_addr = bmdma + 8; |
| 940 | if (inb(bmdma + 10) & 0x80) | 944 | if ((!(port[1]->flags & ATA_FLAG_IGN_SIMPLEX)) && |
| 945 | (inb(bmdma + 10) & 0x80)) | ||
| 941 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; | 946 | probe_ent->_host_flags |= ATA_HOST_SIMPLEX; |
| 942 | } | 947 | } |
| 943 | ata_std_ports(&probe_ent->port[1]); | 948 | ata_std_ports(&probe_ent->port[1]); |
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c index 15841a563694..449162cbf93e 100644 --- a/drivers/ata/pata_cmd64x.c +++ b/drivers/ata/pata_cmd64x.c | |||
| @@ -197,7 +197,7 @@ static void cmd64x_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 197 | static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev) | 197 | static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev) |
| 198 | { | 198 | { |
| 199 | static const u8 udma_data[] = { | 199 | static const u8 udma_data[] = { |
| 200 | 0x31, 0x21, 0x11, 0x25, 0x15, 0x05 | 200 | 0x30, 0x20, 0x10, 0x20, 0x10, 0x00 |
| 201 | }; | 201 | }; |
| 202 | static const u8 mwdma_data[] = { | 202 | static const u8 mwdma_data[] = { |
| 203 | 0x30, 0x20, 0x10 | 203 | 0x30, 0x20, 0x10 |
| @@ -213,12 +213,21 @@ static void cmd64x_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
| 213 | pci_read_config_byte(pdev, pciD, ®D); | 213 | pci_read_config_byte(pdev, pciD, ®D); |
| 214 | pci_read_config_byte(pdev, pciU, ®U); | 214 | pci_read_config_byte(pdev, pciU, ®U); |
| 215 | 215 | ||
| 216 | regD &= ~(0x20 << shift); | 216 | /* DMA bits off */ |
| 217 | regU &= ~(0x35 << shift); | 217 | regD &= ~(0x20 << adev->devno); |
| 218 | /* DMA control bits */ | ||
| 219 | regU &= ~(0x30 << shift); | ||
| 220 | /* DMA timing bits */ | ||
| 221 | regU &= ~(0x05 << adev->devno); | ||
| 218 | 222 | ||
| 219 | if (adev->dma_mode >= XFER_UDMA_0) | 223 | if (adev->dma_mode >= XFER_UDMA_0) { |
| 224 | /* Merge thge timing value */ | ||
| 220 | regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift; | 225 | regU |= udma_data[adev->dma_mode - XFER_UDMA_0] << shift; |
| 221 | else | 226 | /* Merge the control bits */ |
| 227 | regU |= 1 << adev->devno; /* UDMA on */ | ||
| 228 | if (adev->dma_mode > 2) /* 15nS timing */ | ||
| 229 | regU |= 4 << adev->devno; | ||
| 230 | } else | ||
| 222 | regD |= mwdma_data[adev->dma_mode - XFER_MW_DMA_0] << shift; | 231 | regD |= mwdma_data[adev->dma_mode - XFER_MW_DMA_0] << shift; |
| 223 | 232 | ||
| 224 | regD |= 0x20 << adev->devno; | 233 | regD |= 0x20 << adev->devno; |
| @@ -239,8 +248,8 @@ static void cmd648_bmdma_stop(struct ata_queued_cmd *qc) | |||
| 239 | struct ata_port *ap = qc->ap; | 248 | struct ata_port *ap = qc->ap; |
| 240 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 249 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 241 | u8 dma_intr; | 250 | u8 dma_intr; |
| 242 | int dma_reg = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0; | 251 | int dma_mask = ap->port_no ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0; |
| 243 | int dma_mask = ap->port_no ? ARTTIM2 : CFR; | 252 | int dma_reg = ap->port_no ? ARTTIM2 : CFR; |
| 244 | 253 | ||
| 245 | ata_bmdma_stop(qc); | 254 | ata_bmdma_stop(qc); |
| 246 | 255 | ||
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c index f6817b4093a4..886fab9aa62c 100644 --- a/drivers/ata/pata_hpt3x2n.c +++ b/drivers/ata/pata_hpt3x2n.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/libata.h> | 25 | #include <linux/libata.h> |
| 26 | 26 | ||
| 27 | #define DRV_NAME "pata_hpt3x2n" | 27 | #define DRV_NAME "pata_hpt3x2n" |
| 28 | #define DRV_VERSION "0.3" | 28 | #define DRV_VERSION "0.3.2" |
| 29 | 29 | ||
| 30 | enum { | 30 | enum { |
| 31 | HPT_PCI_FAST = (1 << 31), | 31 | HPT_PCI_FAST = (1 << 31), |
| @@ -297,11 +297,11 @@ static int hpt3x2n_pair_idle(struct ata_port *ap) | |||
| 297 | return 0; | 297 | return 0; |
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | static int hpt3x2n_use_dpll(struct ata_port *ap, int reading) | 300 | static int hpt3x2n_use_dpll(struct ata_port *ap, int writing) |
| 301 | { | 301 | { |
| 302 | long flags = (long)ap->host->private_data; | 302 | long flags = (long)ap->host->private_data; |
| 303 | /* See if we should use the DPLL */ | 303 | /* See if we should use the DPLL */ |
| 304 | if (reading == 0) | 304 | if (writing) |
| 305 | return USE_DPLL; /* Needed for write */ | 305 | return USE_DPLL; /* Needed for write */ |
| 306 | if (flags & PCI66) | 306 | if (flags & PCI66) |
| 307 | return USE_DPLL; /* Needed at 66Mhz */ | 307 | return USE_DPLL; /* Needed at 66Mhz */ |
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index 0b56ff3d1cfe..e8afd486434a 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
| @@ -476,6 +476,7 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc) | |||
| 476 | /** | 476 | /** |
| 477 | * it821x_smart_set_mode - mode setting | 477 | * it821x_smart_set_mode - mode setting |
| 478 | * @ap: interface to set up | 478 | * @ap: interface to set up |
| 479 | * @unused: device that failed (error only) | ||
| 479 | * | 480 | * |
| 480 | * Use a non standard set_mode function. We don't want to be tuned. | 481 | * Use a non standard set_mode function. We don't want to be tuned. |
| 481 | * The BIOS configured everything. Our job is not to fiddle. We | 482 | * The BIOS configured everything. Our job is not to fiddle. We |
| @@ -483,7 +484,7 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc) | |||
| 483 | * and respect them. | 484 | * and respect them. |
| 484 | */ | 485 | */ |
| 485 | 486 | ||
| 486 | static void it821x_smart_set_mode(struct ata_port *ap) | 487 | static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused) |
| 487 | { | 488 | { |
| 488 | int dma_enabled = 0; | 489 | int dma_enabled = 0; |
| 489 | int i; | 490 | int i; |
| @@ -512,6 +513,7 @@ static void it821x_smart_set_mode(struct ata_port *ap) | |||
| 512 | } | 513 | } |
| 513 | } | 514 | } |
| 514 | } | 515 | } |
| 516 | return 0; | ||
| 515 | } | 517 | } |
| 516 | 518 | ||
| 517 | /** | 519 | /** |
diff --git a/drivers/ata/pata_ixp4xx_cf.c b/drivers/ata/pata_ixp4xx_cf.c index cb8924109f59..23b8aab3ebd8 100644 --- a/drivers/ata/pata_ixp4xx_cf.c +++ b/drivers/ata/pata_ixp4xx_cf.c | |||
| @@ -23,9 +23,9 @@ | |||
| 23 | #include <scsi/scsi_host.h> | 23 | #include <scsi/scsi_host.h> |
| 24 | 24 | ||
| 25 | #define DRV_NAME "pata_ixp4xx_cf" | 25 | #define DRV_NAME "pata_ixp4xx_cf" |
| 26 | #define DRV_VERSION "0.1.1" | 26 | #define DRV_VERSION "0.1.1ac1" |
| 27 | 27 | ||
| 28 | static void ixp4xx_set_mode(struct ata_port *ap) | 28 | static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device *adev) |
| 29 | { | 29 | { |
| 30 | int i; | 30 | int i; |
| 31 | 31 | ||
| @@ -38,6 +38,7 @@ static void ixp4xx_set_mode(struct ata_port *ap) | |||
| 38 | dev->flags |= ATA_DFLAG_PIO; | 38 | dev->flags |= ATA_DFLAG_PIO; |
| 39 | } | 39 | } |
| 40 | } | 40 | } |
| 41 | return 0; | ||
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | static void ixp4xx_phy_reset(struct ata_port *ap) | 44 | static void ixp4xx_phy_reset(struct ata_port *ap) |
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c index e7bf9d89c8ee..581cb33c6f45 100644 --- a/drivers/ata/pata_legacy.c +++ b/drivers/ata/pata_legacy.c | |||
| @@ -96,6 +96,7 @@ static int pio_mask = 0x1F; /* PIO range for autospeed devices */ | |||
| 96 | /** | 96 | /** |
| 97 | * legacy_set_mode - mode setting | 97 | * legacy_set_mode - mode setting |
| 98 | * @ap: IDE interface | 98 | * @ap: IDE interface |
| 99 | * @unused: Device that failed when error is returned | ||
| 99 | * | 100 | * |
| 100 | * Use a non standard set_mode function. We don't want to be tuned. | 101 | * Use a non standard set_mode function. We don't want to be tuned. |
| 101 | * | 102 | * |
| @@ -105,7 +106,7 @@ static int pio_mask = 0x1F; /* PIO range for autospeed devices */ | |||
| 105 | * expand on this as per hdparm in the base kernel. | 106 | * expand on this as per hdparm in the base kernel. |
| 106 | */ | 107 | */ |
| 107 | 108 | ||
| 108 | static void legacy_set_mode(struct ata_port *ap) | 109 | static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused) |
| 109 | { | 110 | { |
| 110 | int i; | 111 | int i; |
| 111 | 112 | ||
| @@ -118,6 +119,7 @@ static void legacy_set_mode(struct ata_port *ap) | |||
| 118 | dev->flags |= ATA_DFLAG_PIO; | 119 | dev->flags |= ATA_DFLAG_PIO; |
| 119 | } | 120 | } |
| 120 | } | 121 | } |
| 122 | return 0; | ||
| 121 | } | 123 | } |
| 122 | 124 | ||
| 123 | static struct scsi_host_template legacy_sht = { | 125 | static struct scsi_host_template legacy_sht = { |
diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c index 443b1d85c6c4..40ae11cbfda4 100644 --- a/drivers/ata/pata_platform.c +++ b/drivers/ata/pata_platform.c | |||
| @@ -30,7 +30,7 @@ static int pio_mask = 1; | |||
| 30 | * Provide our own set_mode() as we don't want to change anything that has | 30 | * Provide our own set_mode() as we don't want to change anything that has |
| 31 | * already been configured.. | 31 | * already been configured.. |
| 32 | */ | 32 | */ |
| 33 | static void pata_platform_set_mode(struct ata_port *ap) | 33 | static int pata_platform_set_mode(struct ata_port *ap, struct ata_device **unused) |
| 34 | { | 34 | { |
| 35 | int i; | 35 | int i; |
| 36 | 36 | ||
| @@ -44,6 +44,7 @@ static void pata_platform_set_mode(struct ata_port *ap) | |||
| 44 | dev->flags |= ATA_DFLAG_PIO; | 44 | dev->flags |= ATA_DFLAG_PIO; |
| 45 | } | 45 | } |
| 46 | } | 46 | } |
| 47 | return 0; | ||
| 47 | } | 48 | } |
| 48 | 49 | ||
| 49 | static void pata_platform_host_stop(struct ata_host *host) | 50 | static void pata_platform_host_stop(struct ata_host *host) |
diff --git a/drivers/ata/pata_rz1000.c b/drivers/ata/pata_rz1000.c index adf4cc134f25..cec0729225e1 100644 --- a/drivers/ata/pata_rz1000.c +++ b/drivers/ata/pata_rz1000.c | |||
| @@ -52,19 +52,20 @@ static void rz1000_error_handler(struct ata_port *ap) | |||
| 52 | /** | 52 | /** |
| 53 | * rz1000_set_mode - mode setting function | 53 | * rz1000_set_mode - mode setting function |
| 54 | * @ap: ATA interface | 54 | * @ap: ATA interface |
| 55 | * @unused: returned device on set_mode failure | ||
| 55 | * | 56 | * |
| 56 | * Use a non standard set_mode function. We don't want to be tuned. We | 57 | * Use a non standard set_mode function. We don't want to be tuned. We |
| 57 | * would prefer to be BIOS generic but for the fact our hardware is | 58 | * would prefer to be BIOS generic but for the fact our hardware is |
| 58 | * whacked out. | 59 | * whacked out. |
| 59 | */ | 60 | */ |
| 60 | 61 | ||
| 61 | static void rz1000_set_mode(struct ata_port *ap) | 62 | static int rz1000_set_mode(struct ata_port *ap, struct ata_device **unused) |
| 62 | { | 63 | { |
| 63 | int i; | 64 | int i; |
| 64 | 65 | ||
| 65 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 66 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 66 | struct ata_device *dev = &ap->device[i]; | 67 | struct ata_device *dev = &ap->device[i]; |
| 67 | if (ata_dev_enabled(dev)) { | 68 | if (ata_dev_ready(dev)) { |
| 68 | /* We don't really care */ | 69 | /* We don't really care */ |
| 69 | dev->pio_mode = XFER_PIO_0; | 70 | dev->pio_mode = XFER_PIO_0; |
| 70 | dev->xfer_mode = XFER_PIO_0; | 71 | dev->xfer_mode = XFER_PIO_0; |
| @@ -72,6 +73,7 @@ static void rz1000_set_mode(struct ata_port *ap) | |||
| 72 | dev->flags |= ATA_DFLAG_PIO; | 73 | dev->flags |= ATA_DFLAG_PIO; |
| 73 | } | 74 | } |
| 74 | } | 75 | } |
| 76 | return 0; | ||
| 75 | } | 77 | } |
| 76 | 78 | ||
| 77 | 79 | ||
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c index 32cf0bfa8921..e8dfd8fc3ff7 100644 --- a/drivers/ata/pata_sil680.c +++ b/drivers/ata/pata_sil680.c | |||
| @@ -135,7 +135,7 @@ static void sil680_error_handler(struct ata_port *ap) | |||
| 135 | static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev) | 135 | static void sil680_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 136 | { | 136 | { |
| 137 | static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 }; | 137 | static u16 speed_p[5] = { 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1 }; |
| 138 | static u16 speed_t[5] = { 0x328A, 0x1281, 0x1281, 0x10C3, 0x10C1 }; | 138 | static u16 speed_t[5] = { 0x328A, 0x2283, 0x1281, 0x10C3, 0x10C1 }; |
| 139 | 139 | ||
| 140 | unsigned long tfaddr = sil680_selreg(ap, 0x02); | 140 | unsigned long tfaddr = sil680_selreg(ap, 0x02); |
| 141 | unsigned long addr = sil680_seldev(ap, adev, 0x04); | 141 | unsigned long addr = sil680_seldev(ap, adev, 0x04); |
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index f0d4f7e9ed31..0219419cae97 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
| @@ -95,6 +95,7 @@ static const struct via_isa_bridge { | |||
| 95 | u8 rev_max; | 95 | u8 rev_max; |
| 96 | u16 flags; | 96 | u16 flags; |
| 97 | } via_isa_bridges[] = { | 97 | } via_isa_bridges[] = { |
| 98 | { "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | ||
| 98 | { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 99 | { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
| 99 | { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 100 | { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
| 100 | { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES}, | 101 | { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES}, |
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c index 5c603ca3a50a..a43aec62d505 100644 --- a/drivers/ata/sata_uli.c +++ b/drivers/ata/sata_uli.c | |||
| @@ -128,7 +128,8 @@ static const struct ata_port_operations uli_ops = { | |||
| 128 | 128 | ||
| 129 | static struct ata_port_info uli_port_info = { | 129 | static struct ata_port_info uli_port_info = { |
| 130 | .sht = &uli_sht, | 130 | .sht = &uli_sht, |
| 131 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, | 131 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
| 132 | ATA_FLAG_IGN_SIMPLEX, | ||
| 132 | .pio_mask = 0x1f, /* pio0-4 */ | 133 | .pio_mask = 0x1f, /* pio0-4 */ |
| 133 | .udma_mask = 0x7f, /* udma0-6 */ | 134 | .udma_mask = 0x7f, /* udma0-6 */ |
| 134 | .port_ops = &uli_ops, | 135 | .port_ops = &uli_ops, |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 88f0565c8883..d3d5c0d57032 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
| @@ -74,6 +74,7 @@ enum { | |||
| 74 | static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); | 74 | static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); |
| 75 | static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg); | 75 | static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg); |
| 76 | static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); | 76 | static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); |
| 77 | static void svia_noop_freeze(struct ata_port *ap); | ||
| 77 | static void vt6420_error_handler(struct ata_port *ap); | 78 | static void vt6420_error_handler(struct ata_port *ap); |
| 78 | 79 | ||
| 79 | static const struct pci_device_id svia_pci_tbl[] = { | 80 | static const struct pci_device_id svia_pci_tbl[] = { |
| @@ -128,7 +129,7 @@ static const struct ata_port_operations vt6420_sata_ops = { | |||
| 128 | .qc_issue = ata_qc_issue_prot, | 129 | .qc_issue = ata_qc_issue_prot, |
| 129 | .data_xfer = ata_pio_data_xfer, | 130 | .data_xfer = ata_pio_data_xfer, |
| 130 | 131 | ||
| 131 | .freeze = ata_bmdma_freeze, | 132 | .freeze = svia_noop_freeze, |
| 132 | .thaw = ata_bmdma_thaw, | 133 | .thaw = ata_bmdma_thaw, |
| 133 | .error_handler = vt6420_error_handler, | 134 | .error_handler = vt6420_error_handler, |
| 134 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | 135 | .post_internal_cmd = ata_bmdma_post_internal_cmd, |
| @@ -204,6 +205,15 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 204 | outl(val, ap->ioaddr.scr_addr + (4 * sc_reg)); | 205 | outl(val, ap->ioaddr.scr_addr + (4 * sc_reg)); |
| 205 | } | 206 | } |
| 206 | 207 | ||
| 208 | static void svia_noop_freeze(struct ata_port *ap) | ||
| 209 | { | ||
| 210 | /* Some VIA controllers choke if ATA_NIEN is manipulated in | ||
| 211 | * certain way. Leave it alone and just clear pending IRQ. | ||
| 212 | */ | ||
| 213 | ata_chk_status(ap); | ||
| 214 | ata_bmdma_irq_clear(ap); | ||
| 215 | } | ||
| 216 | |||
| 207 | /** | 217 | /** |
| 208 | * vt6420_prereset - prereset for vt6420 | 218 | * vt6420_prereset - prereset for vt6420 |
| 209 | * @ap: target ATA port | 219 | * @ap: target ATA port |
