Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: (35 commits)
  [libata] Improve timeout handling
  [libata] Drain data on errors
  pata_sc1200: Activate secondary channel
  pata_artop: Serializing support
  [libata] ahci: correct enclosure LED state save
  [libata] More robust parsing for IDENTIFY DEVICE multi_count field
  sata_mv: fix LED blinking for SoC+NCQ
  sata_mv: optimize IRQ coalescing for 8-port chips
  sata_mv: implement IRQ coalescing (v2)
  sata_mv: cosmetic preparations for IRQ coalescing
  pata-rb532-cf: platform_get_irq() fix ignored failure
  pata_efar: fix *dma_mask
  pata_radisys: fix mwdma_mask to exclude mwdma0
  [libata] convert drivers to use ata.h mode mask defines
  include/linux/ata.h: add some more transfer masks
  ahci: Blacklist HP Compaq 6720s that spins off disks during ACPI power off
  [libata] sata_mv: Implement direct FIS transmission via mv_qc_issue_fis().
  [libata] Export ata_pio_queue_task() so that it can be used from sata_mv.
  [libata] sata_mv: Add a new mv_sff_check_status() function to sata_mv.
  [libata] sata_mv: Tighten up interrupt masking in mv_qc_issue()
  ...
This commit is contained in:
Linus Torvalds 2009-03-26 11:20:23 -07:00
Родитель 61a091827e c96f1732e2
Коммит 0384e29591
78 изменённых файлов: 1329 добавлений и 541 удалений

Просмотреть файл

@ -404,7 +404,7 @@ static const struct ata_port_info ahci_port_info[] = {
/* board_ahci */ /* board_ahci */
{ {
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
@ -412,7 +412,7 @@ static const struct ata_port_info ahci_port_info[] = {
{ {
AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP), AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP),
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_vt8251_ops, .port_ops = &ahci_vt8251_ops,
}, },
@ -420,7 +420,7 @@ static const struct ata_port_info ahci_port_info[] = {
{ {
AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR), AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
@ -430,7 +430,7 @@ static const struct ata_port_info ahci_port_info[] = {
AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_MSI | AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_MSI |
AHCI_HFLAG_SECT255), AHCI_HFLAG_SECT255),
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_sb600_ops, .port_ops = &ahci_sb600_ops,
}, },
@ -440,7 +440,7 @@ static const struct ata_port_info ahci_port_info[] = {
AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP), AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP),
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA, ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
@ -448,7 +448,7 @@ static const struct ata_port_info ahci_port_info[] = {
{ {
AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL), AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL),
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_sb600_ops, .port_ops = &ahci_sb600_ops,
}, },
@ -456,7 +456,7 @@ static const struct ata_port_info ahci_port_info[] = {
{ {
AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ), AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ),
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
@ -464,7 +464,7 @@ static const struct ata_port_info ahci_port_info[] = {
{ {
AHCI_HFLAGS (AHCI_HFLAG_NO_PMP), AHCI_HFLAGS (AHCI_HFLAG_NO_PMP),
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
@ -1348,7 +1348,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
writel(message[1], mmio + hpriv->em_loc+4); writel(message[1], mmio + hpriv->em_loc+4);
/* save off new led state for port/slot */ /* save off new led state for port/slot */
emp->led_state = message[1]; emp->led_state = state;
/* /*
* tell hardware to transmit the message * tell hardware to transmit the message
@ -2565,6 +2565,15 @@ static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
/* PCI slot number of the controller */ /* PCI slot number of the controller */
.driver_data = (void *)0x1FUL, .driver_data = (void *)0x1FUL,
}, },
{
.ident = "HP Compaq 6720s",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6720s"),
},
/* PCI slot number of the controller */
.driver_data = (void *)0x1FUL,
},
{ } /* terminate list */ { } /* terminate list */
}; };
@ -2647,8 +2656,8 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (board_id == board_ahci_sb700 && pdev->revision >= 0x40) if (board_id == board_ahci_sb700 && pdev->revision >= 0x40)
hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL; hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL;
if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) if (!(hpriv->flags & AHCI_HFLAG_NO_MSI))
pci_intx(pdev, 1); pci_enable_msi(pdev);
/* save initial config */ /* save initial config */
ahci_save_initial_config(pdev, hpriv); ahci_save_initial_config(pdev, hpriv);

Просмотреть файл

@ -118,8 +118,8 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
u16 command; u16 command;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &generic_port_ops .port_ops = &generic_port_ops
}; };

Просмотреть файл

