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:
Коммит
0384e29591
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче