diff options
Diffstat (limited to 'drivers/ata/pata_artop.c')
-rw-r--r-- | drivers/ata/pata_artop.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index 6b3092c75ff..d332cfdb0f3 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
@@ -12,7 +12,6 @@ | |||
12 | * performance Alessandro Zummo <alessandro.zummo@towertech.it> | 12 | * performance Alessandro Zummo <alessandro.zummo@towertech.it> |
13 | * | 13 | * |
14 | * TODO | 14 | * TODO |
15 | * 850 serialization once the core supports it | ||
16 | * Investigate no_dsc on 850R | 15 | * Investigate no_dsc on 850R |
17 | * Clock detect | 16 | * Clock detect |
18 | */ | 17 | */ |
@@ -29,7 +28,7 @@ | |||
29 | #include <linux/ata.h> | 28 | #include <linux/ata.h> |
30 | 29 | ||
31 | #define DRV_NAME "pata_artop" | 30 | #define DRV_NAME "pata_artop" |
32 | #define DRV_VERSION "0.4.4" | 31 | #define DRV_VERSION "0.4.5" |
33 | 32 | ||
34 | /* | 33 | /* |
35 | * The ARTOP has 33 Mhz and "over clocked" timing tables. Until we | 34 | * The ARTOP has 33 Mhz and "over clocked" timing tables. Until we |
@@ -283,6 +282,31 @@ static void artop6260_set_dmamode (struct ata_port *ap, struct ata_device *adev) | |||
283 | pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra); | 282 | pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra); |
284 | } | 283 | } |
285 | 284 | ||
285 | /** | ||
286 | * artop_6210_qc_defer - implement serialization | ||
287 | * @qc: command | ||
288 | * | ||
289 | * Issue commands per host on this chip. | ||
290 | */ | ||
291 | |||
292 | static int artop6210_qc_defer(struct ata_queued_cmd *qc) | ||
293 | { | ||
294 | struct ata_host *host = qc->ap->host; | ||
295 | struct ata_port *alt = host->ports[1 ^ qc->ap->port_no]; | ||
296 | int rc; | ||
297 | |||
298 | /* First apply the usual rules */ | ||
299 | rc = ata_std_qc_defer(qc); | ||
300 | if (rc != 0) | ||
301 | return rc; | ||
302 | |||
303 | /* Now apply serialization rules. Only allow a command if the | ||
304 | other channel state machine is idle */ | ||
305 | if (alt && alt->qc_active) | ||
306 | return ATA_DEFER_PORT; | ||
307 | return 0; | ||
308 | } | ||
309 | |||
286 | static struct scsi_host_template artop_sht = { | 310 | static struct scsi_host_template artop_sht = { |
287 | ATA_BMDMA_SHT(DRV_NAME), | 311 | ATA_BMDMA_SHT(DRV_NAME), |
288 | }; | 312 | }; |
@@ -293,6 +317,7 @@ static struct ata_port_operations artop6210_ops = { | |||
293 | .set_piomode = artop6210_set_piomode, | 317 | .set_piomode = artop6210_set_piomode, |
294 | .set_dmamode = artop6210_set_dmamode, | 318 | .set_dmamode = artop6210_set_dmamode, |
295 | .prereset = artop6210_pre_reset, | 319 | .prereset = artop6210_pre_reset, |
320 | .qc_defer = artop6210_qc_defer, | ||
296 | }; | 321 | }; |
297 | 322 | ||
298 | static struct ata_port_operations artop6260_ops = { | 323 | static struct ata_port_operations artop6260_ops = { |
@@ -323,29 +348,29 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id) | |||
323 | static int printed_version; | 348 | static int printed_version; |
324 | static const struct ata_port_info info_6210 = { | 349 | static const struct ata_port_info info_6210 = { |
325 | .flags = ATA_FLAG_SLAVE_POSS, | 350 | .flags = ATA_FLAG_SLAVE_POSS, |
326 | .pio_mask = 0x1f, /* pio0-4 */ | 351 | .pio_mask = ATA_PIO4, |
327 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 352 | .mwdma_mask = ATA_MWDMA2, |
328 | .udma_mask = ATA_UDMA2, | 353 | .udma_mask = ATA_UDMA2, |
329 | .port_ops = &artop6210_ops, | 354 | .port_ops = &artop6210_ops, |
330 | }; | 355 | }; |
331 | static const struct ata_port_info info_626x = { | 356 | static const struct ata_port_info info_626x = { |
332 | .flags = ATA_FLAG_SLAVE_POSS, | 357 | .flags = ATA_FLAG_SLAVE_POSS, |
333 | .pio_mask = 0x1f, /* pio0-4 */ | 358 | .pio_mask = ATA_PIO4, |
334 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 359 | .mwdma_mask = ATA_MWDMA2, |
335 | .udma_mask = ATA_UDMA4, | 360 | .udma_mask = ATA_UDMA4, |
336 | .port_ops = &artop6260_ops, | 361 | .port_ops = &artop6260_ops, |
337 | }; | 362 | }; |
338 | static const struct ata_port_info info_628x = { | 363 | static const struct ata_port_info info_628x = { |
339 | .flags = ATA_FLAG_SLAVE_POSS, | 364 | .flags = ATA_FLAG_SLAVE_POSS, |
340 | .pio_mask = 0x1f, /* pio0-4 */ | 365 | .pio_mask = ATA_PIO4, |
341 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 366 | .mwdma_mask = ATA_MWDMA2, |
342 | .udma_mask = ATA_UDMA5, | 367 | .udma_mask = ATA_UDMA5, |
343 | .port_ops = &artop6260_ops, | 368 | .port_ops = &artop6260_ops, |
344 | }; | 369 | }; |
345 | static const struct ata_port_info info_628x_fast = { | 370 | static const struct ata_port_info info_628x_fast = { |
346 | .flags = ATA_FLAG_SLAVE_POSS, | 371 | .flags = ATA_FLAG_SLAVE_POSS, |
347 | .pio_mask = 0x1f, /* pio0-4 */ | 372 | .pio_mask = ATA_PIO4, |
348 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 373 | .mwdma_mask = ATA_MWDMA2, |
349 | .udma_mask = ATA_UDMA6, | 374 | .udma_mask = ATA_UDMA6, |
350 | .port_ops = &artop6260_ops, | 375 | .port_ops = &artop6260_ops, |
351 | }; | 376 | }; |
@@ -362,12 +387,8 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id) | |||
362 | 387 | ||
363 | if (id->driver_data == 0) { /* 6210 variant */ | 388 | if (id->driver_data == 0) { /* 6210 variant */ |
364 | ppi[0] = &info_6210; | 389 | ppi[0] = &info_6210; |
365 | ppi[1] = &ata_dummy_port_info; | ||
366 | /* BIOS may have left us in UDMA, clear it before libata probe */ | 390 | /* BIOS may have left us in UDMA, clear it before libata probe */ |
367 | pci_write_config_byte(pdev, 0x54, 0); | 391 | pci_write_config_byte(pdev, 0x54, 0); |
368 | /* For the moment (also lacks dsc) */ | ||
369 | printk(KERN_WARNING "ARTOP 6210 requires serialize functionality not yet supported by libata.\n"); | ||
370 | printk(KERN_WARNING "Secondary ATA ports will not be activated.\n"); | ||
371 | } | 392 | } |
372 | else if (id->driver_data == 1) /* 6260 */ | 393 | else if (id->driver_data == 1) /* 6260 */ |
373 | ppi[0] = &info_626x; | 394 | ppi[0] = &info_626x; |