@ -446,34 +446,34 @@ static struct ata_port_info piix_port_info[] = {
[piix_pata_mwdma] = /* PIIX3 MWDMA only */ [piix_pata_mwdma] = /* PIIX3 MWDMA only */
{ {
.flags = PIIX_PATA_FLAGS, .flags = PIIX_PATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ .mwdma_mask = ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
.port_ops = &piix_pata_ops, .port_ops = &piix_pata_ops,
}, },
[piix_pata_33] = /* PIIX4 at 33MHz */ [piix_pata_33] = /* PIIX4 at 33MHz */
{ {
.flags = PIIX_PATA_FLAGS, .flags = PIIX_PATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ .mwdma_mask = ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
.udma_mask = ATA_UDMA_MASK_40C, .udma_mask = ATA_UDMA2,
.port_ops = &piix_pata_ops, .port_ops = &piix_pata_ops,
}, },
[ich_pata_33] = /* ICH0 - ICH at 33Mhz*/ [ich_pata_33] = /* ICH0 - ICH at 33Mhz*/
{ {
.flags = PIIX_PATA_FLAGS, .flags = PIIX_PATA_FLAGS,
.pio_mask = 0x1f, /* pio 0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* Check: maybe 0x07 */ .mwdma_mask = ATA_MWDMA12_ONLY, /* Check: maybe MWDMA0 is ok */
.udma_mask = ATA_UDMA2, /* UDMA33 */ .udma_mask = ATA_UDMA2,
.port_ops = &ich_pata_ops, .port_ops = &ich_pata_ops,
}, },
[ich_pata_66] = /* ICH controllers up to 66MHz */ [ich_pata_66] = /* ICH controllers up to 66MHz */
{ {
.flags = PIIX_PATA_FLAGS, .flags = PIIX_PATA_FLAGS,
.pio_mask = 0x1f, /* pio 0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* MWDMA0 is broken on chip */ .mwdma_mask = ATA_MWDMA12_ONLY, /* MWDMA0 is broken on chip */
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &ich_pata_ops, .port_ops = &ich_pata_ops,
}, },
@ -481,17 +481,17 @@ static struct ata_port_info piix_port_info[] = {
[ich_pata_100] = [ich_pata_100] =
{ {
.flags = PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR, .flags = PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* mwdma1-2 */ .mwdma_mask = ATA_MWDMA12_ONLY,
.udma_mask = ATA_UDMA5, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &ich_pata_ops, .port_ops = &ich_pata_ops,
}, },
[ich5_sata] = [ich5_sata] =
{ {
.flags = PIIX_SATA_FLAGS, .flags = PIIX_SATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -499,8 +499,8 @@ static struct ata_port_info piix_port_info[] = {
[ich6_sata] = [ich6_sata] =
{ {
.flags = PIIX_SATA_FLAGS, .flags = PIIX_SATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -508,8 +508,8 @@ static struct ata_port_info piix_port_info[] = {
[ich6m_sata] = [ich6m_sata] =
{ {
.flags = PIIX_SATA_FLAGS, .flags = PIIX_SATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -517,8 +517,8 @@ static struct ata_port_info piix_port_info[] = {
[ich8_sata] = [ich8_sata] =
{ {
.flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR, .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -526,8 +526,8 @@ static struct ata_port_info piix_port_info[] = {
[ich8_2port_sata] = [ich8_2port_sata] =
{ {
.flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR, .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -535,8 +535,8 @@ static struct ata_port_info piix_port_info[] = {
[tolapai_sata] = [tolapai_sata] =
{ {
.flags = PIIX_SATA_FLAGS, .flags = PIIX_SATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -544,8 +544,8 @@ static struct ata_port_info piix_port_info[] = {
[ich8m_apple_sata] = [ich8m_apple_sata] =
{ {
.flags = PIIX_SATA_FLAGS, .flags = PIIX_SATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
@ -553,9 +553,9 @@ static struct ata_port_info piix_port_info[] = {
[piix_pata_vmw] = [piix_pata_vmw] =
{ {
.flags = PIIX_PATA_FLAGS, .flags = PIIX_PATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ .mwdma_mask = ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
.udma_mask = ATA_UDMA_MASK_40C, .udma_mask = ATA_UDMA2,
.port_ops = &piix_vmw_ops, .port_ops = &piix_vmw_ops,
}, },

Просмотреть файл

@ -57,6 +57,7 @@
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/async.h> #include <linux/async.h>
#include <linux/log2.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
@ -2389,6 +2390,7 @@ int ata_dev_configure(struct ata_device *dev)
dev->cylinders = 0; dev->cylinders = 0;
dev->heads = 0; dev->heads = 0;
dev->sectors = 0; dev->sectors = 0;
dev->multi_count = 0;
/* /*
* common ATA, ATAPI feature tests * common ATA, ATAPI feature tests
@ -2426,8 +2428,15 @@ int ata_dev_configure(struct ata_device *dev)
dev->n_sectors = ata_id_n_sectors(id); dev->n_sectors = ata_id_n_sectors(id);
if (dev->id[59] & 0x100) /* get current R/W Multiple count setting */
dev->multi_count = dev->id[59] & 0xff; if ((dev->id[47] >> 8) == 0x80 && (dev->id[59] & 0x100)) {
unsigned int max = dev->id[47] & 0xff;
unsigned int cnt = dev->id[59] & 0xff;
/* only recognize/allow powers of two here */
if (is_power_of_2(max) && is_power_of_2(cnt))
if (cnt <= max)
dev->multi_count = cnt;
}
if (ata_id_has_lba(id)) { if (ata_id_has_lba(id)) {
const char *lba_desc; const char *lba_desc;
@ -6709,6 +6718,7 @@ EXPORT_SYMBOL_GPL(ata_id_c_string);
EXPORT_SYMBOL_GPL(ata_do_dev_read_id); EXPORT_SYMBOL_GPL(ata_do_dev_read_id);
EXPORT_SYMBOL_GPL(ata_scsi_simulate); EXPORT_SYMBOL_GPL(ata_scsi_simulate);
EXPORT_SYMBOL_GPL(ata_pio_queue_task);
EXPORT_SYMBOL_GPL(ata_pio_need_iordy); EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
EXPORT_SYMBOL_GPL(ata_timing_find_mode); EXPORT_SYMBOL_GPL(ata_timing_find_mode);
EXPORT_SYMBOL_GPL(ata_timing_compute); EXPORT_SYMBOL_GPL(ata_timing_compute);

Просмотреть файл

@ -547,7 +547,7 @@ void ata_scsi_error(struct Scsi_Host *host)
/* For new EH, all qcs are finished in one of three ways - /* For new EH, all qcs are finished in one of three ways -
* normal completion, error completion, and SCSI timeout. * normal completion, error completion, and SCSI timeout.
* Both cmpletions can race against SCSI timeout. When normal * Both completions can race against SCSI timeout. When normal
* completion wins, the qc never reaches EH. When error * completion wins, the qc never reaches EH. When error
* completion wins, the qc has ATA_QCFLAG_FAILED set. * completion wins, the qc has ATA_QCFLAG_FAILED set.
* *
@ -562,7 +562,19 @@ void ata_scsi_error(struct Scsi_Host *host)
int nr_timedout = 0; int nr_timedout = 0;
spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags);
/* This must occur under the ap->lock as we don't want
a polled recovery to race the real interrupt handler
The lost_interrupt handler checks for any completed but
non-notified command and completes much like an IRQ handler.
We then fall into the error recovery code which will treat
this as if normal completion won the race */
if (ap->ops->lost_interrupt)
ap->ops->lost_interrupt(ap);
list_for_each_entry_safe(scmd, tmp, &host->eh_cmd_q, eh_entry) { list_for_each_entry_safe(scmd, tmp, &host->eh_cmd_q, eh_entry) {
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
@ -606,6 +618,9 @@ void ata_scsi_error(struct Scsi_Host *host)
ap->eh_tries = ATA_EH_MAX_TRIES; ap->eh_tries = ATA_EH_MAX_TRIES;
} else } else
spin_unlock_wait(ap->lock); spin_unlock_wait(ap->lock);
/* If we timed raced normal completion and there is nothing to
recover nr_timedout == 0 why exactly are we doing error recovery ? */
repeat: repeat:
/* invoke error handler */ /* invoke error handler */

Просмотреть файл

@ -52,6 +52,7 @@ const struct ata_port_operations ata_sff_port_ops = {
.softreset = ata_sff_softreset, .softreset = ata_sff_softreset,
.hardreset = sata_sff_hardreset, .hardreset = sata_sff_hardreset,
.postreset = ata_sff_postreset, .postreset = ata_sff_postreset,
.drain_fifo = ata_sff_drain_fifo,
.error_handler = ata_sff_error_handler, .error_handler = ata_sff_error_handler,
.post_internal_cmd = ata_sff_post_internal_cmd, .post_internal_cmd = ata_sff_post_internal_cmd,
@ -64,6 +65,8 @@ const struct ata_port_operations ata_sff_port_ops = {
.sff_irq_on = ata_sff_irq_on, .sff_irq_on = ata_sff_irq_on,
.sff_irq_clear = ata_sff_irq_clear, .sff_irq_clear = ata_sff_irq_clear,
.lost_interrupt = ata_sff_lost_interrupt,
.port_start = ata_sff_port_start, .port_start = ata_sff_port_start,
}; };
EXPORT_SYMBOL_GPL(ata_sff_port_ops); EXPORT_SYMBOL_GPL(ata_sff_port_ops);
@ -1646,7 +1649,7 @@ EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf);
* RETURNS: * RETURNS:
* One if interrupt was handled, zero if not (shared irq). * One if interrupt was handled, zero if not (shared irq).
*/ */
inline unsigned int ata_sff_host_intr(struct ata_port *ap, unsigned int ata_sff_host_intr(struct ata_port *ap,
struct ata_queued_cmd *qc) struct ata_queued_cmd *qc)
{ {
struct ata_eh_info *ehi = &ap->link.eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
@ -1774,6 +1777,48 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)
} }
EXPORT_SYMBOL_GPL(ata_sff_interrupt); EXPORT_SYMBOL_GPL(ata_sff_interrupt);
/**
* ata_sff_lost_interrupt - Check for an apparent lost interrupt
* @ap: port that appears to have timed out
*
* Called from the libata error handlers when the core code suspects
* an interrupt has been lost. If it has complete anything we can and
* then return. Interface must support altstatus for this faster
* recovery to occur.
*
* Locking:
* Caller holds host lock
*/
void ata_sff_lost_interrupt(struct ata_port *ap)
{
u8 status;
struct ata_queued_cmd *qc;
/* Only one outstanding command per SFF channel */
qc = ata_qc_from_tag(ap, ap->link.active_tag);
/* Check we have a live one.. */
if (qc == NULL || !(qc->flags & ATA_QCFLAG_ACTIVE))
return;
/* We cannot lose an interrupt on a polled command */
if (qc->tf.flags & ATA_TFLAG_POLLING)
return;
/* See if the controller thinks it is still busy - if so the command
isn't a lost IRQ but is still in progress */
status = ata_sff_altstatus(ap);
if (status & ATA_BUSY)
return;
/* There was a command running, we are no longer busy and we have
no interrupt. */
ata_port_printk(ap, KERN_WARNING, "lost interrupt (Status 0x%x)\n",
status);
/* Run the host interrupt logic as if the interrupt had not been
lost */
ata_sff_host_intr(ap, qc);
}
EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
/** /**
* ata_sff_freeze - Freeze SFF controller port * ata_sff_freeze - Freeze SFF controller port
* @ap: port to freeze * @ap: port to freeze
@ -2198,6 +2243,39 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
} }
EXPORT_SYMBOL_GPL(ata_sff_postreset); EXPORT_SYMBOL_GPL(ata_sff_postreset);
/**
* ata_sff_drain_fifo - Stock FIFO drain logic for SFF controllers
* @qc: command
*
* Drain the FIFO and device of any stuck data following a command
* failing to complete. In some cases this is neccessary before a
* reset will recover the device.
*
*/
void ata_sff_drain_fifo(struct ata_queued_cmd *qc)
{
int count;
struct ata_port *ap;
/* We only need to flush incoming data when a command was running */
if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE)
return;
ap = qc->ap;
/* Drain up to 64K of data before we give up this recovery method */
for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
&& count < 32768; count++)
ioread16(ap->ioaddr.data_addr);
/* Can become DEBUG later */
if (count)
ata_port_printk(ap, KERN_DEBUG,
"drained %d bytes to clear DRQ.\n", count);
}
EXPORT_SYMBOL_GPL(ata_sff_drain_fifo);
/** /**
* ata_sff_error_handler - Stock error handler for BMDMA controller * ata_sff_error_handler - Stock error handler for BMDMA controller
* @ap: port to handle error for * @ap: port to handle error for
@ -2239,7 +2317,8 @@ void ata_sff_error_handler(struct ata_port *ap)
* really a timeout event, adjust error mask and * really a timeout event, adjust error mask and
* cancel frozen state. * cancel frozen state.
*/ */
if (qc->err_mask == AC_ERR_TIMEOUT && (host_stat & ATA_DMA_ERR)) { if (qc->err_mask == AC_ERR_TIMEOUT
&& (host_stat & ATA_DMA_ERR)) {
qc->err_mask = AC_ERR_HOST_BUS; qc->err_mask = AC_ERR_HOST_BUS;
thaw = 1; thaw = 1;
} }
@ -2250,6 +2329,13 @@ void ata_sff_error_handler(struct ata_port *ap)
ata_sff_sync(ap); /* FIXME: We don't need this */ ata_sff_sync(ap); /* FIXME: We don't need this */
ap->ops->sff_check_status(ap); ap->ops->sff_check_status(ap);
ap->ops->sff_irq_clear(ap); ap->ops->sff_irq_clear(ap);
/* We *MUST* do FIFO draining before we issue a reset as several
* devices helpfully clear their internal state and will lock solid
* if we touch the data port post reset. Pass qc in case anyone wants
* to do different PIO/DMA recovery or has per command fixups
*/
if (ap->ops->drain_fifo)
ap->ops->drain_fifo(qc);
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
@ -2959,4 +3045,3 @@ out:
EXPORT_SYMBOL_GPL(ata_pci_sff_init_one); EXPORT_SYMBOL_GPL(ata_pci_sff_init_one);
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */

Просмотреть файл

@ -79,8 +79,6 @@ extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
u64 block, u32 n_block, unsigned int tf_flags, u64 block, u32 n_block, unsigned int tf_flags,
unsigned int tag); unsigned int tag);
extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev); extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev);
extern void ata_pio_queue_task(struct ata_port *ap, void *data,
unsigned long delay);
extern void ata_port_flush_task(struct ata_port *ap); extern void ata_port_flush_task(struct ata_port *ap);
extern unsigned ata_exec_internal(struct ata_device *dev, extern unsigned ata_exec_internal(struct ata_device *dev,
struct ata_taskfile *tf, const u8 *cdb, struct ata_taskfile *tf, const u8 *cdb,

Просмотреть файл

@ -246,9 +246,9 @@ static int pacpi_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &pacpi_ops, .port_ops = &pacpi_ops,
}; };

Просмотреть файл

@ -492,53 +492,53 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info_early = { static const struct ata_port_info info_early = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &ali_early_port_ops .port_ops = &ali_early_port_ops
}; };
/* Revision 0x20 added DMA */ /* Revision 0x20 added DMA */
static const struct ata_port_info info_20 = { static const struct ata_port_info info_20 = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &ali_20_port_ops .port_ops = &ali_20_port_ops
}; };
/* Revision 0x20 with support logic added UDMA */ /* Revision 0x20 with support logic added UDMA */
static const struct ata_port_info info_20_udma = { static const struct ata_port_info info_20_udma = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, /* UDMA33 */ .udma_mask = ATA_UDMA2,
.port_ops = &ali_20_port_ops .port_ops = &ali_20_port_ops
}; };
/* Revision 0xC2 adds UDMA66 */ /* Revision 0xC2 adds UDMA66 */
static const struct ata_port_info info_c2 = { static const struct ata_port_info info_c2 = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &ali_c2_port_ops .port_ops = &ali_c2_port_ops
}; };
/* Revision 0xC3 is UDMA66 for now */ /* Revision 0xC3 is UDMA66 for now */
static const struct ata_port_info info_c3 = { static const struct ata_port_info info_c3 = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &ali_c2_port_ops .port_ops = &ali_c2_port_ops
}; };
/* Revision 0xC4 is UDMA100 */ /* Revision 0xC4 is UDMA100 */
static const struct ata_port_info info_c4 = { static const struct ata_port_info info_c4 = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &ali_c4_port_ops .port_ops = &ali_c4_port_ops
}; };
/* Revision 0xC5 is UDMA133 with LBA48 DMA */ /* Revision 0xC5 is UDMA133 with LBA48 DMA */
static const struct ata_port_info info_c5 = { static const struct ata_port_info info_c5 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &ali_c5_port_ops .port_ops = &ali_c5_port_ops
}; };

Просмотреть файл

@ -455,74 +455,74 @@ static void amd_clear_fifo(struct pci_dev *pdev)
static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info[10] = { static const struct ata_port_info info[10] = {
{ /* 0: AMD 7401 */ { /* 0: AMD 7401 - no swdma */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* No SWDMA */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, /* UDMA 33 */ .udma_mask = ATA_UDMA2,
.port_ops = &amd33_port_ops .port_ops = &amd33_port_ops
}, },
{ /* 1: Early AMD7409 - no swdma */ { /* 1: Early AMD7409 - no swdma */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, /* UDMA 66 */ .udma_mask = ATA_UDMA4,
.port_ops = &amd66_port_ops .port_ops = &amd66_port_ops
}, },
{ /* 2: AMD 7409, no swdma errata */ { /* 2: AMD 7409 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, /* UDMA 66 */ .udma_mask = ATA_UDMA4,
.port_ops = &amd66_port_ops .port_ops = &amd66_port_ops
}, },
{ /* 3: AMD 7411 */ { /* 3: AMD 7411 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* UDMA 100 */ .udma_mask = ATA_UDMA5,
.port_ops = &amd100_port_ops .port_ops = &amd100_port_ops
}, },
{ /* 4: AMD 7441 */ { /* 4: AMD 7441 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* UDMA 100 */ .udma_mask = ATA_UDMA5,
.port_ops = &amd100_port_ops .port_ops = &amd100_port_ops
}, },
{ /* 5: AMD 8111*/ { /* 5: AMD 8111 - no swdma */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, /* UDMA 133, no swdma */ .udma_mask = ATA_UDMA6,
.port_ops = &amd133_port_ops .port_ops = &amd133_port_ops
}, },
{ /* 6: AMD 8111 UDMA 100 (Serenade) */ { /* 6: AMD 8111 UDMA 100 (Serenade) - no swdma */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* UDMA 100, no swdma */ .udma_mask = ATA_UDMA5,
.port_ops = &amd133_port_ops .port_ops = &amd133_port_ops
}, },
{ /* 7: Nvidia Nforce */ { /* 7: Nvidia Nforce */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* UDMA 100 */ .udma_mask = ATA_UDMA5,
.port_ops = &nv100_port_ops .port_ops = &nv100_port_ops
}, },
{ /* 8: Nvidia Nforce2 and later */ { /* 8: Nvidia Nforce2 and later - no swdma */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, /* UDMA 133, no swdma */ .udma_mask = ATA_UDMA6,
.port_ops = &nv133_port_ops .port_ops = &nv133_port_ops
}, },
{ /* 9: AMD CS5536 (Geode companion) */ { /* 9: AMD CS5536 (Geode companion) */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* UDMA 100 */ .udma_mask = ATA_UDMA5,
.port_ops = &amd100_port_ops .port_ops = &amd100_port_ops
} }
}; };

Просмотреть файл

@ -12,7 +12,6 @@
* performance Alessandro Zummo <alessandro.zummo@towertech.it> * performance Alessandro Zummo <alessandro.zummo@towertech.it>
* *
* TODO * TODO
* 850 serialization once the core supports it
* Investigate no_dsc on 850R * Investigate no_dsc on 850R
* Clock detect * Clock detect
*/ */
@ -29,7 +28,7 @@
#include <linux/ata.h> #include <linux/ata.h>
#define DRV_NAME "pata_artop" #define DRV_NAME "pata_artop"
#define DRV_VERSION "0.4.4" #define DRV_VERSION "0.4.5"
/* /*
* The ARTOP has 33 Mhz and "over clocked" timing tables. Until we * 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)
pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra); pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra);
} }
/**
* artop_6210_qc_defer - implement serialization
* @qc: command
*
* Issue commands per host on this chip.
*/
static int artop6210_qc_defer(struct ata_queued_cmd *qc)
{
struct ata_host *host = qc->ap->host;
struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
int rc;
/* First apply the usual rules */
rc = ata_std_qc_defer(qc);
if (rc != 0)
return rc;
/* Now apply serialization rules. Only allow a command if the
other channel state machine is idle */
if (alt && alt->qc_active)
return ATA_DEFER_PORT;
return 0;
}
static struct scsi_host_template artop_sht = { static struct scsi_host_template artop_sht = {
ATA_BMDMA_SHT(DRV_NAME), ATA_BMDMA_SHT(DRV_NAME),
}; };
@ -293,6 +317,7 @@ static struct ata_port_operations artop6210_ops = {
.set_piomode = artop6210_set_piomode, .set_piomode = artop6210_set_piomode,
.set_dmamode = artop6210_set_dmamode, .set_dmamode = artop6210_set_dmamode,
.prereset = artop6210_pre_reset, .prereset = artop6210_pre_reset,
.qc_defer = artop6210_qc_defer,
}; };
static struct ata_port_operations artop6260_ops = { 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)
static int printed_version; static int printed_version;
static const struct ata_port_info info_6210 = { static const struct ata_port_info info_6210 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
.port_ops = &artop6210_ops, .port_ops = &artop6210_ops,
}; };
static const struct ata_port_info info_626x = { static const struct ata_port_info info_626x = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &artop6260_ops, .port_ops = &artop6260_ops,
}; };
static const struct ata_port_info info_628x = { static const struct ata_port_info info_628x = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &artop6260_ops, .port_ops = &artop6260_ops,
}; };
static const struct ata_port_info info_628x_fast = { static const struct ata_port_info info_628x_fast = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &artop6260_ops, .port_ops = &artop6260_ops,
}; };
@ -362,12 +387,8 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
if (id->driver_data == 0) { /* 6210 variant */ if (id->driver_data == 0) { /* 6210 variant */
ppi[0] = &info_6210; ppi[0] = &info_6210;
ppi[1] = &ata_dummy_port_info;
/* BIOS may have left us in UDMA, clear it before libata probe */ /* BIOS may have left us in UDMA, clear it before libata probe */
pci_write_config_byte(pdev, 0x54, 0); pci_write_config_byte(pdev, 0x54, 0);
/* For the moment (also lacks dsc) */
printk(KERN_WARNING "ARTOP 6210 requires serialize functionality not yet supported by libata.\n");
printk(KERN_WARNING "Secondary ATA ports will not be activated.\n");
} }
else if (id->driver_data == 1) /* 6260 */ else if (id->driver_data == 1) /* 6260 */
ppi[0] = &info_626x; ppi[0] = &info_626x;

Просмотреть файл

@ -67,7 +67,9 @@
* *
* Alter PIO_MASK below according to table to set maximal PIO mode. * Alter PIO_MASK below according to table to set maximal PIO mode.
*/ */
#define PIO_MASK (0x1f) enum {
PIO_MASK = ATA_PIO4,
};
/* /*
* Struct containing private information about device. * Struct containing private information about device.

Просмотреть файл

@ -220,9 +220,9 @@ static int atiixp_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x06, /* No MWDMA0 support */ .mwdma_mask = ATA_MWDMA12_ONLY,
.udma_mask = 0x3F, .udma_mask = ATA_UDMA5,
.port_ops = &atiixp_port_ops .port_ops = &atiixp_port_ops
}; };
static const struct pci_bits atiixp_enable_bits[] = { static const struct pci_bits atiixp_enable_bits[] = {

Просмотреть файл

@ -1502,7 +1502,7 @@ static struct ata_port_info bfin_port_info[] = {
.flags = ATA_FLAG_SLAVE_POSS .flags = ATA_FLAG_SLAVE_POSS
| ATA_FLAG_MMIO | ATA_FLAG_MMIO
| ATA_FLAG_NO_LEGACY, | ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0, .mwdma_mask = 0,
.udma_mask = 0, .udma_mask = 0,
.port_ops = &bfin_pata_ops, .port_ops = &bfin_pata_ops,

Просмотреть файл

@ -211,7 +211,7 @@ static int cmd640_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &cmd640_port_ops .port_ops = &cmd640_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -299,40 +299,40 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
static const struct ata_port_info cmd_info[6] = { static const struct ata_port_info cmd_info[6] = {
{ /* CMD 643 - no UDMA */ { /* CMD 643 - no UDMA */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &cmd64x_port_ops .port_ops = &cmd64x_port_ops
}, },
{ /* CMD 646 with broken UDMA */ { /* CMD 646 with broken UDMA */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &cmd64x_port_ops .port_ops = &cmd64x_port_ops
}, },
{ /* CMD 646 with working UDMA */ { /* CMD 646 with working UDMA */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
.port_ops = &cmd64x_port_ops .port_ops = &cmd64x_port_ops
}, },
{ /* CMD 646 rev 1 */ { /* CMD 646 rev 1 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &cmd646r1_port_ops .port_ops = &cmd646r1_port_ops
}, },
{ /* CMD 648 */ { /* CMD 648 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &cmd648_port_ops .port_ops = &cmd648_port_ops
}, },
{ /* CMD 649 */ { /* CMD 649 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &cmd648_port_ops .port_ops = &cmd648_port_ops
} }

Просмотреть файл

@ -158,7 +158,7 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi
static const unsigned int ctl_port[] = { 0x3F6, 0x376 }; static const unsigned int ctl_port[] = { 0x3F6, 0x376 };
struct ata_port_info pi = { struct ata_port_info pi = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &cs5520_port_ops, .port_ops = &cs5520_port_ops,
}; };
const struct ata_port_info *ppi[2]; const struct ata_port_info *ppi[2];

Просмотреть файл

@ -298,15 +298,15 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, .udma_mask = ATA_UDMA2,
.port_ops = &cs5530_port_ops .port_ops = &cs5530_port_ops
}; };
/* The docking connector doesn't do UDMA, and it seems not MWDMA */ /* The docking connector doesn't do UDMA, and it seems not MWDMA */
static const struct ata_port_info info_palmax_secondary = { static const struct ata_port_info info_palmax_secondary = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &cs5530_port_ops .port_ops = &cs5530_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -181,8 +181,8 @@ static int cs5535_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &cs5535_port_ops .port_ops = &cs5535_port_ops
}; };

Просмотреть файл

@ -241,8 +241,8 @@ static int cs5536_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &cs5536_port_ops, .port_ops = &cs5536_port_ops,
}; };

Просмотреть файл

@ -124,8 +124,8 @@ static int cy82c693_init_one(struct pci_dev *pdev, const struct pci_device_id *i
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &cy82c693_port_ops .port_ops = &cy82c693_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info }; const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info };

Просмотреть файл

@ -251,9 +251,9 @@ static int efar_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma1-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x0f, /* UDMA 66 */ .udma_mask = ATA_UDMA4,
.port_ops = &efar_ops, .port_ops = &efar_ops,
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -336,8 +336,8 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info_hpt366 = { static const struct ata_port_info info_hpt366 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &hpt366_port_ops .port_ops = &hpt366_port_ops
}; };

Просмотреть файл

@ -753,55 +753,55 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* HPT370 - UDMA100 */ /* HPT370 - UDMA100 */
static const struct ata_port_info info_hpt370 = { static const struct ata_port_info info_hpt370 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &hpt370_port_ops .port_ops = &hpt370_port_ops
}; };
/* HPT370A - UDMA100 */ /* HPT370A - UDMA100 */
static const struct ata_port_info info_hpt370a = { static const struct ata_port_info info_hpt370a = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &hpt370a_port_ops .port_ops = &hpt370a_port_ops
}; };
/* HPT370 - UDMA100 */ /* HPT370 - UDMA100 */
static const struct ata_port_info info_hpt370_33 = { static const struct ata_port_info info_hpt370_33 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &hpt370_port_ops .port_ops = &hpt370_port_ops
}; };
/* HPT370A - UDMA100 */ /* HPT370A - UDMA100 */
static const struct ata_port_info info_hpt370a_33 = { static const struct ata_port_info info_hpt370a_33 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &hpt370a_port_ops .port_ops = &hpt370a_port_ops
}; };
/* HPT371, 372 and friends - UDMA133 */ /* HPT371, 372 and friends - UDMA133 */
static const struct ata_port_info info_hpt372 = { static const struct ata_port_info info_hpt372 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &hpt372_port_ops .port_ops = &hpt372_port_ops
}; };
/* HPT374 - UDMA100, function 1 uses different prereset method */ /* HPT374 - UDMA100, function 1 uses different prereset method */
static const struct ata_port_info info_hpt374_fn0 = { static const struct ata_port_info info_hpt374_fn0 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &hpt372_port_ops .port_ops = &hpt372_port_ops
}; };
static const struct ata_port_info info_hpt374_fn1 = { static const struct ata_port_info info_hpt374_fn1 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &hpt374_fn1_port_ops .port_ops = &hpt374_fn1_port_ops
}; };

Просмотреть файл

@ -441,8 +441,8 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* HPT372N and friends - UDMA133 */ /* HPT372N and friends - UDMA133 */
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &hpt3x2n_port_ops .port_ops = &hpt3x2n_port_ops
}; };

Просмотреть файл

@ -188,11 +188,11 @@ static int hpt3x3_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
#if defined(CONFIG_PATA_HPT3X3_DMA) #if defined(CONFIG_PATA_HPT3X3_DMA)
/* Further debug needed */ /* Further debug needed */
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, .udma_mask = ATA_UDMA2,
#endif #endif
.port_ops = &hpt3x3_port_ops .port_ops = &hpt3x3_port_ops
}; };

Просмотреть файл

@ -297,7 +297,7 @@ static int icside_dma_init(struct pata_icside_info *info)
if (ec->dma != NO_DMA && !request_dma(ec->dma, DRV_NAME)) { if (ec->dma != NO_DMA && !request_dma(ec->dma, DRV_NAME)) {
state->dma = ec->dma; state->dma = ec->dma;
info->mwdma_mask = 0x07; /* MW0..2 */ info->mwdma_mask = ATA_MWDMA2;
} }
return 0; return 0;
@ -473,7 +473,7 @@ static int __devinit pata_icside_add_ports(struct pata_icside_info *info)
for (i = 0; i < info->nr_ports; i++) { for (i = 0; i < info->nr_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
ap->pio_mask = 0x1f; ap->pio_mask = ATA_PIO4;
ap->mwdma_mask = info->mwdma_mask; ap->mwdma_mask = info->mwdma_mask;
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ops = &pata_icside_port_ops; ap->ops = &pata_icside_port_ops;

Просмотреть файл

@ -17,7 +17,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_isapnp" #define DRV_NAME "pata_isapnp"
#define DRV_VERSION "0.2.2" #define DRV_VERSION "0.2.5"
static struct scsi_host_template isapnp_sht = { static struct scsi_host_template isapnp_sht = {
ATA_PIO_SHT(DRV_NAME), ATA_PIO_SHT(DRV_NAME),
@ -28,6 +28,13 @@ static struct ata_port_operations isapnp_port_ops = {
.cable_detect = ata_cable_40wire, .cable_detect = ata_cable_40wire,
}; };
static struct ata_port_operations isapnp_noalt_port_ops = {
.inherits = &ata_sff_port_ops,
.cable_detect = ata_cable_40wire,
/* No altstatus so we don't want to use the lost interrupt poll */
.lost_interrupt = ATA_OP_NULL,
};
/** /**
* isapnp_init_one - attach an isapnp interface * isapnp_init_one - attach an isapnp interface
* @idev: PnP device * @idev: PnP device
@ -65,8 +72,8 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
ap = host->ports[0]; ap = host->ports[0];
ap->ops = &isapnp_port_ops; ap->ops = &isapnp_noalt_port_ops;
ap->pio_mask = 1; ap->pio_mask = ATA_PIO0;
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ioaddr.cmd_addr = cmd_addr; ap->ioaddr.cmd_addr = cmd_addr;
@ -76,6 +83,7 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
pnp_port_start(idev, 1), 1); pnp_port_start(idev, 1), 1);
ap->ioaddr.altstatus_addr = ctl_addr; ap->ioaddr.altstatus_addr = ctl_addr;
ap->ioaddr.ctl_addr = ctl_addr; ap->ioaddr.ctl_addr = ctl_addr;
ap->ops = &isapnp_port_ops;
} }
ata_sff_std_ports(&ap->ioaddr); ata_sff_std_ports(&ap->ioaddr);

Просмотреть файл

@ -262,8 +262,8 @@ static int it8213_init_one (struct pci_dev *pdev, const struct pci_device_id *en
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, /* FIXME: want UDMA 100? */ .udma_mask = ATA_UDMA4, /* FIXME: want UDMA 100? */
.port_ops = &it8213_ops, .port_ops = &it8213_ops,
}; };

Просмотреть файл

@ -875,29 +875,29 @@ static int it821x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
static const struct ata_port_info info_smart = { static const struct ata_port_info info_smart = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &it821x_smart_port_ops .port_ops = &it821x_smart_port_ops
}; };
static const struct ata_port_info info_passthru = { static const struct ata_port_info info_passthru = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &it821x_passthru_port_ops .port_ops = &it821x_passthru_port_ops
}; };
static const struct ata_port_info info_rdc = { static const struct ata_port_info info_rdc = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &it821x_rdc_port_ops .port_ops = &it821x_rdc_port_ops
}; };
static const struct ata_port_info info_rdc_11 = { static const struct ata_port_info info_rdc_11 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
/* No UDMA */ /* No UDMA */
.port_ops = &it821x_rdc_port_ops .port_ops = &it821x_rdc_port_ops
}; };

Просмотреть файл

@ -176,7 +176,7 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
ap = host->ports[0]; ap = host->ports[0];
ap->ops = &ixp4xx_port_ops; ap->ops = &ixp4xx_port_ops;
ap->pio_mask = 0x1f; /* PIO4 */ ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY | ATA_FLAG_NO_ATAPI; ap->flags |= ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY | ATA_FLAG_NO_ATAPI;
ixp4xx_setup_port(ap, data, cs0->start, cs1->start); ixp4xx_setup_port(ap, data, cs0->start, cs1->start);

Просмотреть файл

@ -136,8 +136,8 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &jmicron_ops, .port_ops = &jmicron_ops,

Просмотреть файл

@ -129,7 +129,7 @@ static int qdi; /* Set to probe QDI controllers */
static int winbond; /* Set to probe Winbond controllers, static int winbond; /* Set to probe Winbond controllers,
give I/O port if non standard */ give I/O port if non standard */
static int autospeed; /* Chip present which snoops speed changes */ static int autospeed; /* Chip present which snoops speed changes */
static int pio_mask = 0x1F; /* PIO range for autospeed devices */ static int pio_mask = ATA_PIO4; /* PIO range for autospeed devices */
static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */ static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */
/** /**

Просмотреть файл

@ -126,8 +126,8 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &marvell_ops, .port_ops = &marvell_ops,
@ -136,8 +136,8 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i
/* Slave possible as its magically mapped not real */ /* Slave possible as its magically mapped not real */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &marvell_ops, .port_ops = &marvell_ops,

Просмотреть файл

@ -737,10 +737,10 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
*/ */
prop = of_get_property(op->node, "mwdma-mode", &proplen); prop = of_get_property(op->node, "mwdma-mode", &proplen);
if ((prop) && (proplen >= 4)) if ((prop) && (proplen >= 4))
mwdma_mask = 0x7 & ((1 << (*prop + 1)) - 1); mwdma_mask = ATA_MWDMA2 & ((1 << (*prop + 1)) - 1);
prop = of_get_property(op->node, "udma-mode", &proplen); prop = of_get_property(op->node, "udma-mode", &proplen);
if ((prop) && (proplen >= 4)) if ((prop) && (proplen >= 4))
udma_mask = 0x7 & ((1 << (*prop + 1)) - 1); udma_mask = ATA_UDMA2 & ((1 << (*prop + 1)) - 1);
ata_irq = irq_of_parse_and_map(op->node, 0); ata_irq = irq_of_parse_and_map(op->node, 0);
if (ata_irq == NO_IRQ) { if (ata_irq == NO_IRQ) {

Просмотреть файл

@ -200,7 +200,7 @@ static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
the MPIIX your box goes castors up */ the MPIIX your box goes castors up */
ap->ops = &mpiix_port_ops; ap->ops = &mpiix_port_ops;
ap->pio_mask = 0x1F; ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ioaddr.cmd_addr = cmd_addr; ap->ioaddr.cmd_addr = cmd_addr;

Просмотреть файл

@ -51,8 +51,8 @@ static int netcell_init_one (struct pci_dev *pdev, const struct pci_device_id *e
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
/* Actually we don't really care about these as the /* Actually we don't really care about these as the
firmware deals with it */ firmware deals with it */
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* UDMA 133 */ .udma_mask = ATA_UDMA5, /* UDMA 133 */
.port_ops = &netcell_ops, .port_ops = &netcell_ops,
}; };

Просмотреть файл

@ -136,7 +136,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
if (!base) if (!base)
return -ENOMEM; return -ENOMEM;
ap->ops = &ninja32_port_ops; ap->ops = &ninja32_port_ops;
ap->pio_mask = 0x1F; ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ioaddr.cmd_addr = base + 0x10; ap->ioaddr.cmd_addr = base + 0x10;

Просмотреть файл

@ -144,7 +144,7 @@ static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x0F, .pio_mask = ATA_PIO3,
.port_ops = &ns87410_port_ops .port_ops = &ns87410_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -346,8 +346,8 @@ static int ns87415_init_one (struct pci_dev *pdev, const struct pci_device_id *e
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.port_ops = &ns87415_pata_ops, .port_ops = &ns87415_pata_ops,
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };
@ -355,8 +355,8 @@ static int ns87415_init_one (struct pci_dev *pdev, const struct pci_device_id *e
#if defined(CONFIG_SUPERIO) #if defined(CONFIG_SUPERIO)
static const struct ata_port_info info87560 = { static const struct ata_port_info info87560 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.port_ops = &ns87560_pata_ops, .port_ops = &ns87560_pata_ops,
}; };

Просмотреть файл

@ -871,7 +871,7 @@ static int __devinit octeon_cf_probe(struct platform_device *pdev)
ap->private_data = cf_port; ap->private_data = cf_port;
cf_port->ap = ap; cf_port->ap = ap;
ap->ops = &octeon_cf_ops; ap->ops = &octeon_cf_ops;
ap->pio_mask = 0x7f; /* Support PIO 0-6 */ ap->pio_mask = ATA_PIO6;
ap->flags |= ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY ap->flags |= ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY
| ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING; | ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING;
@ -900,7 +900,7 @@ static int __devinit octeon_cf_probe(struct platform_device *pdev)
ap->ioaddr.ctl_addr = cs1 + (6 << 1) + 1; ap->ioaddr.ctl_addr = cs1 + (6 << 1) + 1;
octeon_cf_ops.sff_data_xfer = octeon_cf_data_xfer16; octeon_cf_ops.sff_data_xfer = octeon_cf_data_xfer16;
ap->mwdma_mask = 0x1f; /* Support MWDMA 0-4 */ ap->mwdma_mask = ATA_MWDMA4;
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
irq_handler = octeon_cf_interrupt; irq_handler = octeon_cf_interrupt;

Просмотреть файл

@ -238,8 +238,8 @@ static int oldpiix_init_one (struct pci_dev *pdev, const struct pci_device_id *e
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma1-2 */ .mwdma_mask = ATA_MWDMA2,
.port_ops = &oldpiix_pata_ops, .port_ops = &oldpiix_pata_ops,
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -163,7 +163,7 @@ static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &opti_port_ops .port_ops = &opti_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -399,15 +399,15 @@ static int optidma_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info_82c700 = { static const struct ata_port_info info_82c700 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &optidma_port_ops .port_ops = &optidma_port_ops
}; };
static const struct ata_port_info info_82c700_udma = { static const struct ata_port_info info_82c700_udma = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, .udma_mask = ATA_UDMA2,
.port_ops = &optiplus_port_ops .port_ops = &optiplus_port_ops
}; };
const struct ata_port_info *ppi[] = { &info_82c700, NULL }; const struct ata_port_info *ppi[] = { &info_82c700, NULL };

Просмотреть файл

@ -42,7 +42,7 @@
#define DRV_NAME "pata_pcmcia" #define DRV_NAME "pata_pcmcia"
#define DRV_VERSION "0.3.3" #define DRV_VERSION "0.3.5"
/* /*
* Private data structure to glue stuff together * Private data structure to glue stuff together
@ -126,6 +126,37 @@ static unsigned int ata_data_xfer_8bit(struct ata_device *dev,
return buflen; return buflen;
} }
/**
* pcmcia_8bit_drain_fifo - Stock FIFO drain logic for SFF controllers
* @qc: command
*
* Drain the FIFO and device of any stuck data following a command
* failing to complete. In some cases this is neccessary before a
* reset will recover the device.
*
*/
void pcmcia_8bit_drain_fifo(struct ata_queued_cmd *qc)
{
int count;
struct ata_port *ap;
/* We only need to flush incoming data when a command was running */
if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE)
return;
ap = qc->ap;
/* Drain up to 64K of data before we give up this recovery method */
for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
&& count++ < 65536;)
ioread8(ap->ioaddr.data_addr);
if (count)
ata_port_printk(ap, KERN_WARNING, "drained %d bytes to clear DRQ.\n",
count);
}
static struct scsi_host_template pcmcia_sht = { static struct scsi_host_template pcmcia_sht = {
ATA_PIO_SHT(DRV_NAME), ATA_PIO_SHT(DRV_NAME),
@ -143,6 +174,7 @@ static struct ata_port_operations pcmcia_8bit_port_ops = {
.sff_data_xfer = ata_data_xfer_8bit, .sff_data_xfer = ata_data_xfer_8bit,
.cable_detect = ata_cable_40wire, .cable_detect = ata_cable_40wire,
.set_mode = pcmcia_set_mode_8bit, .set_mode = pcmcia_set_mode_8bit,
.drain_fifo = pcmcia_8bit_drain_fifo,
}; };
#define CS_CHECK(fn, ret) \ #define CS_CHECK(fn, ret) \
@ -299,7 +331,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
ap = host->ports[p]; ap = host->ports[p];
ap->ops = ops; ap->ops = ops;
ap->pio_mask = 1; /* ISA so PIO 0 cycles */ ap->pio_mask = ATA_PIO0; /* ISA so PIO 0 cycles */
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ioaddr.cmd_addr = io_addr + 0x10 * p; ap->ioaddr.cmd_addr = io_addr + 0x10 * p;
ap->ioaddr.altstatus_addr = ctl_addr + 0x10 * p; ap->ioaddr.altstatus_addr = ctl_addr + 0x10 * p;

Просмотреть файл

@ -152,18 +152,18 @@ static struct ata_port_info pdc2027x_port_info[] = {
{ {
.flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SLAVE_POSS | .flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SLAVE_POSS |
ATA_FLAG_MMIO, ATA_FLAG_MMIO,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &pdc2027x_pata100_ops, .port_ops = &pdc2027x_pata100_ops,
}, },
/* PDC_UDMA_133 */ /* PDC_UDMA_133 */
{ {
.flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SLAVE_POSS | .flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SLAVE_POSS |
ATA_FLAG_MMIO, ATA_FLAG_MMIO,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc2027x_pata133_ops, .port_ops = &pdc2027x_pata133_ops,
}, },
}; };

Просмотреть файл

@ -291,22 +291,22 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id
static const struct ata_port_info info[3] = { static const struct ata_port_info info[3] = {
{ {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
.port_ops = &pdc2024x_port_ops .port_ops = &pdc2024x_port_ops
}, },
{ {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &pdc2026x_port_ops .port_ops = &pdc2026x_port_ops
}, },
{ {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &pdc2026x_port_ops .port_ops = &pdc2026x_port_ops
} }

Просмотреть файл

@ -212,11 +212,11 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
if (type == 6580) { if (type == 6580) {
ap->ops = &qdi6580_port_ops; ap->ops = &qdi6580_port_ops;
ap->pio_mask = 0x1F; ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
} else { } else {
ap->ops = &qdi6500_port_ops; ap->ops = &qdi6500_port_ops;
ap->pio_mask = 0x07; /* Actually PIO3 !IORDY is possible */ ap->pio_mask = ATA_PIO2; /* Actually PIO3 !IORDY is possible */
ap->flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY; ap->flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY;
} }

Просмотреть файл

@ -216,9 +216,9 @@ static int radisys_init_one (struct pci_dev *pdev, const struct pci_device_id *e
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma1-2 */ .mwdma_mask = ATA_MWDMA12_ONLY,
.udma_mask = 0x14, /* UDMA33/66 only */ .udma_mask = ATA_UDMA24_ONLY,
.port_ops = &radisys_pata_ops, .port_ops = &radisys_pata_ops,
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -48,63 +48,11 @@
struct rb532_cf_info { struct rb532_cf_info {
void __iomem *iobase; void __iomem *iobase;
unsigned int gpio_line; unsigned int gpio_line;
int frozen;
unsigned int irq; unsigned int irq;
}; };
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
static inline void rb532_pata_finish_io(struct ata_port *ap)
{
struct ata_host *ah = ap->host;
struct rb532_cf_info *info = ah->private_data;
/* FIXME: Keep previous delay. If this is merely a fence then
ata_sff_sync might be sufficient. */
ata_sff_dma_pause(ap);
ndelay(RB500_CF_IO_DELAY);
}
static void rb532_pata_exec_command(struct ata_port *ap,
const struct ata_taskfile *tf)
{
writeb(tf->command, ap->ioaddr.command_addr);
rb532_pata_finish_io(ap);
}
static unsigned int rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data)
{
struct ata_port *ap = adev->link->ap;
void __iomem *ioaddr = ap->ioaddr.data_addr;
int retlen = buflen;
if (write_data) {
for (; buflen > 0; buflen--, buf++)
writeb(*buf, ioaddr);
} else {
for (; buflen > 0; buflen--, buf++)
*buf = readb(ioaddr);
}
rb532_pata_finish_io(adev->link->ap);
return retlen;
}
static void rb532_pata_freeze(struct ata_port *ap)
{
struct rb532_cf_info *info = ap->host->private_data;
info->frozen = 1;
}
static void rb532_pata_thaw(struct ata_port *ap)
{
struct rb532_cf_info *info = ap->host->private_data;
info->frozen = 0;
}
static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance) static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance)
{ {
struct ata_host *ah = dev_instance; struct ata_host *ah = dev_instance;
@ -112,8 +60,7 @@ static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance)
if (gpio_get_value(info->gpio_line)) { if (gpio_get_value(info->gpio_line)) {
set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW); set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW);
if (!info->frozen) ata_sff_interrupt(info->irq, dev_instance);
ata_sff_interrupt(info->irq, dev_instance);
} else { } else {
set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH);
} }
@ -123,10 +70,7 @@ static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance)
static struct ata_port_operations rb532_pata_port_ops = { static struct ata_port_operations rb532_pata_port_ops = {
.inherits = &ata_sff_port_ops, .inherits = &ata_sff_port_ops,
.sff_exec_command = rb532_pata_exec_command, .sff_data_xfer = ata_sff_data_xfer32,
.sff_data_xfer = rb532_pata_data_xfer,
.freeze = rb532_pata_freeze,
.thaw = rb532_pata_thaw,
}; };
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
@ -145,7 +89,7 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
ap = ah->ports[0]; ap = ah->ports[0];
ap->ops = &rb532_pata_port_ops; ap->ops = &rb532_pata_port_ops;
ap->pio_mask = 0x1f; /* PIO4 */ ap->pio_mask = ATA_PIO4;
ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO;
ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE; ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE;
@ -160,7 +104,7 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) static __devinit int rb532_pata_driver_probe(struct platform_device *pdev)
{ {
unsigned int irq; int irq;
int gpio; int gpio;
struct resource *res; struct resource *res;
struct ata_host *ah; struct ata_host *ah;

Просмотреть файл

@ -88,7 +88,7 @@ static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *en
static int printed_version; static int printed_version;
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &rz1000_port_ops .port_ops = &rz1000_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -2,7 +2,6 @@
* New ATA layer SC1200 driver Alan Cox <alan@lxorguk.ukuu.org.uk> * New ATA layer SC1200 driver Alan Cox <alan@lxorguk.ukuu.org.uk>
* *
* TODO: Mode selection filtering * TODO: Mode selection filtering
* TODO: Can't enable second channel until ATA core has serialize
* TODO: Needs custom DMA cleanup code * TODO: Needs custom DMA cleanup code
* *
* Based very heavily on * Based very heavily on
@ -178,6 +177,31 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc)
return ata_sff_qc_issue(qc); return ata_sff_qc_issue(qc);
} }
/**
* sc1200_qc_defer - implement serialization
* @qc: command
*
* Serialize command issue on this controller.
*/
static int sc1200_qc_defer(struct ata_queued_cmd *qc)
{
struct ata_host *host = qc->ap->host;
struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
int rc;
/* First apply the usual rules */
rc = ata_std_qc_defer(qc);
if (rc != 0)
return rc;
/* Now apply serialization rules. Only allow a command if the
other channel state machine is idle */
if (alt && alt->qc_active)
return ATA_DEFER_PORT;
return 0;
}
static struct scsi_host_template sc1200_sht = { static struct scsi_host_template sc1200_sht = {
ATA_BMDMA_SHT(DRV_NAME), ATA_BMDMA_SHT(DRV_NAME),
.sg_tablesize = LIBATA_DUMB_MAX_PRD, .sg_tablesize = LIBATA_DUMB_MAX_PRD,
@ -187,6 +211,7 @@ static struct ata_port_operations sc1200_port_ops = {
.inherits = &ata_bmdma_port_ops, .inherits = &ata_bmdma_port_ops,
.qc_prep = ata_sff_dumb_qc_prep, .qc_prep = ata_sff_dumb_qc_prep,
.qc_issue = sc1200_qc_issue, .qc_issue = sc1200_qc_issue,
.qc_defer = sc1200_qc_defer,
.cable_detect = ata_cable_40wire, .cable_detect = ata_cable_40wire,
.set_piomode = sc1200_set_piomode, .set_piomode = sc1200_set_piomode,
.set_dmamode = sc1200_set_dmamode, .set_dmamode = sc1200_set_dmamode,
@ -205,13 +230,13 @@ static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, .udma_mask = ATA_UDMA2,
.port_ops = &sc1200_port_ops .port_ops = &sc1200_port_ops
}; };
/* Can't enable port 2 yet, see top comments */ /* Can't enable port 2 yet, see top comments */
const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info }; const struct ata_port_info *ppi[] = { &info, };
return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL); return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL);
} }

Просмотреть файл

@ -1001,8 +1001,8 @@ static struct ata_port_operations scc_pata_ops = {
static struct ata_port_info scc_port_info[] = { static struct ata_port_info scc_port_info[] = {
{ {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x00, /* No MWDMA */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &scc_pata_ops, .port_ops = &scc_pata_ops,
}, },

Просмотреть файл

@ -84,9 +84,9 @@ static struct ata_port_operations sch_pata_ops = {
static struct ata_port_info sch_port_info = { static struct ata_port_info sch_port_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = ATA_PIO4, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = ATA_MWDMA2, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sch_pata_ops, .port_ops = &sch_pata_ops,
}; };

Просмотреть файл

@ -398,26 +398,26 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id
static const struct ata_port_info info[4] = { static const struct ata_port_info info[4] = {
{ /* OSB4 */ { /* OSB4 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x07, .udma_mask = ATA_UDMA2,
.port_ops = &serverworks_osb4_port_ops .port_ops = &serverworks_osb4_port_ops
}, { /* OSB4 no UDMA */ }, { /* OSB4 no UDMA */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0x00, /* No UDMA */
.port_ops = &serverworks_osb4_port_ops .port_ops = &serverworks_osb4_port_ops
}, { /* CSB5 */ }, { /* CSB5 */
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &serverworks_csb_port_ops .port_ops = &serverworks_csb_port_ops
}, { /* CSB5 - later revisions*/ }, { /* CSB5 - later revisions*/
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &serverworks_csb_port_ops .port_ops = &serverworks_csb_port_ops
} }

Просмотреть файл

@ -282,15 +282,15 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sil680_port_ops .port_ops = &sil680_port_ops
}; };
static const struct ata_port_info info_slow = { static const struct ata_port_info info_slow = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &sil680_port_ops .port_ops = &sil680_port_ops
}; };

Просмотреть файл

@ -552,51 +552,57 @@ static struct ata_port_operations sis_old_ops = {
static const struct ata_port_info sis_info = { static const struct ata_port_info sis_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = 0, /* No UDMA */
.port_ops = &sis_old_ops, .port_ops = &sis_old_ops,
}; };
static const struct ata_port_info sis_info33 = { static const struct ata_port_info sis_info33 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA2, /* UDMA 33 */ .udma_mask = ATA_UDMA2,
.port_ops = &sis_old_ops, .port_ops = &sis_old_ops,
}; };
static const struct ata_port_info sis_info66 = { static const struct ata_port_info sis_info66 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA4, /* UDMA 66 */ /* No MWDMA */
.udma_mask = ATA_UDMA4,
.port_ops = &sis_66_ops, .port_ops = &sis_66_ops,
}; };
static const struct ata_port_info sis_info100 = { static const struct ata_port_info sis_info100 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
/* No MWDMA */
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &sis_100_ops, .port_ops = &sis_100_ops,
}; };
static const struct ata_port_info sis_info100_early = { static const struct ata_port_info sis_info100_early = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = ATA_PIO4,
/* No MWDMA */
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.pio_mask = 0x1f, /* pio0-4 */
.port_ops = &sis_66_ops, .port_ops = &sis_66_ops,
}; };
static const struct ata_port_info sis_info133 = { static const struct ata_port_info sis_info133 = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
/* No MWDMA */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sis_133_ops, .port_ops = &sis_133_ops,
}; };
const struct ata_port_info sis_info133_for_sata = { const struct ata_port_info sis_info133_for_sata = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
/* No MWDMA */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sis_133_for_sata_ops, .port_ops = &sis_133_for_sata_ops,
}; };
static const struct ata_port_info sis_info133_early = { static const struct ata_port_info sis_info133_early = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
/* No MWDMA */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sis_133_early_ops, .port_ops = &sis_133_early_ops,
}; };

Просмотреть файл

@ -283,13 +283,13 @@ static int sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id
{ {
static const struct ata_port_info info_dma = { static const struct ata_port_info info_dma = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &sl82c105_port_ops .port_ops = &sl82c105_port_ops
}; };
static const struct ata_port_info info_early = { static const struct ata_port_info info_early = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.port_ops = &sl82c105_port_ops .port_ops = &sl82c105_port_ops
}; };
/* for now use only the first port */ /* for now use only the first port */

Просмотреть файл

@ -191,8 +191,8 @@ static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
static const struct ata_port_info info = { static const struct ata_port_info info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &triflex_port_ops .port_ops = &triflex_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };

Просмотреть файл

@ -422,46 +422,46 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* Early VIA without UDMA support */ /* Early VIA without UDMA support */
static const struct ata_port_info via_mwdma_info = { static const struct ata_port_info via_mwdma_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
/* Ditto with IRQ masking required */ /* Ditto with IRQ masking required */
static const struct ata_port_info via_mwdma_info_borked = { static const struct ata_port_info via_mwdma_info_borked = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.port_ops = &via_port_ops_noirq, .port_ops = &via_port_ops_noirq,
}; };
/* VIA UDMA 33 devices (and borked 66) */ /* VIA UDMA 33 devices (and borked 66) */
static const struct ata_port_info via_udma33_info = { static const struct ata_port_info via_udma33_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
/* VIA UDMA 66 devices */ /* VIA UDMA 66 devices */
static const struct ata_port_info via_udma66_info = { static const struct ata_port_info via_udma66_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
/* VIA UDMA 100 devices */ /* VIA UDMA 100 devices */
static const struct ata_port_info via_udma100_info = { static const struct ata_port_info via_udma100_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
/* UDMA133 with bad AST (All current 133) */ /* UDMA133 with bad AST (All current 133) */
static const struct ata_port_info via_udma133_info = { static const struct ata_port_info via_udma133_info = {
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, /* FIXME: should check north bridge */ .udma_mask = ATA_UDMA6, /* FIXME: should check north bridge */
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };

Просмотреть файл

@ -193,7 +193,7 @@ static __init int winbond_init_one(unsigned long port)
ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", cmd_port, ctl_port); ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", cmd_port, ctl_port);
ap->ops = &winbond_port_ops; ap->ops = &winbond_port_ops;
ap->pio_mask = 0x1F; ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ioaddr.cmd_addr = cmd_addr; ap->ioaddr.cmd_addr = cmd_addr;
ap->ioaddr.altstatus_addr = ctl_addr; ap->ioaddr.altstatus_addr = ctl_addr;

Просмотреть файл

@ -148,6 +148,8 @@ static struct scsi_host_template adma_ata_sht = {
static struct ata_port_operations adma_ata_ops = { static struct ata_port_operations adma_ata_ops = {
.inherits = &ata_sff_port_ops, .inherits = &ata_sff_port_ops,
.lost_interrupt = ATA_OP_NULL,
.check_atapi_dma = adma_check_atapi_dma, .check_atapi_dma = adma_check_atapi_dma,
.qc_prep = adma_qc_prep, .qc_prep = adma_qc_prep,
.qc_issue = adma_qc_issue, .qc_issue = adma_qc_issue,
@ -166,7 +168,7 @@ static struct ata_port_info adma_port_info[] = {
.flags = ATA_FLAG_SLAVE_POSS | .flags = ATA_FLAG_SLAVE_POSS |
ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO |
ATA_FLAG_PIO_POLLING, ATA_FLAG_PIO_POLLING,
.pio_mask = 0x10, /* pio4 */ .pio_mask = ATA_PIO4_ONLY,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
.port_ops = &adma_ata_ops, .port_ops = &adma_ata_ops,
}, },

Просмотреть файл

@ -1279,8 +1279,8 @@ static struct ata_port_operations sata_fsl_ops = {
static const struct ata_port_info sata_fsl_port_info[] = { static const struct ata_port_info sata_fsl_port_info[] = {
{ {
.flags = SATA_FSL_HOST_FLAGS, .flags = SATA_FSL_HOST_FLAGS,
.pio_mask = 0x1f, /* pio 0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = 0x7f, /* udma 0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &sata_fsl_ops, .port_ops = &sata_fsl_ops,
}, },
}; };

Просмотреть файл

@ -744,8 +744,8 @@ static struct ata_port_operations inic_port_ops = {
static struct ata_port_info inic_port_info = { static struct ata_port_info inic_port_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA, .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &inic_port_ops .port_ops = &inic_port_ops
}; };

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -57,9 +57,9 @@ enum {
NV_MMIO_BAR = 5, NV_MMIO_BAR = 5,
NV_PORTS = 2, NV_PORTS = 2,
NV_PIO_MASK = 0x1f, NV_PIO_MASK = ATA_PIO4,
NV_MWDMA_MASK = 0x07, NV_MWDMA_MASK = ATA_MWDMA2,
NV_UDMA_MASK = 0x7f, NV_UDMA_MASK = ATA_UDMA6,
NV_PORT0_SCR_REG_OFFSET = 0x00, NV_PORT0_SCR_REG_OFFSET = 0x00,
NV_PORT1_SCR_REG_OFFSET = 0x40, NV_PORT1_SCR_REG_OFFSET = 0x40,
@ -408,6 +408,7 @@ static struct scsi_host_template nv_swncq_sht = {
static struct ata_port_operations nv_common_ops = { static struct ata_port_operations nv_common_ops = {
.inherits = &ata_bmdma_port_ops, .inherits = &ata_bmdma_port_ops,
.lost_interrupt = ATA_OP_NULL,
.scr_read = nv_scr_read, .scr_read = nv_scr_read,
.scr_write = nv_scr_write, .scr_write = nv_scr_write,
}; };

Просмотреть файл

@ -176,7 +176,9 @@ static const struct ata_port_operations pdc_common_ops = {
.check_atapi_dma = pdc_check_atapi_dma, .check_atapi_dma = pdc_check_atapi_dma,
.qc_prep = pdc_qc_prep, .qc_prep = pdc_qc_prep,
.qc_issue = pdc_qc_issue, .qc_issue = pdc_qc_issue,
.sff_irq_clear = pdc_irq_clear, .sff_irq_clear = pdc_irq_clear,
.lost_interrupt = ATA_OP_NULL,
.post_internal_cmd = pdc_post_internal_cmd, .post_internal_cmd = pdc_post_internal_cmd,
.error_handler = pdc_error_handler, .error_handler = pdc_error_handler,
@ -213,8 +215,8 @@ static const struct ata_port_info pdc_port_info[] = {
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA |
PDC_FLAG_SATA_PATA, PDC_FLAG_SATA_PATA,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_old_sata_ops, .port_ops = &pdc_old_sata_ops,
}, },
@ -222,8 +224,8 @@ static const struct ata_port_info pdc_port_info[] = {
[board_2037x_pata] = [board_2037x_pata] =
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS, .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_pata_ops, .port_ops = &pdc_pata_ops,
}, },
@ -232,8 +234,8 @@ static const struct ata_port_info pdc_port_info[] = {
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA |
PDC_FLAG_4_PORTS, PDC_FLAG_4_PORTS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_old_sata_ops, .port_ops = &pdc_old_sata_ops,
}, },
@ -242,8 +244,8 @@ static const struct ata_port_info pdc_port_info[] = {
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
PDC_FLAG_4_PORTS, PDC_FLAG_4_PORTS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_pata_ops, .port_ops = &pdc_pata_ops,
}, },
@ -252,8 +254,8 @@ static const struct ata_port_info pdc_port_info[] = {
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA |
PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA, PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_sata_ops, .port_ops = &pdc_sata_ops,
}, },
@ -262,8 +264,8 @@ static const struct ata_port_info pdc_port_info[] = {
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
PDC_FLAG_GEN_II, PDC_FLAG_GEN_II,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_pata_ops, .port_ops = &pdc_pata_ops,
}, },
@ -272,8 +274,8 @@ static const struct ata_port_info pdc_port_info[] = {
{ {
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA | .flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA |
PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS, PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_sata_ops, .port_ops = &pdc_sata_ops,
}, },

Просмотреть файл

@ -147,6 +147,7 @@ static struct ata_port_operations qs_ata_ops = {
.softreset = ATA_OP_NULL, .softreset = ATA_OP_NULL,
.error_handler = qs_error_handler, .error_handler = qs_error_handler,
.post_internal_cmd = ATA_OP_NULL, .post_internal_cmd = ATA_OP_NULL,
.lost_interrupt = ATA_OP_NULL,
.scr_read = qs_scr_read, .scr_read = qs_scr_read,
.scr_write = qs_scr_write, .scr_write = qs_scr_write,
@ -160,7 +161,7 @@ static const struct ata_port_info qs_port_info[] = {
{ {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING, ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING,
.pio_mask = 0x10, /* pio4 */ .pio_mask = ATA_PIO4_ONLY,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &qs_ata_ops, .port_ops = &qs_ata_ops,
}, },

Просмотреть файл

@ -200,8 +200,8 @@ static const struct ata_port_info sil_port_info[] = {
/* sil_3112 */ /* sil_3112 */
{ {
.flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_MOD15WRITE, .flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_MOD15WRITE,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
@ -209,24 +209,24 @@ static const struct ata_port_info sil_port_info[] = {
{ {
.flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_MOD15WRITE | .flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_MOD15WRITE |
SIL_FLAG_NO_SATA_IRQ, SIL_FLAG_NO_SATA_IRQ,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
/* sil_3512 */ /* sil_3512 */
{ {
.flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT, .flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
/* sil_3114 */ /* sil_3114 */
{ {
.flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT, .flags = SIL_DFL_PORT_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },

Просмотреть файл

@ -429,25 +429,25 @@ static const struct ata_port_info sil24_port_info[] = {
{ {
.flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) | .flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) |
SIL24_FLAG_PCIX_IRQ_WOC, SIL24_FLAG_PCIX_IRQ_WOC,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil24_ops, .port_ops = &sil24_ops,
}, },
/* sil_3132 */ /* sil_3132 */
{ {
.flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2), .flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil24_ops, .port_ops = &sil24_ops,
}, },
/* sil_3131/sil_3531 */ /* sil_3131/sil_3531 */
{ {
.flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1), .flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA5, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil24_ops, .port_ops = &sil24_ops,
}, },
}; };

Просмотреть файл

@ -97,8 +97,8 @@ static struct ata_port_operations sis_ops = {
static const struct ata_port_info sis_port_info = { static const struct ata_port_info sis_port_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x7, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sis_ops, .port_ops = &sis_ops,
}; };

Просмотреть файл

@ -361,8 +361,8 @@ static const struct ata_port_info k2_port_info[] = {
{ {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &k2_sata_ops, .port_ops = &k2_sata_ops,
}, },
@ -371,8 +371,8 @@ static const struct ata_port_info k2_port_info[] = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA |
K2_FLAG_SATA_8_PORTS, K2_FLAG_SATA_8_PORTS,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &k2_sata_ops, .port_ops = &k2_sata_ops,
}, },
@ -380,8 +380,8 @@ static const struct ata_port_info k2_port_info[] = {
{ {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | K2_FLAG_BAR_POS_3, ATA_FLAG_MMIO | K2_FLAG_BAR_POS_3,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &k2_sata_ops, .port_ops = &k2_sata_ops,
}, },
@ -389,8 +389,8 @@ static const struct ata_port_info k2_port_info[] = {
{ {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO, ATA_FLAG_MMIO,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &k2_sata_ops, .port_ops = &k2_sata_ops,
}, },

Просмотреть файл

@ -265,8 +265,8 @@ static const struct ata_port_info pdc_port_info[] = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_SRST | ATA_FLAG_MMIO | ATA_FLAG_SRST | ATA_FLAG_MMIO |
ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING, ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &pdc_20621_ops, .port_ops = &pdc_20621_ops,
}, },

Просмотреть файл

@ -89,7 +89,7 @@ static struct ata_port_operations uli_ops = {
static const struct ata_port_info uli_port_info = { static const struct ata_port_info uli_port_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_IGN_SIMPLEX, ATA_FLAG_IGN_SIMPLEX,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = ATA_PIO4,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &uli_ops, .port_ops = &uli_ops,
}; };

Просмотреть файл

@ -146,24 +146,24 @@ static struct ata_port_operations vt8251_ops = {
static const struct ata_port_info vt6420_port_info = { static const struct ata_port_info vt6420_port_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &vt6420_sata_ops, .port_ops = &vt6420_sata_ops,
}; };
static struct ata_port_info vt6421_sport_info = { static struct ata_port_info vt6421_sport_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &vt6421_sata_ops, .port_ops = &vt6421_sata_ops,
}; };
static struct ata_port_info vt6421_pport_info = { static struct ata_port_info vt6421_pport_info = {
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_LEGACY, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0, /* No MWDMA */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &vt6421_pata_ops, .port_ops = &vt6421_pata_ops,
}; };
@ -171,8 +171,8 @@ static struct ata_port_info vt6421_pport_info = {
static struct ata_port_info vt8251_port_info = { static struct ata_port_info vt8251_port_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_SLAVE_POSS | .flags = ATA_FLAG_SATA | ATA_FLAG_SLAVE_POSS |
ATA_FLAG_NO_LEGACY, ATA_FLAG_NO_LEGACY,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &vt8251_ops, .port_ops = &vt8251_ops,
}; };

Просмотреть файл

@ -308,6 +308,9 @@ static struct scsi_host_template vsc_sata_sht = {
static struct ata_port_operations vsc_sata_ops = { static struct ata_port_operations vsc_sata_ops = {
.inherits = &ata_bmdma_port_ops, .inherits = &ata_bmdma_port_ops,
/* The IRQ handling is not quite standard SFF behaviour so we
cannot use the default lost interrupt handler */
.lost_interrupt = ATA_OP_NULL,
.sff_tf_load = vsc_sata_tf_load, .sff_tf_load = vsc_sata_tf_load,
.sff_tf_read = vsc_sata_tf_read, .sff_tf_read = vsc_sata_tf_read,
.freeze = vsc_freeze, .freeze = vsc_freeze,
@ -345,8 +348,8 @@ static int __devinit vsc_sata_init_one(struct pci_dev *pdev,
static const struct ata_port_info pi = { static const struct ata_port_info pi = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO, ATA_FLAG_MMIO,
.pio_mask = 0x1f, .pio_mask = ATA_PIO4,
.mwdma_mask = 0x07, .mwdma_mask = ATA_MWDMA2,
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &vsc_sata_ops, .port_ops = &vsc_sata_ops,
}; };

Просмотреть файл

@ -108,6 +108,8 @@ enum {
ATA_PIO5 = ATA_PIO4 | (1 << 5), ATA_PIO5 = ATA_PIO4 | (1 << 5),
ATA_PIO6 = ATA_PIO5 | (1 << 6), ATA_PIO6 = ATA_PIO5 | (1 << 6),
ATA_PIO4_ONLY = (1 << 4),
ATA_SWDMA0 = (1 << 0), ATA_SWDMA0 = (1 << 0),
ATA_SWDMA1 = ATA_SWDMA0 | (1 << 1), ATA_SWDMA1 = ATA_SWDMA0 | (1 << 1),
ATA_SWDMA2 = ATA_SWDMA1 | (1 << 2), ATA_SWDMA2 = ATA_SWDMA1 | (1 << 2),
@ -117,6 +119,8 @@ enum {
ATA_MWDMA0 = (1 << 0), ATA_MWDMA0 = (1 << 0),
ATA_MWDMA1 = ATA_MWDMA0 | (1 << 1), ATA_MWDMA1 = ATA_MWDMA0 | (1 << 1),
ATA_MWDMA2 = ATA_MWDMA1 | (1 << 2), ATA_MWDMA2 = ATA_MWDMA1 | (1 << 2),
ATA_MWDMA3 = ATA_MWDMA2 | (1 << 3),
ATA_MWDMA4 = ATA_MWDMA3 | (1 << 4),
ATA_MWDMA12_ONLY = (1 << 1) | (1 << 2), ATA_MWDMA12_ONLY = (1 << 1) | (1 << 2),
ATA_MWDMA2_ONLY = (1 << 2), ATA_MWDMA2_ONLY = (1 << 2),
@ -131,6 +135,8 @@ enum {
ATA_UDMA7 = ATA_UDMA6 | (1 << 7), ATA_UDMA7 = ATA_UDMA6 | (1 << 7),
/* ATA_UDMA7 is just for completeness... doesn't exist (yet?). */ /* ATA_UDMA7 is just for completeness... doesn't exist (yet?). */
ATA_UDMA24_ONLY = (1 << 2) | (1 << 4),
ATA_UDMA_MASK_40C = ATA_UDMA2, /* udma0-2 */ ATA_UDMA_MASK_40C = ATA_UDMA2, /* udma0-2 */
/* DMA-related */ /* DMA-related */

Просмотреть файл

@ -795,6 +795,7 @@ struct ata_port_operations {
ata_reset_fn_t pmp_hardreset; ata_reset_fn_t pmp_hardreset;
ata_postreset_fn_t pmp_postreset; ata_postreset_fn_t pmp_postreset;
void (*error_handler)(struct ata_port *ap); void (*error_handler)(struct ata_port *ap);
void (*lost_interrupt)(struct ata_port *ap);
void (*post_internal_cmd)(struct ata_queued_cmd *qc); void (*post_internal_cmd)(struct ata_queued_cmd *qc);
/* /*
@ -836,6 +837,8 @@ struct ata_port_operations {
void (*bmdma_start)(struct ata_queued_cmd *qc); void (*bmdma_start)(struct ata_queued_cmd *qc);
void (*bmdma_stop)(struct ata_queued_cmd *qc); void (*bmdma_stop)(struct ata_queued_cmd *qc);
u8 (*bmdma_status)(struct ata_port *ap); u8 (*bmdma_status)(struct ata_port *ap);
void (*drain_fifo)(struct ata_queued_cmd *qc);
#endif /* CONFIG_ATA_SFF */ #endif /* CONFIG_ATA_SFF */
ssize_t (*em_show)(struct ata_port *ap, char *buf); ssize_t (*em_show)(struct ata_port *ap, char *buf);
@ -1008,6 +1011,9 @@ extern int ata_cable_sata(struct ata_port *ap);
extern int ata_cable_ignore(struct ata_port *ap); extern int ata_cable_ignore(struct ata_port *ap);
extern int ata_cable_unknown(struct ata_port *ap); extern int ata_cable_unknown(struct ata_port *ap);
extern void ata_pio_queue_task(struct ata_port *ap, void *data,
unsigned long delay);
/* Timing helpers */ /* Timing helpers */
extern unsigned int ata_pio_need_iordy(const struct ata_device *); extern unsigned int ata_pio_need_iordy(const struct ata_device *);
extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode); extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode);
@ -1572,6 +1578,7 @@ extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);
extern unsigned int ata_sff_host_intr(struct ata_port *ap, extern unsigned int ata_sff_host_intr(struct ata_port *ap,
struct ata_queued_cmd *qc); struct ata_queued_cmd *qc);
extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance); extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);
extern void ata_sff_lost_interrupt(struct ata_port *ap);
extern void ata_sff_freeze(struct ata_port *ap); extern void ata_sff_freeze(struct ata_port *ap);
extern void ata_sff_thaw(struct ata_port *ap); extern void ata_sff_thaw(struct ata_port *ap);
extern int ata_sff_prereset(struct ata_link *link, unsigned long deadline); extern int ata_sff_prereset(struct ata_link *link, unsigned long deadline);
@ -1584,6 +1591,7 @@ extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class, extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline); unsigned long deadline);
extern void ata_sff_postreset(struct ata_link *link, unsigned int *classes); extern void ata_sff_postreset(struct ata_link *link, unsigned int *classes);
extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);
extern void ata_sff_error_handler(struct ata_port *ap); extern void ata_sff_error_handler(struct ata_port *ap);
extern void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc); extern void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc);
extern int ata_sff_port_start(struct ata_port *ap); extern int ata_sff_port_start(struct ata_port *ap);