Commit 64b853aa authored by Linus Torvalds's avatar Linus Torvalds

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

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev: (32 commits)
  [libata] sata_mv: print out additional chip info during probe
  [libata] Use ATA_UDMAx standard masks when filling driver's udma_mask info
  [libata] AHCI: Add support for Marvell AHCI-like chips (initially 6145)
  [libata] Clean up driver udma_mask initializers
  libata: Support chips with 64K PRD quirk
  Add a PCI ID for santa rosa's PATA controller.
  sata_sil24: sil24_interrupt() micro-optimisation
  Add irq_flags to struct pata_platform_info
  sata_promise: cleanups
  [libata] pata_ixp4xx: kill unused var
  ata_piix: fix pio/mwdma programming
  [libata] ahci: minor internal cleanups
  [ATA] Add named constant for ATAPI command DEVICE RESET
  [libata] sata_sx4, sata_via: minor documentation updates
  [libata] ahci: minor internal cleanups
  [libata] ahci: Factor out SATA port init into a separate function
  [libata] pata_sil680: minor cleanups from benh
  [libata] sata_sx4: named constant cleanup
  [libata] pata_ixp4xx: convert to new EH
  [libata] pdc_adma: Reorder initializers with a couple structs
  ...
parents 0f166396 c1e4fe71
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "ahci" #define DRV_NAME "ahci"
#define DRV_VERSION "2.2" #define DRV_VERSION "2.3"
enum { enum {
...@@ -54,7 +54,7 @@ enum { ...@@ -54,7 +54,7 @@ enum {
AHCI_MAX_PORTS = 32, AHCI_MAX_PORTS = 32,
AHCI_MAX_SG = 168, /* hardware max is 64K */ AHCI_MAX_SG = 168, /* hardware max is 64K */
AHCI_DMA_BOUNDARY = 0xffffffff, AHCI_DMA_BOUNDARY = 0xffffffff,
AHCI_USE_CLUSTERING = 0, AHCI_USE_CLUSTERING = 1,
AHCI_MAX_CMDS = 32, AHCI_MAX_CMDS = 32,
AHCI_CMD_SZ = 32, AHCI_CMD_SZ = 32,
AHCI_CMD_SLOT_SZ = AHCI_MAX_CMDS * AHCI_CMD_SZ, AHCI_CMD_SLOT_SZ = AHCI_MAX_CMDS * AHCI_CMD_SZ,
...@@ -81,6 +81,7 @@ enum { ...@@ -81,6 +81,7 @@ enum {
board_ahci_vt8251 = 2, board_ahci_vt8251 = 2,
board_ahci_ign_iferr = 3, board_ahci_ign_iferr = 3,
board_ahci_sb600 = 4, board_ahci_sb600 = 4,
board_ahci_mv = 5,
/* global controller registers */ /* global controller registers */
HOST_CAP = 0x00, /* host capabilities */ HOST_CAP = 0x00, /* host capabilities */
...@@ -171,6 +172,8 @@ enum { ...@@ -171,6 +172,8 @@ enum {
AHCI_FLAG_HONOR_PI = (1 << 26), /* honor PORTS_IMPL */ AHCI_FLAG_HONOR_PI = (1 << 26), /* honor PORTS_IMPL */
AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */ AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */
AHCI_FLAG_32BIT_ONLY = (1 << 28), /* force 32bit */ AHCI_FLAG_32BIT_ONLY = (1 << 28), /* force 32bit */
AHCI_FLAG_MV_PATA = (1 << 29), /* PATA port */
AHCI_FLAG_NO_MSI = (1 << 30), /* no PCI MSI */
AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
...@@ -228,9 +231,12 @@ static void ahci_thaw(struct ata_port *ap); ...@@ -228,9 +231,12 @@ static void ahci_thaw(struct ata_port *ap);
static void ahci_error_handler(struct ata_port *ap); static void ahci_error_handler(struct ata_port *ap);
static void ahci_vt8251_error_handler(struct ata_port *ap); static void ahci_vt8251_error_handler(struct ata_port *ap);
static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
static int ahci_port_resume(struct ata_port *ap);
static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl);
static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
u32 opts);
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg); static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
static int ahci_port_resume(struct ata_port *ap);
static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
static int ahci_pci_device_resume(struct pci_dev *pdev); static int ahci_pci_device_resume(struct pci_dev *pdev);
#endif #endif
...@@ -327,14 +333,14 @@ static const struct ata_port_info ahci_port_info[] = { ...@@ -327,14 +333,14 @@ static const struct ata_port_info ahci_port_info[] = {
{ {
.flags = AHCI_FLAG_COMMON, .flags = AHCI_FLAG_COMMON,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
/* board_ahci_pi */ /* board_ahci_pi */
{ {
.flags = AHCI_FLAG_COMMON | AHCI_FLAG_HONOR_PI, .flags = AHCI_FLAG_COMMON | AHCI_FLAG_HONOR_PI,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
/* board_ahci_vt8251 */ /* board_ahci_vt8251 */
...@@ -342,14 +348,14 @@ static const struct ata_port_info ahci_port_info[] = { ...@@ -342,14 +348,14 @@ static const struct ata_port_info ahci_port_info[] = {
.flags = AHCI_FLAG_COMMON | ATA_FLAG_HRST_TO_RESUME | .flags = AHCI_FLAG_COMMON | ATA_FLAG_HRST_TO_RESUME |
AHCI_FLAG_NO_NCQ, AHCI_FLAG_NO_NCQ,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &ahci_vt8251_ops, .port_ops = &ahci_vt8251_ops,
}, },
/* board_ahci_ign_iferr */ /* board_ahci_ign_iferr */
{ {
.flags = AHCI_FLAG_COMMON | AHCI_FLAG_IGN_IRQ_IF_ERR, .flags = AHCI_FLAG_COMMON | AHCI_FLAG_IGN_IRQ_IF_ERR,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
/* board_ahci_sb600 */ /* board_ahci_sb600 */
...@@ -358,7 +364,19 @@ static const struct ata_port_info ahci_port_info[] = { ...@@ -358,7 +364,19 @@ static const struct ata_port_info ahci_port_info[] = {
AHCI_FLAG_IGN_SERR_INTERNAL | AHCI_FLAG_IGN_SERR_INTERNAL |
AHCI_FLAG_32BIT_ONLY, AHCI_FLAG_32BIT_ONLY,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops,
},
/* board_ahci_mv */
{
.sht = &ahci_sht,
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
ATA_FLAG_SKIP_D2H_BSY | AHCI_FLAG_HONOR_PI |
AHCI_FLAG_NO_NCQ | AHCI_FLAG_NO_MSI |
AHCI_FLAG_MV_PATA,
.pio_mask = 0x1f, /* pio0-4 */
.udma_mask = ATA_UDMA6,
.port_ops = &ahci_ops, .port_ops = &ahci_ops,
}, },
}; };
...@@ -456,6 +474,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { ...@@ -456,6 +474,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
{ PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 966 */ { PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 966 */
{ PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */ { PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
/* Marvell */
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
/* Generic, PCI class code for AHCI */ /* Generic, PCI class code for AHCI */
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci }, PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
...@@ -481,11 +502,17 @@ static inline int ahci_nr_ports(u32 cap) ...@@ -481,11 +502,17 @@ static inline int ahci_nr_ports(u32 cap)
return (cap & 0x1f) + 1; return (cap & 0x1f) + 1;
} }
static inline void __iomem *ahci_port_base(struct ata_port *ap) static inline void __iomem *__ahci_port_base(struct ata_host *host,
unsigned int port_no)
{ {
void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR]; void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
return mmio + 0x100 + (port_no * 0x80);
}
return mmio + 0x100 + (ap->port_no * 0x80); static inline void __iomem *ahci_port_base(struct ata_port *ap)
{
return __ahci_port_base(ap->host, ap->port_no);
} }
/** /**
...@@ -535,6 +562,20 @@ static void ahci_save_initial_config(struct pci_dev *pdev, ...@@ -535,6 +562,20 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
hpriv->saved_port_map = port_map; hpriv->saved_port_map = port_map;
} }
/*
* Temporary Marvell 6145 hack: PATA port presence
* is asserted through the standard AHCI port
* presence register, as bit 4 (counting from 0)
*/
if (pi->flags & AHCI_FLAG_MV_PATA) {
dev_printk(KERN_ERR, &pdev->dev,
"MV_AHCI HACK: port_map %x -> %x\n",
hpriv->port_map,
hpriv->port_map & 0xf);
port_map &= 0xf;
}
/* cross check port_map and cap.n_ports */ /* cross check port_map and cap.n_ports */
if (pi->flags & AHCI_FLAG_HONOR_PI) { if (pi->flags & AHCI_FLAG_HONOR_PI) {
u32 tmp_port_map = port_map; u32 tmp_port_map = port_map;
...@@ -740,7 +781,7 @@ static void ahci_power_down(struct ata_port *ap) ...@@ -740,7 +781,7 @@ static void ahci_power_down(struct ata_port *ap)
} }
#endif #endif
static void ahci_init_port(struct ata_port *ap) static void ahci_start_port(struct ata_port *ap)
{ {
/* enable FIS reception */ /* enable FIS reception */
ahci_start_fis_rx(ap); ahci_start_fis_rx(ap);
...@@ -814,39 +855,62 @@ static int ahci_reset_controller(struct ata_host *host) ...@@ -814,39 +855,62 @@ static int ahci_reset_controller(struct ata_host *host)
return 0; return 0;
} }
static void ahci_port_init(struct pci_dev *pdev, struct ata_port *ap,
int port_no, void __iomem *mmio,
void __iomem *port_mmio)
{
const char *emsg = NULL;
int rc;
u32 tmp;
/* make sure port is not active */
rc = ahci_deinit_port(ap, &emsg);
if (rc)
dev_printk(KERN_WARNING, &pdev->dev,
"%s (%d)\n", emsg, rc);
/* clear SError */
tmp = readl(port_mmio + PORT_SCR_ERR);
VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
writel(tmp, port_mmio + PORT_SCR_ERR);
/* clear port IRQ */
tmp = readl(port_mmio + PORT_IRQ_STAT);
VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
if (tmp)
writel(tmp, port_mmio + PORT_IRQ_STAT);
writel(1 << port_no, mmio + HOST_IRQ_STAT);
}
static void ahci_init_controller(struct ata_host *host) static void ahci_init_controller(struct ata_host *host)
{ {
struct pci_dev *pdev = to_pci_dev(host->dev); struct pci_dev *pdev = to_pci_dev(host->dev);
void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
int i, rc; int i;
void __iomem *port_mmio;
u32 tmp; u32 tmp;
for (i = 0; i < host->n_ports; i++) { if (host->ports[0]->flags & AHCI_FLAG_MV_PATA) {
struct ata_port *ap = host->ports[i]; port_mmio = __ahci_port_base(host, 4);
void __iomem *port_mmio = ahci_port_base(ap);
const char *emsg = NULL;
if (ata_port_is_dummy(ap))
continue;
/* make sure port is not active */
rc = ahci_deinit_port(ap, &emsg);
if (rc)
dev_printk(KERN_WARNING, &pdev->dev,
"%s (%d)\n", emsg, rc);
/* clear SError */ writel(0, port_mmio + PORT_IRQ_MASK);
tmp = readl(port_mmio + PORT_SCR_ERR);
VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
writel(tmp, port_mmio + PORT_SCR_ERR);
/* clear port IRQ */ /* clear port IRQ */
tmp = readl(port_mmio + PORT_IRQ_STAT); tmp = readl(port_mmio + PORT_IRQ_STAT);
VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp); VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
if (tmp) if (tmp)
writel(tmp, port_mmio + PORT_IRQ_STAT); writel(tmp, port_mmio + PORT_IRQ_STAT);
}
writel(1 << i, mmio + HOST_IRQ_STAT); for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
port_mmio = ahci_port_base(ap);
if (ata_port_is_dummy(ap))
continue;
ahci_port_init(pdev, ap, i, mmio, port_mmio);
} }
tmp = readl(mmio + HOST_CTL); tmp = readl(mmio + HOST_CTL);
...@@ -1232,7 +1296,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) ...@@ -1232,7 +1296,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
ata_port_abort(ap); ata_port_abort(ap);
} }
static void ahci_host_intr(struct ata_port *ap) static void ahci_port_intr(struct ata_port *ap)
{ {
void __iomem *port_mmio = ap->ioaddr.cmd_addr; void __iomem *port_mmio = ap->ioaddr.cmd_addr;
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->eh_info;
...@@ -1358,7 +1422,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) ...@@ -1358,7 +1422,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
ap = host->ports[i]; ap = host->ports[i];
if (ap) { if (ap) {
ahci_host_intr(ap); ahci_port_intr(ap);
VPRINTK("port %u\n", i); VPRINTK("port %u\n", i);
} else { } else {
VPRINTK("port %u (no irq)\n", i); VPRINTK("port %u (no irq)\n", i);
...@@ -1466,7 +1530,7 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) ...@@ -1466,7 +1530,7 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
ahci_power_down(ap); ahci_power_down(ap);
else { else {
ata_port_printk(ap, KERN_ERR, "%s (%d)\n", emsg, rc); ata_port_printk(ap, KERN_ERR, "%s (%d)\n", emsg, rc);
ahci_init_port(ap); ahci_start_port(ap);
} }
return rc; return rc;
...@@ -1475,7 +1539,7 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) ...@@ -1475,7 +1539,7 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
static int ahci_port_resume(struct ata_port *ap) static int ahci_port_resume(struct ata_port *ap)
{ {
ahci_power_up(ap); ahci_power_up(ap);
ahci_init_port(ap); ahci_start_port(ap);
return 0; return 0;
} }
...@@ -1573,13 +1637,8 @@ static int ahci_port_start(struct ata_port *ap) ...@@ -1573,13 +1637,8 @@ static int ahci_port_start(struct ata_port *ap)
ap->private_data = pp; ap->private_data = pp;
/* power up port */ /* engage engines, captain */
ahci_power_up(ap); return ahci_port_resume(ap);
/* initialize port */
ahci_init_port(ap);
return 0;
} }
static void ahci_port_stop(struct ata_port *ap) static void ahci_port_stop(struct ata_port *ap)
...@@ -1724,7 +1783,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1724,7 +1783,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc) if (rc)
return rc; return rc;
if (pci_enable_msi(pdev)) if ((pi.flags & AHCI_FLAG_NO_MSI) || pci_enable_msi(pdev))
pci_intx(pdev, 1); pci_intx(pdev, 1);
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
...@@ -1745,14 +1804,18 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1745,14 +1804,18 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
host->private_data = hpriv; host->private_data = hpriv;
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
if (hpriv->port_map & (1 << i)) { struct ata_port *ap = host->ports[i];
struct ata_port *ap = host->ports[i]; void __iomem *port_mmio = ahci_port_base(ap);
void __iomem *port_mmio = ahci_port_base(ap);
/* standard SATA port setup */
if (hpriv->port_map & (1 << i)) {
ap->ioaddr.cmd_addr = port_mmio; ap->ioaddr.cmd_addr = port_mmio;
ap->ioaddr.scr_addr = port_mmio + PORT_SCR; ap->ioaddr.scr_addr = port_mmio + PORT_SCR;
} else }
host->ports[i]->ops = &ata_dummy_port_ops;
/* disabled/not-implemented port */
else
ap->ops = &ata_dummy_port_ops;
} }
/* initialize adapter */ /* initialize adapter */
......
...@@ -143,10 +143,10 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id ...@@ -143,10 +143,10 @@ 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 = {
.sht = &generic_sht, .sht = &generic_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &generic_port_ops .port_ops = &generic_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };
......
...@@ -200,6 +200,8 @@ static const struct pci_device_id piix_pci_tbl[] = { ...@@ -200,6 +200,8 @@ static const struct pci_device_id piix_pci_tbl[] = {
/* ICH7/7-R (i945, i975) UDMA 100*/ /* ICH7/7-R (i945, i975) UDMA 100*/
{ 0x8086, 0x27DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_133 }, { 0x8086, 0x27DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_133 },
{ 0x8086, 0x269E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 }, { 0x8086, 0x269E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
/* ICH8 Mobile PATA Controller */
{ 0x8086, 0x2850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
/* NOTE: The following PCI ids must be kept in sync with the /* NOTE: The following PCI ids must be kept in sync with the
* list in drivers/pci/quirks.c. * list in drivers/pci/quirks.c.
...@@ -495,7 +497,7 @@ static struct ata_port_info piix_port_info[] = { ...@@ -495,7 +497,7 @@ static struct ata_port_info piix_port_info[] = {
.flags = PIIX_SATA_FLAGS, .flags = PIIX_SATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
...@@ -505,7 +507,7 @@ static struct ata_port_info piix_port_info[] = { ...@@ -505,7 +507,7 @@ static struct ata_port_info piix_port_info[] = {
.flags = PIIX_SATA_FLAGS | PIIX_FLAG_SCR, .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SCR,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
...@@ -516,7 +518,7 @@ static struct ata_port_info piix_port_info[] = { ...@@ -516,7 +518,7 @@ static struct ata_port_info piix_port_info[] = {
PIIX_FLAG_AHCI, PIIX_FLAG_AHCI,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
...@@ -527,7 +529,7 @@ static struct ata_port_info piix_port_info[] = { ...@@ -527,7 +529,7 @@ static struct ata_port_info piix_port_info[] = {
PIIX_FLAG_AHCI, PIIX_FLAG_AHCI,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
...@@ -538,7 +540,7 @@ static struct ata_port_info piix_port_info[] = { ...@@ -538,7 +540,7 @@ static struct ata_port_info piix_port_info[] = {
PIIX_FLAG_AHCI, PIIX_FLAG_AHCI,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
...@@ -685,8 +687,14 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev) ...@@ -685,8 +687,14 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
if (adev->class == ATA_DEV_ATA) if (adev->class == ATA_DEV_ATA)
control |= 4; /* PPE enable */ control |= 4; /* PPE enable */
/* PIO configuration clears DTE unconditionally. It will be
* programmed in set_dmamode which is guaranteed to be called
* after set_piomode if any DMA mode is available.
*/
pci_read_config_word(dev, master_port, &master_data); pci_read_config_word(dev, master_port, &master_data);
if (is_slave) { if (is_slave) {
/* clear TIME1|IE1|PPE1|DTE1 */
master_data &= 0xff0f;
/* Enable SITRE (seperate slave timing register) */ /* Enable SITRE (seperate slave timing register) */
master_data |= 0x4000; master_data |= 0x4000;
/* enable PPE1, IE1 and TIME1 as needed */ /* enable PPE1, IE1 and TIME1 as needed */
...@@ -694,12 +702,14 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev) ...@@ -694,12 +702,14 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
pci_read_config_byte(dev, slave_port, &slave_data); pci_read_config_byte(dev, slave_port, &slave_data);
slave_data &= (ap->port_no ? 0x0f : 0xf0); slave_data &= (ap->port_no ? 0x0f : 0xf0);
/* Load the timing nibble for this slave */ /* Load the timing nibble for this slave */
slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0); slave_data |= ((timings[pio][0] << 2) | timings[pio][1])
<< (ap->port_no ? 4 : 0);
} else { } else {
/* Master keeps the bits in a different format */ /* clear ISP|RCT|TIME0|IE0|PPE0|DTE0 */
master_data &= 0xccf8; master_data &= 0xccf0;
/* Enable PPE, IE and TIME as appropriate */ /* Enable PPE, IE and TIME as appropriate */
master_data |= control; master_data |= control;
/* load ISP and RCT */
master_data |= master_data |=
(timings[pio][0] << 12) | (timings[pio][0] << 12) |
(timings[pio][1] << 8); (timings[pio][1] << 8);
...@@ -816,7 +826,7 @@ static void do_pata_set_dmamode (struct ata_port *ap, struct ata_device *adev, i ...@@ -816,7 +826,7 @@ static void do_pata_set_dmamode (struct ata_port *ap, struct ata_device *adev, i
master_data &= 0xFF4F; /* Mask out IORDY|TIME1|DMAONLY */ master_data &= 0xFF4F; /* Mask out IORDY|TIME1|DMAONLY */
master_data |= control << 4; master_data |= control << 4;
pci_read_config_byte(dev, 0x44, &slave_data); pci_read_config_byte(dev, 0x44, &slave_data);
slave_data &= (0x0F + 0xE1 * ap->port_no); slave_data &= (ap->port_no ? 0x0f : 0xf0);
/* Load the matching timing */ /* Load the matching timing */
slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0); slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
pci_write_config_byte(dev, 0x44, slave_data); pci_write_config_byte(dev, 0x44, slave_data);
...@@ -828,8 +838,11 @@ static void do_pata_set_dmamode (struct ata_port *ap, struct ata_device *adev, i ...@@ -828,8 +838,11 @@ static void do_pata_set_dmamode (struct ata_port *ap, struct ata_device *adev, i
(timings[pio][0] << 12) | (timings[pio][0] << 12) |
(timings[pio][1] << 8); (timings[pio][1] << 8);
} }
udma_enable &= ~(1 << devid);
pci_write_config_word(dev, master_port, master_data); if (ap->udma_mask) {
udma_enable &= ~(1 << devid);
pci_write_config_word(dev, master_port, master_data);
}
} }
/* Don't scribble on 0x48 if the controller does not support UDMA */ /* Don't scribble on 0x48 if the controller does not support UDMA */
if (ap->udma_mask) if (ap->udma_mask)
......
This diff is collapsed.
...@@ -1845,7 +1845,8 @@ static void ata_dev_config_ncq(struct ata_device *dev, ...@@ -1845,7 +1845,8 @@ static void ata_dev_config_ncq(struct ata_device *dev,
int ata_dev_configure(struct ata_device *dev) int ata_dev_configure(struct ata_device *dev)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->ap;
int print_info = ap->eh_context.i.flags & ATA_EHI_PRINTINFO; struct ata_eh_context *ehc = &ap->eh_context;
int print_info = ehc->i.flags & ATA_EHI_PRINTINFO;
const u16 *id = dev->id; const u16 *id = dev->id;
unsigned int xfer_mask; unsigned int xfer_mask;
char revbuf[7]; /* XYZ-99\0 */ char revbuf[7]; /* XYZ-99\0 */
...@@ -1862,15 +1863,10 @@ int ata_dev_configure(struct ata_device *dev) ...@@ -1862,15 +1863,10 @@ int ata_dev_configure(struct ata_device *dev)
if (ata_msg_probe(ap)) if (ata_msg_probe(ap))
ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __FUNCTION__); ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __FUNCTION__);
/* set _SDD */ /* let ACPI work its magic */
rc = ata_acpi_push_id(dev); rc = ata_acpi_on_devcfg(dev);
if (rc) { if (rc)
ata_dev_printk(dev, KERN_WARNING, "failed to set _SDD(%d)\n", return rc;
rc);
}
/* retrieve and execute the ATA task file of _GTF */
ata_acpi_exec_tfs(ap);
/* print device capabilities */ /* print device capabilities */
if (ata_msg_probe(ap)) if (ata_msg_probe(ap))
...@@ -3359,7 +3355,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline) ...@@ -3359,7 +3355,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
return 0; return 0;
/* if SATA, resume phy */ /* if SATA, resume phy */
if (ap->cbl == ATA_CBL_SATA) { if (ap->flags & ATA_FLAG_SATA) {
rc = sata_phy_resume(ap, timing, deadline); rc = sata_phy_resume(ap, timing, deadline);
/* whine about phy resume failure but proceed */ /* whine about phy resume failure but proceed */
if (rc && rc != -EOPNOTSUPP) if (rc && rc != -EOPNOTSUPP)
...@@ -4106,6 +4102,68 @@ static void ata_fill_sg(struct ata_queued_cmd *qc) ...@@ -4106,6 +4102,68 @@ static void ata_fill_sg(struct ata_queued_cmd *qc)
ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
} }
/**
* ata_fill_sg_dumb - Fill PCI IDE PRD table
* @qc: Metadata associated with taskfile to be transferred
*
* Fill PCI IDE PRD (scatter-gather) table with segments
* associated with the current disk command. Perform the fill
* so that we avoid writing any length 64K records for
* controllers that don't follow the spec.
*
* LOCKING:
* spin_lock_irqsave(host lock)
*
*/
static void ata_fill_sg_dumb(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;
struct scatterlist *sg;
unsigned int idx;
WARN_ON(qc->__sg == NULL);
WARN_ON(qc->n_elem == 0 && qc->pad_len == 0);
idx = 0;
ata_for_each_sg(sg, qc) {
u32 addr, offset;
u32 sg_len, len, blen;
/* determine if physical DMA addr spans 64K boundary.
* Note h/w doesn't support 64-bit, so we unconditionally
* truncate dma_addr_t to u32.
*/
addr = (u32) sg_dma_address(sg);
sg_len = sg_dma_len(sg);
while (sg_len) {
offset = addr & 0xffff;
len = sg_len;
if ((offset + sg_len) > 0x10000)
len = 0x10000 - offset;
blen = len & 0xffff;
ap->prd[idx].addr = cpu_to_le32(addr);
if (blen == 0) {
/* Some PATA chipsets like the CS5530 can't
cope with 0x0000 meaning 64K as the spec says */
ap->prd[idx].flags_len = cpu_to_le32(0x8000);
blen = 0x8000;
ap->prd[++idx].addr = cpu_to_le32(addr + 0x8000);
}
ap->prd[idx].flags_len = cpu_to_le32(blen);
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
idx++;
sg_len -= len;
addr += len;
}
}
if (idx)
ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
}
/** /**
* ata_check_atapi_dma - Check whether ATAPI DMA can be supported * ata_check_atapi_dma - Check whether ATAPI DMA can be supported
* @qc: Metadata associated with taskfile to check * @qc: Metadata associated with taskfile to check
...@@ -4153,6 +4211,23 @@ void ata_qc_prep(struct ata_queued_cmd *qc) ...@@ -4153,6 +4211,23 @@ void ata_qc_prep(struct ata_queued_cmd *qc)
ata_fill_sg(qc); ata_fill_sg(qc);
} }
/**
* ata_dumb_qc_prep - Prepare taskfile for submission
* @qc: Metadata associated with taskfile to be prepared
*
* Prepare ATA taskfile for submission.
*
* LOCKING:
* spin_lock_irqsave(host lock)
*/
void ata_dumb_qc_prep(struct ata_queued_cmd *qc)
{
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
return;
ata_fill_sg_dumb(qc);
}
void ata_noop_qc_prep(struct ata_queued_cmd *qc) { } void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
/** /**
...@@ -5660,7 +5735,7 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance) ...@@ -5660,7 +5735,7 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance)
*/ */
int sata_scr_valid(struct ata_port *ap) int sata_scr_valid(struct ata_port *ap)
{ {
return ap->cbl == ATA_CBL_SATA && ap->ops->scr_read; return (ap->flags & ATA_FLAG_SATA) && ap->ops->scr_read;
} }
/** /**
...@@ -6293,6 +6368,9 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) ...@@ -6293,6 +6368,9 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
if (rc) if (rc)
return rc; return rc;
/* associate with ACPI nodes */
ata_acpi_associate(host);
/* set cable, sata_spd_limit and report */ /* set cable, sata_spd_limit and report */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
...@@ -6324,7 +6402,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) ...@@ -6324,7 +6402,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
if (!ata_port_is_dummy(ap)) if (!ata_port_is_dummy(ap))
ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%p " ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%p "
"ctl 0x%p bmdma 0x%p irq %d\n", "ctl 0x%p bmdma 0x%p irq %d\n",
ap->cbl == ATA_CBL_SATA ? 'S' : 'P', (ap->flags & ATA_FLAG_SATA) ? 'S' : 'P',
ata_mode_string(xfer_mask), ata_mode_string(xfer_mask),
ap->ioaddr.cmd_addr, ap->ioaddr.cmd_addr,
ap->ioaddr.ctl_addr, ap->ioaddr.ctl_addr,
...@@ -6822,6 +6900,7 @@ EXPORT_SYMBOL_GPL(ata_do_set_mode); ...@@ -6822,6 +6900,7 @@ EXPORT_SYMBOL_GPL(ata_do_set_mode);
EXPORT_SYMBOL_GPL(ata_data_xfer); EXPORT_SYMBOL_GPL(ata_data_xfer);
EXPORT_SYMBOL_GPL(ata_data_xfer_noirq); EXPORT_SYMBOL_GPL(ata_data_xfer_noirq);
EXPORT_SYMBOL_GPL(ata_qc_prep); EXPORT_SYMBOL_GPL(ata_qc_prep);
EXPORT_SYMBOL_GPL(ata_dumb_qc_prep);
EXPORT_SYMBOL_GPL(ata_noop_qc_prep); EXPORT_SYMBOL_GPL(ata_noop_qc_prep);
EXPORT_SYMBOL_GPL(ata_bmdma_setup); EXPORT_SYMBOL_GPL(ata_bmdma_setup);
EXPORT_SYMBOL_GPL(ata_bmdma_start); EXPORT_SYMBOL_GPL(ata_bmdma_start);
......
...@@ -2154,19 +2154,25 @@ static void ata_eh_handle_port_suspend(struct ata_port *ap) ...@@ -2154,19 +2154,25 @@ static void ata_eh_handle_port_suspend(struct ata_port *ap)
WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED); WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED);
/* tell ACPI we're suspending */
rc = ata_acpi_on_suspend(ap);
if (rc)
goto out;
/* suspend */ /* suspend */
ata_eh_freeze_port(ap); ata_eh_freeze_port(ap);
if (ap->ops->port_suspend) if (ap->ops->port_suspend)
rc = ap->ops->port_suspend(ap, ap->pm_mesg); rc = ap->ops->port_suspend(ap, ap->pm_mesg);
out:
/* report result */ /* report result */
spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags);
ap->pflags &= ~ATA_PFLAG_PM_PENDING; ap->pflags &= ~ATA_PFLAG_PM_PENDING;
if (rc == 0) if (rc == 0)
ap->pflags |= ATA_PFLAG_SUSPENDED; ap->pflags |= ATA_PFLAG_SUSPENDED;
else else if (ap->pflags & ATA_PFLAG_FROZEN)
ata_port_schedule_eh(ap); ata_port_schedule_eh(ap);
if (ap->pm_result) { if (ap->pm_result) {
...@@ -2207,6 +2213,9 @@ static void ata_eh_handle_port_resume(struct ata_port *ap) ...@@ -2207,6 +2213,9 @@ static void ata_eh_handle_port_resume(struct ata_port *ap)
if (ap->ops->port_resume) if (ap->ops->port_resume)
rc = ap->ops->port_resume(ap); rc = ap->ops->port_resume(ap);
/* tell ACPI that we're resuming */
ata_acpi_on_resume(ap);
/* report result */ /* report result */
spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags);
ap->pflags &= ~(ATA_PFLAG_PM_PENDING | ATA_PFLAG_SUSPENDED); ap->pflags &= ~(ATA_PFLAG_PM_PENDING | ATA_PFLAG_SUSPENDED);
......
...@@ -2620,7 +2620,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) ...@@ -2620,7 +2620,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
ata_dev_printk(dev, KERN_WARNING, ata_dev_printk(dev, KERN_WARNING,
"invalid multi_count %u ignored\n", "invalid multi_count %u ignored\n",
multi_count); multi_count);
} }
/* READ/WRITE LONG use a non-standard sect_size */ /* READ/WRITE LONG use a non-standard sect_size */
qc->sect_size = ATA_SECT_SIZE; qc->sect_size = ATA_SECT_SIZE;
......
...@@ -98,17 +98,15 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host); ...@@ -98,17 +98,15 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host);
/* libata-acpi.c */ /* libata-acpi.c */
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
extern int ata_acpi_exec_tfs(struct ata_port *ap); extern void ata_acpi_associate(struct ata_host *host);
extern int ata_acpi_push_id(struct ata_device *dev); extern int ata_acpi_on_suspend(struct ata_port *ap);
extern void ata_acpi_on_resume(struct ata_port *ap);
extern int ata_acpi_on_devcfg(struct ata_device *adev);
#else #else
static inline int ata_acpi_exec_tfs(struct ata_port *ap) static inline void ata_acpi_associate(struct ata_host *host) { }
{ static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
return 0; static inline void ata_acpi_on_resume(struct ata_port *ap) { }
} static inline int ata_acpi_on_devcfg(struct ata_device *adev) { return 0; }
static inline int ata_acpi_push_id(struct ata_device *dev)
{
return 0;
}
#endif #endif
/* libata-scsi.c */ /* libata-scsi.c */
......
...@@ -520,14 +520,14 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -520,14 +520,14 @@ 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 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.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 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.port_ops = &ali_20_port_ops .port_ops = &ali_20_port_ops
...@@ -535,7 +535,7 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -535,7 +535,7 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* 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 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x07, /* UDMA33 */ .udma_mask = 0x07, /* UDMA33 */
...@@ -544,37 +544,37 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -544,37 +544,37 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* Revision 0xC2 adds UDMA66 */ /* Revision 0xC2 adds UDMA66 */
static const struct ata_port_info info_c2 = { static const struct ata_port_info info_c2 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, .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 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, .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 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_PIO_LBA48, .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_PIO_LBA48,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &ali_c2_port_ops .port_ops = &ali_c2_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 = {
.sht = &ali_sht, .sht = &ali_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &ali_c5_port_ops .port_ops = &ali_c5_port_ops
}; };
......
...@@ -541,7 +541,7 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -541,7 +541,7 @@ 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 */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, /* No SWDMA */ .mwdma_mask = 0x07, /* No SWDMA */
.udma_mask = 0x07, /* UDMA 33 */ .udma_mask = 0x07, /* UDMA 33 */
...@@ -549,74 +549,74 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -549,74 +549,74 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
}, },
{ /* 1: Early AMD7409 - no swdma */ { /* 1: Early AMD7409 - no swdma */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, /* UDMA 66 */ .udma_mask = ATA_UDMA4, /* UDMA 66 */
.port_ops = &amd66_port_ops .port_ops = &amd66_port_ops
}, },
{ /* 2: AMD 7409, no swdma errata */ { /* 2: AMD 7409, no swdma errata */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, /* UDMA 66 */ .udma_mask = ATA_UDMA4, /* UDMA 66 */
.port_ops = &amd66_port_ops .port_ops = &amd66_port_ops
}, },
{ /* 3: AMD 7411 */ { /* 3: AMD 7411 */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, /* UDMA 100 */ .udma_mask = ATA_UDMA5, /* UDMA 100 */
.port_ops = &amd100_port_ops .port_ops = &amd100_port_ops
}, },
{ /* 4: AMD 7441 */ { /* 4: AMD 7441 */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, /* UDMA 100 */ .udma_mask = ATA_UDMA5, /* UDMA 100 */
.port_ops = &amd100_port_ops .port_ops = &amd100_port_ops
}, },
{ /* 5: AMD 8111*/ { /* 5: AMD 8111*/
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, /* UDMA 133, no swdma */ .udma_mask = ATA_UDMA6, /* UDMA 133, no swdma */
.port_ops = &amd133_port_ops .port_ops = &amd133_port_ops
}, },
{ /* 6: AMD 8111 UDMA 100 (Serenade) */ { /* 6: AMD 8111 UDMA 100 (Serenade) */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, /* UDMA 100, no swdma */ .udma_mask = ATA_UDMA5, /* UDMA 100, no swdma */
.port_ops = &amd133_port_ops .port_ops = &amd133_port_ops
}, },
{ /* 7: Nvidia Nforce */ { /* 7: Nvidia Nforce */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, /* UDMA 100 */ .udma_mask = ATA_UDMA5, /* UDMA 100 */
.port_ops = &nv100_port_ops .port_ops = &nv100_port_ops
}, },
{ /* 8: Nvidia Nforce2 and later */ { /* 8: Nvidia Nforce2 and later */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, /* UDMA 133, no swdma */ .udma_mask = ATA_UDMA6, /* UDMA 133, no swdma */
.port_ops = &nv133_port_ops .port_ops = &nv133_port_ops
}, },
{ /* 9: AMD CS5536 (Geode companion) */ { /* 9: AMD CS5536 (Geode companion) */
.sht = &amd_sht, .sht = &amd_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, /* UDMA 100 */ .udma_mask = ATA_UDMA5, /* UDMA 100 */
.port_ops = &amd100_port_ops .port_ops = &amd100_port_ops
} }
}; };
......
...@@ -416,7 +416,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -416,7 +416,7 @@ 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 = {
.sht = &artop_sht, .sht = &artop_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
...@@ -424,7 +424,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -424,7 +424,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
}; };
static const struct ata_port_info info_626x = { static const struct ata_port_info info_626x = {
.sht = &artop_sht, .sht = &artop_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
...@@ -432,7 +432,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -432,7 +432,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
}; };
static const struct ata_port_info info_626x_fast = { static const struct ata_port_info info_626x_fast = {
.sht = &artop_sht, .sht = &artop_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
......
...@@ -270,7 +270,7 @@ static int atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -270,7 +270,7 @@ static int atiixp_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 = {
.sht = &atiixp_sht, .sht = &atiixp_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x06, /* No MWDMA0 support */ .mwdma_mask = 0x06, /* No MWDMA0 support */
.udma_mask = 0x3F, .udma_mask = 0x3F,
...@@ -285,6 +285,7 @@ static const struct pci_device_id atiixp[] = { ...@@ -285,6 +285,7 @@ static const struct pci_device_id atiixp[] = {
{ PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP300_IDE), }, { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP300_IDE), },
{ PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP400_IDE), }, { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP400_IDE), },
{ PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP600_IDE), }, { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP600_IDE), },
{ PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP700_IDE), },
{ }, { },
}; };
......
...@@ -251,7 +251,7 @@ static int cmd640_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -251,7 +251,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 = {
.sht = &cmd640_sht, .sht = &cmd640_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.port_ops = &cmd640_port_ops .port_ops = &cmd640_port_ops
}; };
......
...@@ -380,21 +380,21 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -380,21 +380,21 @@ 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 */
.sht = &cmd64x_sht, .sht = &cmd64x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.port_ops = &cmd64x_port_ops .port_ops = &cmd64x_port_ops
}, },
{ /* CMD 646 with broken UDMA */ { /* CMD 646 with broken UDMA */
.sht = &cmd64x_sht, .sht = &cmd64x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.port_ops = &cmd64x_port_ops .port_ops = &cmd64x_port_ops
}, },
{ /* CMD 646 with working UDMA */ { /* CMD 646 with working UDMA */
.sht = &cmd64x_sht, .sht = &cmd64x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA1, .udma_mask = ATA_UDMA1,
...@@ -402,14 +402,14 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -402,14 +402,14 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
}, },
{ /* CMD 646 rev 1 */ { /* CMD 646 rev 1 */
.sht = &cmd64x_sht, .sht = &cmd64x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.port_ops = &cmd646r1_port_ops .port_ops = &cmd646r1_port_ops
}, },
{ /* CMD 648 */ { /* CMD 648 */
.sht = &cmd64x_sht, .sht = &cmd64x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
...@@ -417,7 +417,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -417,7 +417,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
}, },
{ /* CMD 649 */ { /* CMD 649 */
.sht = &cmd64x_sht, .sht = &cmd64x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA3, .udma_mask = ATA_UDMA3,
......
...@@ -146,7 +146,7 @@ static struct scsi_host_template cs5520_sht = { ...@@ -146,7 +146,7 @@ static struct scsi_host_template cs5520_sht = {
.queuecommand = ata_scsi_queuecmd, .queuecommand = ata_scsi_queuecmd,
.can_queue = ATA_DEF_QUEUE, .can_queue = ATA_DEF_QUEUE,
.this_id = ATA_SHT_THIS_ID, .this_id = ATA_SHT_THIS_ID,
.sg_tablesize = LIBATA_MAX_PRD, .sg_tablesize = LIBATA_DUMB_MAX_PRD,
.cmd_per_lun = ATA_SHT_CMD_PER_LUN, .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
.emulated = ATA_SHT_EMULATED, .emulated = ATA_SHT_EMULATED,
.use_clustering = ATA_SHT_USE_CLUSTERING, .use_clustering = ATA_SHT_USE_CLUSTERING,
...@@ -178,7 +178,7 @@ static struct ata_port_operations cs5520_port_ops = { ...@@ -178,7 +178,7 @@ static struct ata_port_operations cs5520_port_ops = {
.bmdma_start = ata_bmdma_start, .bmdma_start = ata_bmdma_start,
.bmdma_stop = ata_bmdma_stop, .bmdma_stop = ata_bmdma_stop,
.bmdma_status = ata_bmdma_status, .bmdma_status = ata_bmdma_status,
.qc_prep = ata_qc_prep, .qc_prep = ata_dumb_qc_prep,
.qc_issue = ata_qc_issue_prot, .qc_issue = ata_qc_issue_prot,
.data_xfer = ata_data_xfer, .data_xfer = ata_data_xfer,
......
...@@ -167,7 +167,7 @@ static struct scsi_host_template cs5530_sht = { ...@@ -167,7 +167,7 @@ static struct scsi_host_template cs5530_sht = {
.queuecommand = ata_scsi_queuecmd, .queuecommand = ata_scsi_queuecmd,
.can_queue = ATA_DEF_QUEUE, .can_queue = ATA_DEF_QUEUE,
.this_id = ATA_SHT_THIS_ID, .this_id = ATA_SHT_THIS_ID,
.sg_tablesize = LIBATA_MAX_PRD, .sg_tablesize = LIBATA_DUMB_MAX_PRD,
.cmd_per_lun = ATA_SHT_CMD_PER_LUN, .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
.emulated = ATA_SHT_EMULATED, .emulated = ATA_SHT_EMULATED,
.use_clustering = ATA_SHT_USE_CLUSTERING, .use_clustering = ATA_SHT_USE_CLUSTERING,
...@@ -201,7 +201,7 @@ static struct ata_port_operations cs5530_port_ops = { ...@@ -201,7 +201,7 @@ static struct ata_port_operations cs5530_port_ops = {
.post_internal_cmd = ata_bmdma_post_internal_cmd, .post_internal_cmd = ata_bmdma_post_internal_cmd,
.cable_detect = ata_cable_40wire, .cable_detect = ata_cable_40wire,
.qc_prep = ata_qc_prep, .qc_prep = ata_dumb_qc_prep,
.qc_issue = cs5530_qc_issue_prot, .qc_issue = cs5530_qc_issue_prot,
.data_xfer = ata_data_xfer, .data_xfer = ata_data_xfer,
...@@ -337,7 +337,7 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -337,7 +337,7 @@ 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 = {
.sht = &cs5530_sht, .sht = &cs5530_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x07, .udma_mask = 0x07,
...@@ -346,7 +346,7 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -346,7 +346,7 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* 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 = {
.sht = &cs5530_sht, .sht = &cs5530_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.port_ops = &cs5530_port_ops .port_ops = &cs5530_port_ops
}; };
......
...@@ -225,10 +225,10 @@ static int cs5535_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -225,10 +225,10 @@ 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 = {
.sht = &cs5535_sht, .sht = &cs5535_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, .udma_mask = ATA_UDMA4,
.port_ops = &cs5535_port_ops .port_ops = &cs5535_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info }; const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info };
......
...@@ -167,7 +167,7 @@ static int cy82c693_init_one(struct pci_dev *pdev, const struct pci_device_id *i ...@@ -167,7 +167,7 @@ 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 = {
.sht = &cy82c693_sht, .sht = &cy82c693_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.port_ops = &cy82c693_port_ops .port_ops = &cy82c693_port_ops
......
...@@ -303,7 +303,7 @@ static int efar_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -303,7 +303,7 @@ 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 = {
.sht = &efar_sht, .sht = &efar_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma1-2 */ .mwdma_mask = 0x07, /* mwdma1-2 */
.udma_mask = 0x0f, /* UDMA 66 */ .udma_mask = 0x0f, /* UDMA 66 */
......
...@@ -393,10 +393,10 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -393,10 +393,10 @@ 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 = {
.sht = &hpt36x_sht, .sht = &hpt36x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, .udma_mask = ATA_UDMA4,
.port_ops = &hpt366_port_ops .port_ops = &hpt366_port_ops
}; };
struct ata_port_info info = info_hpt366; struct ata_port_info info = info_hpt366;
......
...@@ -889,25 +889,25 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -889,25 +889,25 @@ 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 = {
.sht = &hpt37x_sht, .sht = &hpt37x_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .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 = {
.sht = &hpt37x_sht, .sht = &hpt37x_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .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 = {
.sht = &hpt37x_sht, .sht = &hpt37x_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x0f, .udma_mask = 0x0f,
...@@ -916,7 +916,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -916,7 +916,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* HPT370A - UDMA100 */ /* HPT370A - UDMA100 */
static const struct ata_port_info info_hpt370a_33 = { static const struct ata_port_info info_hpt370a_33 = {
.sht = &hpt37x_sht, .sht = &hpt37x_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x0f, .udma_mask = 0x0f,
...@@ -925,19 +925,19 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -925,19 +925,19 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
/* 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 = {
.sht = &hpt37x_sht, .sht = &hpt37x_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &hpt372_port_ops .port_ops = &hpt372_port_ops
}; };
/* HPT374 - UDMA100 */ /* HPT374 - UDMA100 */
static const struct ata_port_info info_hpt374 = { static const struct ata_port_info info_hpt374 = {
.sht = &hpt37x_sht, .sht = &hpt37x_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &hpt374_port_ops .port_ops = &hpt374_port_ops
}; };
......
...@@ -490,10 +490,10 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -490,10 +490,10 @@ 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 = {
.sht = &hpt3x2n_sht, .sht = &hpt3x2n_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &hpt3x2n_port_ops .port_ops = &hpt3x2n_port_ops
}; };
struct ata_port_info port = info; struct ata_port_info port = info;
......
...@@ -173,7 +173,7 @@ static int hpt3x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -173,7 +173,7 @@ static int hpt3x3_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 = {
.sht = &hpt3x3_sht, .sht = &hpt3x3_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x07, .udma_mask = 0x07,
......
...@@ -530,7 +530,7 @@ static int __devinit pata_icside_add_ports(struct pata_icside_info *info) ...@@ -530,7 +530,7 @@ static int __devinit pata_icside_add_ports(struct pata_icside_info *info)
ap->pio_mask = 0x1f; ap->pio_mask = 0x1f;
ap->mwdma_mask = info->mwdma_mask; ap->mwdma_mask = info->mwdma_mask;
ap->flags |= ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ops = &pata_icside_port_ops; ap->ops = &pata_icside_port_ops;
pata_icside_setup_ioaddr(&ap->ioaddr, info->base, info->port[i]); pata_icside_setup_ioaddr(&ap->ioaddr, info->base, info->port[i]);
......
...@@ -313,10 +313,10 @@ static int it8213_init_one (struct pci_dev *pdev, const struct pci_device_id *en ...@@ -313,10 +313,10 @@ 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 = {
.sht = &it8213_sht, .sht = &it8213_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x1f, /* UDMA 100 */ .udma_mask = ATA_UDMA4, /* FIXME: want UDMA 100? */
.port_ops = &it8213_ops, .port_ops = &it8213_ops,
}; };
/* Current IT8213 stuff is single port */ /* Current IT8213 stuff is single port */
......
...@@ -714,17 +714,17 @@ static int it821x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -714,17 +714,17 @@ 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 = {
.sht = &it821x_sht, .sht = &it821x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.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 = {
.sht = &it821x_sht, .sht = &it821x_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &it821x_passthru_port_ops .port_ops = &it821x_passthru_port_ops
}; };
......
/* /*
* ixp4xx PATA/Compact Flash driver * ixp4xx PATA/Compact Flash driver
* Copyright (c) 2006 Tower Technologies * Copyright (C) 2006-07 Tower Technologies
* Author: Alessandro Zummo <a.zummo@towertech.it> * Author: Alessandro Zummo <a.zummo@towertech.it>
* *
* An ATA driver to handle a Compact Flash connected * An ATA driver to handle a Compact Flash connected
* to the ixp4xx expansion bus in TrueIDE mode. The CF * to the ixp4xx expansion bus in TrueIDE mode. The CF
* must have it chip selects connected to two CS lines * must have it chip selects connected to two CS lines
* on the ixp4xx. The interrupt line is optional, if not * on the ixp4xx. In the irq is not available, you might
* specified the driver will run in polling mode. * want to modify both this driver and libata to run in
* polling mode.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -23,7 +24,7 @@ ...@@ -23,7 +24,7 @@
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#define DRV_NAME "pata_ixp4xx_cf" #define DRV_NAME "pata_ixp4xx_cf"
#define DRV_VERSION "0.1.3" #define DRV_VERSION "0.2"
static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device **error) static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device **error)
{ {
...@@ -42,13 +43,6 @@ static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device **error) ...@@ -42,13 +43,6 @@ static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device **error)
return 0; return 0;
} }
static void ixp4xx_phy_reset(struct ata_port *ap)
{
ap->cbl = ATA_CBL_PATA40;
ata_port_probe(ap);
ata_bus_reset(ap);
}
static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data) unsigned int buflen, int write_data)
{ {
...@@ -56,7 +50,7 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, ...@@ -56,7 +50,7 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int words = buflen >> 1; unsigned int words = buflen >> 1;
u16 *buf16 = (u16 *) buf; u16 *buf16 = (u16 *) buf;
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->ap;
void __iomem *mmio = (void __iomem *)ap->ioaddr.data_addr; void __iomem *mmio = ap->ioaddr.data_addr;
struct ixp4xx_pata_data *data = ap->host->dev->platform_data; struct ixp4xx_pata_data *data = ap->host->dev->platform_data;
/* set the expansion bus in 16bit mode and restore /* set the expansion bus in 16bit mode and restore
...@@ -92,10 +86,6 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, ...@@ -92,10 +86,6 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
*data->cs0_cfg |= 0x01; *data->cs0_cfg |= 0x01;
} }
static void ixp4xx_irq_clear(struct ata_port *ap)
{
}
static struct scsi_host_template ixp4xx_sht = { static struct scsi_host_template ixp4xx_sht = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = DRV_NAME, .name = DRV_NAME,
...@@ -115,29 +105,32 @@ static struct scsi_host_template ixp4xx_sht = { ...@@ -115,29 +105,32 @@ static struct scsi_host_template ixp4xx_sht = {
}; };
static struct ata_port_operations ixp4xx_port_ops = { static struct ata_port_operations ixp4xx_port_ops = {
.set_mode = ixp4xx_set_mode, .set_mode = ixp4xx_set_mode,
.mode_filter = ata_pci_default_filter, .mode_filter = ata_pci_default_filter,
.port_disable = ata_port_disable, .port_disable = ata_port_disable,
.tf_load = ata_tf_load, .tf_load = ata_tf_load,
.tf_read = ata_tf_read, .tf_read = ata_tf_read,
.check_status = ata_check_status, .exec_command = ata_exec_command,
.exec_command = ata_exec_command, .check_status = ata_check_status,
.dev_select = ata_std_dev_select, .dev_select = ata_std_dev_select,
.qc_prep = ata_qc_prep, .freeze = ata_bmdma_freeze,
.qc_issue = ata_qc_issue_prot, .thaw = ata_bmdma_thaw,
.eng_timeout = ata_eng_timeout, .error_handler = ata_bmdma_error_handler,
.data_xfer = ixp4xx_mmio_data_xfer, .post_internal_cmd = ata_bmdma_post_internal_cmd,
.cable_detect = ata_cable_40wire,
.qc_prep = ata_qc_prep,
.irq_clear = ixp4xx_irq_clear, .qc_issue = ata_qc_issue_prot,
.irq_on = ata_irq_on, .data_xfer = ixp4xx_mmio_data_xfer,
.irq_ack = ata_irq_ack, .cable_detect = ata_cable_40wire,
.port_start = ata_port_start, .irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.phy_reset = ixp4xx_phy_reset, .irq_on = ata_irq_on,
.irq_ack = ata_dummy_irq_ack,
.port_start = ata_port_start,
}; };
static void ixp4xx_setup_port(struct ata_ioports *ioaddr, static void ixp4xx_setup_port(struct ata_ioports *ioaddr,
...@@ -178,7 +171,6 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev) ...@@ -178,7 +171,6 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
struct ata_host *host; struct ata_host *host;
struct ata_port *ap; struct ata_port *ap;
struct ixp4xx_pata_data *data = pdev->dev.platform_data; struct ixp4xx_pata_data *data = pdev->dev.platform_data;
int rc;
cs0 = platform_get_resource(pdev, IORESOURCE_MEM, 0); cs0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
cs1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); cs1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
...@@ -211,10 +203,6 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev) ...@@ -211,10 +203,6 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
ap->pio_mask = 0x1f; /* PIO4 */ ap->pio_mask = 0x1f; /* 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;
/* run in polling mode if no irq has been assigned */
if (!irq)
ap->flags |= ATA_FLAG_PIO_POLLING;
ixp4xx_setup_port(&ap->ioaddr, data); ixp4xx_setup_port(&ap->ioaddr, data);
dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n"); dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
......
...@@ -193,11 +193,11 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i ...@@ -193,11 +193,11 @@ 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 = {
.sht = &jmicron_sht, .sht = &jmicron_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &jmicron_ops, .port_ops = &jmicron_ops,
}; };
......
...@@ -163,22 +163,22 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i ...@@ -163,22 +163,22 @@ 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 = {
.sht = &marvell_sht, .sht = &marvell_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &marvell_ops, .port_ops = &marvell_ops,
}; };
static const struct ata_port_info info_sata = { static const struct ata_port_info info_sata = {
.sht = &marvell_sht, .sht = &marvell_sht,
/* Slave possible as its magically mapped not real */ /* Slave possible as its magically mapped not real */
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &marvell_ops, .port_ops = &marvell_ops,
}; };
......
...@@ -94,12 +94,12 @@ static int netcell_init_one (struct pci_dev *pdev, const struct pci_device_id *e ...@@ -94,12 +94,12 @@ static int netcell_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 = {
.sht = &netcell_sht, .sht = &netcell_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .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 = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* UDMA 133 */ .udma_mask = ATA_UDMA5, /* UDMA 133 */
.port_ops = &netcell_ops, .port_ops = &netcell_ops,
}; };
const struct ata_port_info *port_info[] = { &info, NULL }; const struct ata_port_info *port_info[] = { &info, NULL };
......
...@@ -193,7 +193,7 @@ static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -193,7 +193,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 = {
.sht = &ns87410_sht, .sht = &ns87410_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x0F, .pio_mask = 0x0F,
.port_ops = &ns87410_port_ops .port_ops = &ns87410_port_ops
}; };
......
...@@ -291,7 +291,7 @@ static int oldpiix_init_one (struct pci_dev *pdev, const struct pci_device_id *e ...@@ -291,7 +291,7 @@ 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 = {
.sht = &oldpiix_sht, .sht = &oldpiix_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma1-2 */ .mwdma_mask = 0x07, /* mwdma1-2 */
.port_ops = &oldpiix_pata_ops, .port_ops = &oldpiix_pata_ops,
......
...@@ -218,7 +218,7 @@ static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -218,7 +218,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 = {
.sht = &opti_sht, .sht = &opti_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.port_ops = &opti_port_ops .port_ops = &opti_port_ops
}; };
......
...@@ -484,14 +484,14 @@ static int optidma_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -484,14 +484,14 @@ 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 = {
.sht = &optidma_sht, .sht = &optidma_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.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 = {
.sht = &optidma_sht, .sht = &optidma_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x07, .udma_mask = 0x07,
......
...@@ -320,7 +320,7 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id ...@@ -320,7 +320,7 @@ 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] = {
{ {
.sht = &pdc202xx_sht, .sht = &pdc202xx_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA2, .udma_mask = ATA_UDMA2,
...@@ -328,7 +328,7 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id ...@@ -328,7 +328,7 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id
}, },
{ {
.sht = &pdc202xx_sht, .sht = &pdc202xx_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA4, .udma_mask = ATA_UDMA4,
...@@ -336,7 +336,7 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id ...@@ -336,7 +336,7 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id
}, },
{ {
.sht = &pdc202xx_sht, .sht = &pdc202xx_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
......
...@@ -139,6 +139,7 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) ...@@ -139,6 +139,7 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)
struct resource *io_res, *ctl_res; struct resource *io_res, *ctl_res;
struct ata_host *host; struct ata_host *host;
struct ata_port *ap; struct ata_port *ap;
struct pata_platform_info *pp_info;
unsigned int mmio; unsigned int mmio;
/* /*
...@@ -208,11 +209,12 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) ...@@ -208,11 +209,12 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)
ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
pata_platform_setup_port(&ap->ioaddr, pdev->dev.platform_data); pp_info = (struct pata_platform_info *)(pdev->dev.platform_data);
pata_platform_setup_port(&ap->ioaddr, pp_info);
/* activate */ /* activate */
return ata_host_activate(host, platform_get_irq(pdev, 0), ata_interrupt, return ata_host_activate(host, platform_get_irq(pdev, 0), ata_interrupt,
0, &pata_platform_sht); pp_info->irq_flags, &pata_platform_sht);
} }
/** /**
......
...@@ -257,7 +257,7 @@ static int radisys_init_one (struct pci_dev *pdev, const struct pci_device_id *e ...@@ -257,7 +257,7 @@ 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 = {
.sht = &radisys_sht, .sht = &radisys_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma1-2 */ .mwdma_mask = 0x07, /* mwdma1-2 */
.udma_mask = 0x14, /* UDMA33/66 only */ .udma_mask = 0x14, /* UDMA33/66 only */
......
...@@ -133,7 +133,7 @@ static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *en ...@@ -133,7 +133,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 = {
.sht = &rz1000_sht, .sht = &rz1000_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.port_ops = &rz1000_port_ops .port_ops = &rz1000_port_ops
}; };
......
...@@ -185,7 +185,7 @@ static struct scsi_host_template sc1200_sht = { ...@@ -185,7 +185,7 @@ static struct scsi_host_template sc1200_sht = {
.queuecommand = ata_scsi_queuecmd, .queuecommand = ata_scsi_queuecmd,
.can_queue = ATA_DEF_QUEUE, .can_queue = ATA_DEF_QUEUE,
.this_id = ATA_SHT_THIS_ID, .this_id = ATA_SHT_THIS_ID,
.sg_tablesize = LIBATA_MAX_PRD, .sg_tablesize = LIBATA_DUMB_MAX_PRD,
.cmd_per_lun = ATA_SHT_CMD_PER_LUN, .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
.emulated = ATA_SHT_EMULATED, .emulated = ATA_SHT_EMULATED,
.use_clustering = ATA_SHT_USE_CLUSTERING, .use_clustering = ATA_SHT_USE_CLUSTERING,
...@@ -219,7 +219,7 @@ static struct ata_port_operations sc1200_port_ops = { ...@@ -219,7 +219,7 @@ static struct ata_port_operations sc1200_port_ops = {
.bmdma_stop = ata_bmdma_stop, .bmdma_stop = ata_bmdma_stop,
.bmdma_status = ata_bmdma_status, .bmdma_status = ata_bmdma_status,
.qc_prep = ata_qc_prep, .qc_prep = ata_dumb_qc_prep,
.qc_issue = sc1200_qc_issue_prot, .qc_issue = sc1200_qc_issue_prot,
.data_xfer = ata_data_xfer, .data_xfer = ata_data_xfer,
...@@ -245,7 +245,7 @@ static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -245,7 +245,7 @@ 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 = {
.sht = &sc1200_sht, .sht = &sc1200_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x07, .udma_mask = 0x07,
......
...@@ -478,31 +478,31 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id ...@@ -478,31 +478,31 @@ 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 */
.sht = &serverworks_sht, .sht = &serverworks_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x07, .udma_mask = 0x07,
.port_ops = &serverworks_osb4_port_ops .port_ops = &serverworks_osb4_port_ops
}, { /* OSB4 no UDMA */ }, { /* OSB4 no UDMA */
.sht = &serverworks_sht, .sht = &serverworks_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x00, .udma_mask = 0x00,
.port_ops = &serverworks_osb4_port_ops .port_ops = &serverworks_osb4_port_ops
}, { /* CSB5 */ }, { /* CSB5 */
.sht = &serverworks_sht, .sht = &serverworks_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, .udma_mask = ATA_UDMA4,
.port_ops = &serverworks_csb_port_ops .port_ops = &serverworks_csb_port_ops
}, { /* CSB5 - later revisions*/ }, { /* CSB5 - later revisions*/
.sht = &serverworks_sht, .sht = &serverworks_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &serverworks_csb_port_ops .port_ops = &serverworks_csb_port_ops
} }
}; };
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#define DRV_NAME "pata_sil680" #define DRV_NAME "pata_sil680"
#define DRV_VERSION "0.4.6" #define DRV_VERSION "0.4.6"
#define SIL680_MMIO_BAR 5
/** /**
* sil680_selreg - return register base * sil680_selreg - return register base
* @hwif: interface * @hwif: interface
...@@ -293,8 +295,8 @@ static u8 sil680_init_chip(struct pci_dev *pdev) ...@@ -293,8 +295,8 @@ static u8 sil680_init_chip(struct pci_dev *pdev)
pci_read_config_byte(pdev, 0x8A, &tmpbyte); pci_read_config_byte(pdev, 0x8A, &tmpbyte);
printk(KERN_INFO "sil680: BA5_EN = %d clock = %02X\n", dev_dbg(&pdev->dev, "sil680: BA5_EN = %d clock = %02X\n",
tmpbyte & 1, tmpbyte & 0x30); tmpbyte & 1, tmpbyte & 0x30);
switch(tmpbyte & 0x30) { switch(tmpbyte & 0x30) {
case 0x00: case 0x00:
...@@ -315,8 +317,8 @@ static u8 sil680_init_chip(struct pci_dev *pdev) ...@@ -315,8 +317,8 @@ static u8 sil680_init_chip(struct pci_dev *pdev)
} }
pci_read_config_byte(pdev, 0x8A, &tmpbyte); pci_read_config_byte(pdev, 0x8A, &tmpbyte);
printk(KERN_INFO "sil680: BA5_EN = %d clock = %02X\n", dev_dbg(&pdev->dev, "sil680: BA5_EN = %d clock = %02X\n",
tmpbyte & 1, tmpbyte & 0x30); tmpbyte & 1, tmpbyte & 0x30);
pci_write_config_byte(pdev, 0xA1, 0x72); pci_write_config_byte(pdev, 0xA1, 0x72);
pci_write_config_word(pdev, 0xA2, 0x328A); pci_write_config_word(pdev, 0xA2, 0x328A);
...@@ -339,22 +341,23 @@ static u8 sil680_init_chip(struct pci_dev *pdev) ...@@ -339,22 +341,23 @@ static u8 sil680_init_chip(struct pci_dev *pdev)
return tmpbyte & 0x30; return tmpbyte & 0x30;
} }
static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id) static int __devinit sil680_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 = {
.sht = &sil680_sht, .sht = &sil680_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .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 = {
.sht = &sil680_sht, .sht = &sil680_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .udma_mask = ATA_UDMA5,
.port_ops = &sil680_port_ops .port_ops = &sil680_port_ops
}; };
const struct ata_port_info *ppi[] = { &info, NULL }; const struct ata_port_info *ppi[] = { &info, NULL };
......
...@@ -732,7 +732,7 @@ static const struct ata_port_operations sis_old_ops = { ...@@ -732,7 +732,7 @@ static const struct ata_port_operations sis_old_ops = {
static const struct ata_port_info sis_info = { static const struct ata_port_info sis_info = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0, .udma_mask = 0,
...@@ -740,7 +740,7 @@ static const struct ata_port_info sis_info = { ...@@ -740,7 +740,7 @@ static const struct ata_port_info sis_info = {
}; };
static const struct ata_port_info sis_info33 = { static const struct ata_port_info sis_info33 = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = ATA_UDMA2, /* UDMA 33 */ .udma_mask = ATA_UDMA2, /* UDMA 33 */
...@@ -748,28 +748,28 @@ static const struct ata_port_info sis_info33 = { ...@@ -748,28 +748,28 @@ static const struct ata_port_info sis_info33 = {
}; };
static const struct ata_port_info sis_info66 = { static const struct ata_port_info sis_info66 = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = ATA_UDMA4, /* UDMA 66 */ .udma_mask = ATA_UDMA4, /* UDMA 66 */
.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 = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.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 = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.udma_mask = ATA_UDMA5, .udma_mask = ATA_UDMA5,
.pio_mask = 0x1f, /* pio0-4 */ .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 = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sis_133_ops, .port_ops = &sis_133_ops,
...@@ -783,7 +783,7 @@ const struct ata_port_info sis_info133_for_sata = { ...@@ -783,7 +783,7 @@ const struct ata_port_info sis_info133_for_sata = {
}; };
static const struct ata_port_info sis_info133_early = { static const struct ata_port_info sis_info133_early = {
.sht = &sis_sht, .sht = &sis_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = ATA_UDMA6, .udma_mask = ATA_UDMA6,
.port_ops = &sis_133_early_ops, .port_ops = &sis_133_early_ops,
......
...@@ -303,14 +303,14 @@ static int sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id ...@@ -303,14 +303,14 @@ 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 = {
.sht = &sl82c105_sht, .sht = &sl82c105_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.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 = {
.sht = &sl82c105_sht, .sht = &sl82c105_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.port_ops = &sl82c105_port_ops .port_ops = &sl82c105_port_ops
}; };
......
...@@ -235,7 +235,7 @@ static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -235,7 +235,7 @@ 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 = {
.sht = &triflex_sht, .sht = &triflex_sht,
.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.port_ops = &triflex_port_ops .port_ops = &triflex_port_ops
......
...@@ -471,7 +471,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -471,7 +471,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7, .udma_mask = ATA_UDMA2,
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
/* VIA UDMA 66 devices */ /* VIA UDMA 66 devices */
...@@ -480,7 +480,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -480,7 +480,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x1f, .udma_mask = ATA_UDMA4,
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
/* VIA UDMA 100 devices */ /* VIA UDMA 100 devices */
...@@ -489,7 +489,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -489,7 +489,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x3f, .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) */
...@@ -498,7 +498,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -498,7 +498,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
.flags = ATA_FLAG_SLAVE_POSS, .flags = ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, /* FIXME: should check north bridge */ .udma_mask = ATA_UDMA6, /* FIXME: should check north bridge */
.port_ops = &via_port_ops .port_ops = &via_port_ops
}; };
struct ata_port_info type; struct ata_port_info type;
......
...@@ -145,32 +145,32 @@ static struct scsi_host_template adma_ata_sht = { ...@@ -145,32 +145,32 @@ static struct scsi_host_template adma_ata_sht = {
.name = DRV_NAME, .name = DRV_NAME,
.ioctl = ata_scsi_ioctl, .ioctl = ata_scsi_ioctl,
.queuecommand = ata_scsi_queuecmd, .queuecommand = ata_scsi_queuecmd,
.slave_configure = ata_scsi_slave_config,
.slave_destroy = ata_scsi_slave_destroy,
.bios_param = ata_std_bios_param,
.proc_name = DRV_NAME,
.can_queue = ATA_DEF_QUEUE, .can_queue = ATA_DEF_QUEUE,
.this_id = ATA_SHT_THIS_ID, .this_id = ATA_SHT_THIS_ID,
.sg_tablesize = LIBATA_MAX_PRD, .sg_tablesize = LIBATA_MAX_PRD,
.dma_boundary = ADMA_DMA_BOUNDARY,
.cmd_per_lun = ATA_SHT_CMD_PER_LUN, .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
.emulated = ATA_SHT_EMULATED,
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
.proc_name = DRV_NAME, .emulated = ATA_SHT_EMULATED,
.dma_boundary = ADMA_DMA_BOUNDARY,
.slave_configure = ata_scsi_slave_config,
.slave_destroy = ata_scsi_slave_destroy,
.bios_param = ata_std_bios_param,
}; };
static const struct ata_port_operations adma_ata_ops = { static const struct ata_port_operations adma_ata_ops = {
.port_disable = ata_port_disable, .port_disable = ata_port_disable,
.tf_load = ata_tf_load, .tf_load = ata_tf_load,
.tf_read = ata_tf_read, .tf_read = ata_tf_read,
.check_status = ata_check_status,
.check_atapi_dma = adma_check_atapi_dma,
.exec_command = ata_exec_command, .exec_command = ata_exec_command,
.check_status = ata_check_status,
.dev_select = ata_std_dev_select, .dev_select = ata_std_dev_select,
.phy_reset = adma_phy_reset, .phy_reset = adma_phy_reset,
.check_atapi_dma = adma_check_atapi_dma,
.data_xfer = ata_data_xfer,
.qc_prep = adma_qc_prep, .qc_prep = adma_qc_prep,
.qc_issue = adma_qc_issue, .qc_issue = adma_qc_issue,
.eng_timeout = adma_eng_timeout, .eng_timeout = adma_eng_timeout,
.data_xfer = ata_data_xfer,
.irq_clear = adma_irq_clear, .irq_clear = adma_irq_clear,
.irq_on = ata_irq_on, .irq_on = ata_irq_on,
.irq_ack = ata_irq_ack, .irq_ack = ata_irq_ack,
...@@ -188,7 +188,7 @@ static struct ata_port_info adma_port_info[] = { ...@@ -188,7 +188,7 @@ static struct ata_port_info adma_port_info[] = {
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 = 0x10, /* pio4 */
.udma_mask = 0x1f, /* udma0-4 */ .udma_mask = ATA_UDMA4,
.port_ops = &adma_ata_ops, .port_ops = &adma_ata_ops,
}, },
}; };
......
...@@ -192,7 +192,7 @@ static void inic_reset_port(void __iomem *port_base) ...@@ -192,7 +192,7 @@ static void inic_reset_port(void __iomem *port_base)
static u32 inic_scr_read(struct ata_port *ap, unsigned sc_reg) static u32 inic_scr_read(struct ata_port *ap, unsigned sc_reg)
{ {
void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr; void __iomem *scr_addr = ap->ioaddr.scr_addr;
void __iomem *addr; void __iomem *addr;
u32 val; u32 val;
...@@ -210,7 +210,7 @@ static u32 inic_scr_read(struct ata_port *ap, unsigned sc_reg) ...@@ -210,7 +210,7 @@ static u32 inic_scr_read(struct ata_port *ap, unsigned sc_reg)
static void inic_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) static void inic_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val)
{ {
void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr; void __iomem *scr_addr = ap->ioaddr.scr_addr;
void __iomem *addr; void __iomem *addr;
if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) if (unlikely(sc_reg >= ARRAY_SIZE(scr_map)))
...@@ -594,7 +594,7 @@ static struct ata_port_info inic_port_info = { ...@@ -594,7 +594,7 @@ 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 = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &inic_port_ops .port_ops = &inic_port_ops
}; };
......
...@@ -526,44 +526,44 @@ static const struct ata_port_info mv_port_info[] = { ...@@ -526,44 +526,44 @@ static const struct ata_port_info mv_port_info[] = {
{ /* chip_504x */ { /* chip_504x */
.flags = MV_COMMON_FLAGS, .flags = MV_COMMON_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv5_ops, .port_ops = &mv5_ops,
}, },
{ /* chip_508x */ { /* chip_508x */
.flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC), .flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv5_ops, .port_ops = &mv5_ops,
}, },
{ /* chip_5080 */ { /* chip_5080 */
.flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC), .flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv5_ops, .port_ops = &mv5_ops,
}, },
{ /* chip_604x */ { /* chip_604x */
.flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS), .flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv6_ops, .port_ops = &mv6_ops,
}, },
{ /* chip_608x */ { /* chip_608x */
.flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS | .flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS |
MV_FLAG_DUAL_HC), MV_FLAG_DUAL_HC),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv6_ops, .port_ops = &mv6_ops,
}, },
{ /* chip_6042 */ { /* chip_6042 */
.flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS), .flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv_iie_ops, .port_ops = &mv_iie_ops,
}, },
{ /* chip_7042 */ { /* chip_7042 */
.flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS), .flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &mv_iie_ops, .port_ops = &mv_iie_ops,
}, },
}; };
...@@ -2338,7 +2338,7 @@ static void mv_print_info(struct ata_host *host) ...@@ -2338,7 +2338,7 @@ static void mv_print_info(struct ata_host *host)
struct pci_dev *pdev = to_pci_dev(host->dev); struct pci_dev *pdev = to_pci_dev(host->dev);
struct mv_host_priv *hpriv = host->private_data; struct mv_host_priv *hpriv = host->private_data;
u8 rev_id, scc; u8 rev_id, scc;
const char *scc_s; const char *scc_s, *gen;
/* Use this to determine the HW stepping of the chip so we know /* Use this to determine the HW stepping of the chip so we know
* what errata to workaround * what errata to workaround
...@@ -2351,11 +2351,20 @@ static void mv_print_info(struct ata_host *host) ...@@ -2351,11 +2351,20 @@ static void mv_print_info(struct ata_host *host)
else if (scc == 0x01) else if (scc == 0x01)
scc_s = "RAID"; scc_s = "RAID";
else else
scc_s = "unknown"; scc_s = "?";
if (IS_GEN_I(hpriv))
gen = "I";
else if (IS_GEN_II(hpriv))
gen = "II";
else if (IS_GEN_IIE(hpriv))
gen = "IIE";
else
gen = "?";
dev_printk(KERN_INFO, &pdev->dev, dev_printk(KERN_INFO, &pdev->dev,
"%u slots %u ports %s mode IRQ via %s\n", "Gen-%s %u slots %u ports %s mode IRQ via %s\n",
(unsigned)MV_MAX_Q_DEPTH, host->n_ports, gen, (unsigned)MV_MAX_Q_DEPTH, host->n_ports,
scc_s, (MV_HP_FLAG_MSI & hpriv->hp_flags) ? "MSI" : "INTx"); scc_s, (MV_HP_FLAG_MSI & hpriv->hp_flags) ? "MSI" : "INTx");
} }
......
...@@ -45,8 +45,7 @@ ...@@ -45,8 +45,7 @@
#include "sata_promise.h" #include "sata_promise.h"
#define DRV_NAME "sata_promise" #define DRV_NAME "sata_promise"
#define DRV_VERSION "2.07" #define DRV_VERSION "2.08"
enum { enum {
PDC_MAX_PORTS = 4, PDC_MAX_PORTS = 4,
...@@ -94,7 +93,7 @@ enum { ...@@ -94,7 +93,7 @@ enum {
board_20319 = 2, /* FastTrak S150 TX4 */ board_20319 = 2, /* FastTrak S150 TX4 */
board_20619 = 3, /* FastTrak TX4000 */ board_20619 = 3, /* FastTrak TX4000 */
board_2057x = 4, /* SATAII150 Tx2plus */ board_2057x = 4, /* SATAII150 Tx2plus */
board_2057x_pata = 5, /* SATAII150 Tx2plus */ board_2057x_pata = 5, /* SATAII150 Tx2plus PATA port */
board_40518 = 6, /* SATAII150 Tx4 */ board_40518 = 6, /* SATAII150 Tx4 */
PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */ PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */
...@@ -124,7 +123,6 @@ enum { ...@@ -124,7 +123,6 @@ enum {
PDC_FLAG_4_PORTS = (1 << 26), /* 4 ports */ PDC_FLAG_4_PORTS = (1 << 26), /* 4 ports */
}; };
struct pdc_port_priv { struct pdc_port_priv {
u8 *pkt; u8 *pkt;
dma_addr_t pkt_dma; dma_addr_t pkt_dma;
...@@ -252,7 +250,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -252,7 +250,7 @@ static const struct ata_port_info pdc_port_info[] = {
PDC_FLAG_SATA_PATA, PDC_FLAG_SATA_PATA,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_old_sata_ops, .port_ops = &pdc_old_sata_ops,
}, },
...@@ -261,7 +259,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -261,7 +259,7 @@ 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,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_pata_ops, .port_ops = &pdc_pata_ops,
}, },
...@@ -271,7 +269,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -271,7 +269,7 @@ static const struct ata_port_info pdc_port_info[] = {
PDC_FLAG_4_PORTS, PDC_FLAG_4_PORTS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_old_sata_ops, .port_ops = &pdc_old_sata_ops,
}, },
...@@ -281,7 +279,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -281,7 +279,7 @@ static const struct ata_port_info pdc_port_info[] = {
PDC_FLAG_4_PORTS, PDC_FLAG_4_PORTS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_pata_ops, .port_ops = &pdc_pata_ops,
}, },
...@@ -291,7 +289,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -291,7 +289,7 @@ static const struct ata_port_info pdc_port_info[] = {
PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA, PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_sata_ops, .port_ops = &pdc_sata_ops,
}, },
...@@ -301,7 +299,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -301,7 +299,7 @@ static const struct ata_port_info pdc_port_info[] = {
PDC_FLAG_GEN_II, PDC_FLAG_GEN_II,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_pata_ops, .port_ops = &pdc_pata_ops,
}, },
...@@ -311,7 +309,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -311,7 +309,7 @@ static const struct ata_port_info pdc_port_info[] = {
PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS, PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_sata_ops, .port_ops = &pdc_sata_ops,
}, },
}; };
...@@ -340,7 +338,6 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { ...@@ -340,7 +338,6 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = {
{ } /* terminate list */ { } /* terminate list */
}; };
static struct pci_driver pdc_ata_pci_driver = { static struct pci_driver pdc_ata_pci_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.id_table = pdc_ata_pci_tbl, .id_table = pdc_ata_pci_tbl,
...@@ -348,7 +345,6 @@ static struct pci_driver pdc_ata_pci_driver = { ...@@ -348,7 +345,6 @@ static struct pci_driver pdc_ata_pci_driver = {
.remove = ata_pci_remove_one, .remove = ata_pci_remove_one,
}; };
static int pdc_common_port_start(struct ata_port *ap) static int pdc_common_port_start(struct ata_port *ap)
{ {
struct device *dev = ap->host->dev; struct device *dev = ap->host->dev;
...@@ -382,7 +378,7 @@ static int pdc_sata_port_start(struct ata_port *ap) ...@@ -382,7 +378,7 @@ static int pdc_sata_port_start(struct ata_port *ap)
/* fix up PHYMODE4 align timing */ /* fix up PHYMODE4 align timing */
if (ap->flags & PDC_FLAG_GEN_II) { if (ap->flags & PDC_FLAG_GEN_II) {
void __iomem *mmio = (void __iomem *) ap->ioaddr.scr_addr; void __iomem *mmio = ap->ioaddr.scr_addr;
unsigned int tmp; unsigned int tmp;
tmp = readl(mmio + 0x014); tmp = readl(mmio + 0x014);
...@@ -418,7 +414,7 @@ static void pdc_reset_port(struct ata_port *ap) ...@@ -418,7 +414,7 @@ static void pdc_reset_port(struct ata_port *ap)
static int pdc_pata_cable_detect(struct ata_port *ap) static int pdc_pata_cable_detect(struct ata_port *ap)
{ {
u8 tmp; u8 tmp;
void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
tmp = readb(mmio); tmp = readb(mmio);
if (tmp & 0x01) if (tmp & 0x01)
...@@ -438,7 +434,6 @@ static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg) ...@@ -438,7 +434,6 @@ static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
return readl(ap->ioaddr.scr_addr + (sc_reg * 4)); return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
} }
static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg,
u32 val) u32 val)
{ {
...@@ -573,7 +568,7 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc) ...@@ -573,7 +568,7 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
static void pdc_freeze(struct ata_port *ap) static void pdc_freeze(struct ata_port *ap)
{ {
void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr; void __iomem *mmio = ap->ioaddr.cmd_addr;
u32 tmp; u32 tmp;
tmp = readl(mmio + PDC_CTLSTAT); tmp = readl(mmio + PDC_CTLSTAT);
...@@ -585,7 +580,7 @@ static void pdc_freeze(struct ata_port *ap) ...@@ -585,7 +580,7 @@ static void pdc_freeze(struct ata_port *ap)
static void pdc_thaw(struct ata_port *ap) static void pdc_thaw(struct ata_port *ap)
{ {
void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr; void __iomem *mmio = ap->ioaddr.cmd_addr;
u32 tmp; u32 tmp;
/* clear IRQ */ /* clear IRQ */
...@@ -657,8 +652,8 @@ static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc, ...@@ -657,8 +652,8 @@ static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
ata_port_abort(ap); ata_port_abort(ap);
} }
static inline unsigned int pdc_host_intr( struct ata_port *ap, static inline unsigned int pdc_host_intr(struct ata_port *ap,
struct ata_queued_cmd *qc) struct ata_queued_cmd *qc)
{ {
unsigned int handled = 0; unsigned int handled = 0;
void __iomem *port_mmio = ap->ioaddr.cmd_addr; void __iomem *port_mmio = ap->ioaddr.cmd_addr;
...@@ -685,10 +680,10 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap, ...@@ -685,10 +680,10 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
handled = 1; handled = 1;
break; break;
default: default:
ap->stats.idle_irq++; ap->stats.idle_irq++;
break; break;
} }
return handled; return handled;
} }
...@@ -701,6 +696,18 @@ static void pdc_irq_clear(struct ata_port *ap) ...@@ -701,6 +696,18 @@ static void pdc_irq_clear(struct ata_port *ap)
readl(mmio + PDC_INT_SEQMASK); readl(mmio + PDC_INT_SEQMASK);
} }
static inline int pdc_is_sataii_tx4(unsigned long flags)
{
const unsigned long mask = PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS;
return (flags & mask) == mask;
}
static inline unsigned int pdc_port_no_to_ata_no(unsigned int port_no, int is_sataii_tx4)
{
static const unsigned char sataii_tx4_port_remap[4] = { 3, 1, 0, 2};
return is_sataii_tx4 ? sataii_tx4_port_remap[port_no] : port_no;
}
static irqreturn_t pdc_interrupt (int irq, void *dev_instance) static irqreturn_t pdc_interrupt (int irq, void *dev_instance)
{ {
struct ata_host *host = dev_instance; struct ata_host *host = dev_instance;
...@@ -807,7 +814,6 @@ static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf) ...@@ -807,7 +814,6 @@ static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
ata_tf_load(ap, tf); ata_tf_load(ap, tf);
} }
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf) static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
{ {
WARN_ON (tf->protocol == ATA_PROT_DMA || WARN_ON (tf->protocol == ATA_PROT_DMA ||
...@@ -867,7 +873,6 @@ static void pdc_ata_setup_port(struct ata_port *ap, ...@@ -867,7 +873,6 @@ static void pdc_ata_setup_port(struct ata_port *ap,
ap->ioaddr.scr_addr = scr_addr; ap->ioaddr.scr_addr = scr_addr;
} }
static void pdc_host_init(struct ata_host *host) static void pdc_host_init(struct ata_host *host)
{ {
void __iomem *mmio = host->iomap[PDC_MMIO_BAR]; void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
...@@ -955,10 +960,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e ...@@ -955,10 +960,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
if (pi->flags & PDC_FLAG_SATA_PATA) { if (pi->flags & PDC_FLAG_SATA_PATA) {
u8 tmp = readb(base + PDC_FLASH_CTL+1); u8 tmp = readb(base + PDC_FLASH_CTL+1);
if (!(tmp & 0x80)) { if (!(tmp & 0x80))
ppi[n_ports++] = pi + 1; ppi[n_ports++] = pi + 1;
dev_printk(KERN_INFO, &pdev->dev, "PATA port found\n");
}
} }
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
...@@ -968,22 +971,12 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e ...@@ -968,22 +971,12 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
} }
host->iomap = pcim_iomap_table(pdev); host->iomap = pcim_iomap_table(pdev);
is_sataii_tx4 = 0; is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags);
if ((pi->flags & (PDC_FLAG_GEN_II|PDC_FLAG_4_PORTS)) == (PDC_FLAG_GEN_II|PDC_FLAG_4_PORTS)) {
is_sataii_tx4 = 1;
dev_printk(KERN_INFO, &pdev->dev, "applying SATAII TX4 port numbering workaround\n");
}
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
static const unsigned char sataii_tx4_port_remap[4] = { 3, 1, 0, 2}; unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
int ata_nr;
ata_nr = i;
if (is_sataii_tx4)
ata_nr = sataii_tx4_port_remap[i];
pdc_ata_setup_port(host->ports[i], pdc_ata_setup_port(host->ports[i],
base + 0x200 + ata_nr * 0x80, base + 0x200 + ata_no * 0x80,
base + 0x400 + ata_nr * 0x100); base + 0x400 + ata_no * 0x100);
} }
/* initialize adapter */ /* initialize adapter */
...@@ -1002,19 +995,16 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e ...@@ -1002,19 +995,16 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
&pdc_ata_sht); &pdc_ata_sht);
} }
static int __init pdc_ata_init(void) static int __init pdc_ata_init(void)
{ {
return pci_register_driver(&pdc_ata_pci_driver); return pci_register_driver(&pdc_ata_pci_driver);
} }
static void __exit pdc_ata_exit(void) static void __exit pdc_ata_exit(void)
{ {
pci_unregister_driver(&pdc_ata_pci_driver); pci_unregister_driver(&pdc_ata_pci_driver);
} }
MODULE_AUTHOR("Jeff Garzik"); MODULE_AUTHOR("Jeff Garzik");
MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver"); MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
...@@ -176,7 +176,7 @@ static const struct ata_port_info qs_port_info[] = { ...@@ -176,7 +176,7 @@ static const struct ata_port_info qs_port_info[] = {
//FIXME ATA_FLAG_SRST | //FIXME ATA_FLAG_SRST |
ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING, ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING,
.pio_mask = 0x10, /* pio4 */ .pio_mask = 0x10, /* pio4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &qs_ata_ops, .port_ops = &qs_ata_ops,
}, },
}; };
......
...@@ -218,7 +218,7 @@ static const struct ata_port_info sil_port_info[] = { ...@@ -218,7 +218,7 @@ 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,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
/* sil_3112_no_sata_irq */ /* sil_3112_no_sata_irq */
...@@ -227,7 +227,7 @@ static const struct ata_port_info sil_port_info[] = { ...@@ -227,7 +227,7 @@ static const struct ata_port_info sil_port_info[] = {
SIL_FLAG_NO_SATA_IRQ, SIL_FLAG_NO_SATA_IRQ,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
/* sil_3512 */ /* sil_3512 */
...@@ -235,7 +235,7 @@ static const struct ata_port_info sil_port_info[] = { ...@@ -235,7 +235,7 @@ static const struct ata_port_info sil_port_info[] = {
.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 = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
/* sil_3114 */ /* sil_3114 */
...@@ -243,7 +243,7 @@ static const struct ata_port_info sil_port_info[] = { ...@@ -243,7 +243,7 @@ static const struct ata_port_info sil_port_info[] = {
.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 = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5,
.port_ops = &sil_ops, .port_ops = &sil_ops,
}, },
}; };
...@@ -262,8 +262,9 @@ static const struct { ...@@ -262,8 +262,9 @@ static const struct {
unsigned long sfis_cfg; /* SATA FIS reception config register */ unsigned long sfis_cfg; /* SATA FIS reception config register */
} sil_port[] = { } sil_port[] = {
/* port 0 ... */ /* port 0 ... */
{ 0x80, 0x8A, 0x00, 0x10, 0x40, 0x100, 0x148, 0xb4, 0x14c }, /* tf ctl bmdma bmdma2 fifo scr sien mode sfis */
{ 0xC0, 0xCA, 0x08, 0x18, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc }, { 0x80, 0x8A, 0x0, 0x10, 0x40, 0x100, 0x148, 0xb4, 0x14c },
{ 0xC0, 0xCA, 0x8, 0x18, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc },
{ 0x280, 0x28A, 0x200, 0x210, 0x240, 0x300, 0x348, 0x2b4, 0x34c }, { 0x280, 0x28A, 0x200, 0x210, 0x240, 0x300, 0x348, 0x2b4, 0x34c },
{ 0x2C0, 0x2CA, 0x208, 0x218, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc }, { 0x2C0, 0x2CA, 0x208, 0x218, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc },
/* ... port 3 */ /* ... port 3 */
......
...@@ -426,7 +426,7 @@ static const struct ata_port_info sil24_port_info[] = { ...@@ -426,7 +426,7 @@ static const struct ata_port_info sil24_port_info[] = {
SIL24_FLAG_PCIX_IRQ_WOC, SIL24_FLAG_PCIX_IRQ_WOC,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5, /* udma0-5 */
.port_ops = &sil24_ops, .port_ops = &sil24_ops,
}, },
/* sil_3132 */ /* sil_3132 */
...@@ -434,7 +434,7 @@ static const struct ata_port_info sil24_port_info[] = { ...@@ -434,7 +434,7 @@ static const struct ata_port_info sil24_port_info[] = {
.flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2), .flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5, /* udma0-5 */
.port_ops = &sil24_ops, .port_ops = &sil24_ops,
}, },
/* sil_3131/sil_3531 */ /* sil_3131/sil_3531 */
...@@ -442,7 +442,7 @@ static const struct ata_port_info sil24_port_info[] = { ...@@ -442,7 +442,7 @@ static const struct ata_port_info sil24_port_info[] = {
.flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1), .flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = ATA_UDMA5, /* udma0-5 */
.port_ops = &sil24_ops, .port_ops = &sil24_ops,
}, },
}; };
...@@ -888,7 +888,7 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance) ...@@ -888,7 +888,7 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance)
if (status & (1 << i)) { if (status & (1 << i)) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
if (ap && !(ap->flags & ATA_FLAG_DISABLED)) { if (ap && !(ap->flags & ATA_FLAG_DISABLED)) {
sil24_host_intr(host->ports[i]); sil24_host_intr(ap);
handled++; handled++;
} else } else
printk(KERN_ERR DRV_NAME printk(KERN_ERR DRV_NAME
......
...@@ -133,7 +133,7 @@ static const struct ata_port_info sis_port_info = { ...@@ -133,7 +133,7 @@ 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 = 0x1f,
.mwdma_mask = 0x7, .mwdma_mask = 0x7,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &sis_ops, .port_ops = &sis_ops,
}; };
......
...@@ -107,7 +107,7 @@ static u32 k2_sata_scr_read (struct ata_port *ap, unsigned int sc_reg) ...@@ -107,7 +107,7 @@ static u32 k2_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
{ {
if (sc_reg > SCR_CONTROL) if (sc_reg > SCR_CONTROL)
return 0xffffffffU; return 0xffffffffU;
return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
} }
...@@ -116,7 +116,7 @@ static void k2_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, ...@@ -116,7 +116,7 @@ static void k2_sata_scr_write (struct ata_port *ap, unsigned int sc_reg,
{ {
if (sc_reg > SCR_CONTROL) if (sc_reg > SCR_CONTROL)
return; return;
writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
} }
...@@ -197,7 +197,8 @@ static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc) ...@@ -197,7 +197,8 @@ static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc)
struct ata_port *ap = qc->ap; struct ata_port *ap = qc->ap;
unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE); unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
u8 dmactl; u8 dmactl;
void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; void __iomem *mmio = ap->ioaddr.bmdma_addr;
/* load PRD table addr. */ /* load PRD table addr. */
mb(); /* make sure PRD table writes are visible to controller */ mb(); /* make sure PRD table writes are visible to controller */
writel(ap->prd_dma, mmio + ATA_DMA_TABLE_OFS); writel(ap->prd_dma, mmio + ATA_DMA_TABLE_OFS);
...@@ -225,7 +226,7 @@ static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc) ...@@ -225,7 +226,7 @@ static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc)
static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc) static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc)
{ {
struct ata_port *ap = qc->ap; struct ata_port *ap = qc->ap;
void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; void __iomem *mmio = ap->ioaddr.bmdma_addr;
u8 dmactl; u8 dmactl;
/* start host DMA transaction */ /* start host DMA transaction */
...@@ -253,7 +254,7 @@ static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc) ...@@ -253,7 +254,7 @@ static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc)
static u8 k2_stat_check_status(struct ata_port *ap) static u8 k2_stat_check_status(struct ata_port *ap)
{ {
return readl((void __iomem *) ap->ioaddr.status_addr); return readl(ap->ioaddr.status_addr);
} }
#ifdef CONFIG_PPC_OF #ifdef CONFIG_PPC_OF
...@@ -360,7 +361,7 @@ static const struct ata_port_info k2_port_info[] = { ...@@ -360,7 +361,7 @@ static const struct ata_port_info k2_port_info[] = {
ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &k2_sata_ops, .port_ops = &k2_sata_ops,
}, },
/* board_svw8 */ /* board_svw8 */
...@@ -370,7 +371,7 @@ static const struct ata_port_info k2_port_info[] = { ...@@ -370,7 +371,7 @@ static const struct ata_port_info k2_port_info[] = {
K2_FLAG_SATA_8_PORTS, K2_FLAG_SATA_8_PORTS,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &k2_sata_ops, .port_ops = &k2_sata_ops,
}, },
}; };
......
...@@ -30,6 +30,54 @@ ...@@ -30,6 +30,54 @@
* *
*/ */
/*
Theory of operation
-------------------
The SX4 (PDC20621) chip features a single Host DMA (HDMA) copy
engine, DIMM memory, and four ATA engines (one per SATA port).
Data is copied to/from DIMM memory by the HDMA engine, before
handing off to one (or more) of the ATA engines. The ATA
engines operate solely on DIMM memory.
The SX4 behaves like a PATA chip, with no SATA controls or
knowledge whatsoever, leading to the presumption that
PATA<->SATA bridges exist on SX4 boards, external to the
PDC20621 chip itself.
The chip is quite capable, supporting an XOR engine and linked
hardware commands (permits a string to transactions to be
submitted and waited-on as a single unit), and an optional
microprocessor.
The limiting factor is largely software. This Linux driver was
written to multiplex the single HDMA engine to copy disk
transactions into a fixed DIMM memory space, from where an ATA
engine takes over. As a result, each WRITE looks like this:
submit HDMA packet to hardware
hardware copies data from system memory to DIMM
hardware raises interrupt
submit ATA packet to hardware
hardware executes ATA WRITE command, w/ data in DIMM
hardware raises interrupt
and each READ looks like this:
submit ATA packet to hardware
hardware executes ATA READ command, w/ data in DIMM
hardware raises interrupt
submit HDMA packet to hardware
hardware copies data from DIMM to system memory
hardware raises interrupt
This is a very slow, lock-step way of doing things that can
certainly be improved by motivated kernel hackers.
*/
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -58,6 +106,8 @@ enum { ...@@ -58,6 +106,8 @@ enum {
PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */ PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */
PDC_HDMA_CTLSTAT = 0x12C, /* Host DMA control / status */ PDC_HDMA_CTLSTAT = 0x12C, /* Host DMA control / status */
PDC_CTLSTAT = 0x60, /* IDEn control / status */
PDC_20621_SEQCTL = 0x400, PDC_20621_SEQCTL = 0x400,
PDC_20621_SEQMASK = 0x480, PDC_20621_SEQMASK = 0x480,
PDC_20621_GENERAL_CTL = 0x484, PDC_20621_GENERAL_CTL = 0x484,
...@@ -87,48 +137,60 @@ enum { ...@@ -87,48 +137,60 @@ enum {
board_20621 = 0, /* FastTrak S150 SX4 */ board_20621 = 0, /* FastTrak S150 SX4 */
PDC_RESET = (1 << 11), /* HDMA reset */ PDC_MASK_INT = (1 << 10), /* HDMA/ATA mask int */
PDC_RESET = (1 << 11), /* HDMA/ATA reset */
PDC_DMA_ENABLE = (1 << 7), /* DMA start/stop */
PDC_MAX_HDMA = 32, PDC_MAX_HDMA = 32,
PDC_HDMA_Q_MASK = (PDC_MAX_HDMA - 1), PDC_HDMA_Q_MASK = (PDC_MAX_HDMA - 1),
PDC_DIMM0_SPD_DEV_ADDRESS = 0x50, PDC_DIMM0_SPD_DEV_ADDRESS = 0x50,
PDC_DIMM1_SPD_DEV_ADDRESS = 0x51, PDC_DIMM1_SPD_DEV_ADDRESS = 0x51,
PDC_MAX_DIMM_MODULE = 0x02, PDC_I2C_CONTROL = 0x48,
PDC_I2C_CONTROL_OFFSET = 0x48, PDC_I2C_ADDR_DATA = 0x4C,
PDC_I2C_ADDR_DATA_OFFSET = 0x4C, PDC_DIMM0_CONTROL = 0x80,
PDC_DIMM0_CONTROL_OFFSET = 0x80, PDC_DIMM1_CONTROL = 0x84,
PDC_DIMM1_CONTROL_OFFSET = 0x84, PDC_SDRAM_CONTROL = 0x88,
PDC_SDRAM_CONTROL_OFFSET = 0x88, PDC_I2C_WRITE = 0, /* master -> slave */
PDC_I2C_WRITE = 0x00000000, PDC_I2C_READ = (1 << 6), /* master <- slave */
PDC_I2C_READ = 0x00000040, PDC_I2C_START = (1 << 7), /* start I2C proto */
PDC_I2C_START = 0x00000080, PDC_I2C_MASK_INT = (1 << 5), /* mask I2C interrupt */
PDC_I2C_MASK_INT = 0x00000020, PDC_I2C_COMPLETE = (1 << 16), /* I2C normal compl. */
PDC_I2C_COMPLETE = 0x00010000, PDC_I2C_NO_ACK = (1 << 20), /* slave no-ack addr */
PDC_I2C_NO_ACK = 0x00100000, PDC_DIMM_SPD_SUBADDRESS_START = 0x00,
PDC_DIMM_SPD_SUBADDRESS_START = 0x00, PDC_DIMM_SPD_SUBADDRESS_END = 0x7F,
PDC_DIMM_SPD_SUBADDRESS_END = 0x7F, PDC_DIMM_SPD_ROW_NUM = 3,
PDC_DIMM_SPD_ROW_NUM = 3, PDC_DIMM_SPD_COLUMN_NUM = 4,
PDC_DIMM_SPD_COLUMN_NUM = 4, PDC_DIMM_SPD_MODULE_ROW = 5,
PDC_DIMM_SPD_MODULE_ROW = 5, PDC_DIMM_SPD_TYPE = 11,
PDC_DIMM_SPD_TYPE = 11, PDC_DIMM_SPD_FRESH_RATE = 12,
PDC_DIMM_SPD_FRESH_RATE = 12, PDC_DIMM_SPD_BANK_NUM = 17,
PDC_DIMM_SPD_BANK_NUM = 17, PDC_DIMM_SPD_CAS_LATENCY = 18,
PDC_DIMM_SPD_CAS_LATENCY = 18, PDC_DIMM_SPD_ATTRIBUTE = 21,
PDC_DIMM_SPD_ATTRIBUTE = 21, PDC_DIMM_SPD_ROW_PRE_CHARGE = 27,
PDC_DIMM_SPD_ROW_PRE_CHARGE = 27, PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28,
PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, PDC_DIMM_SPD_RAS_CAS_DELAY = 29,
PDC_DIMM_SPD_RAS_CAS_DELAY = 29, PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30,
PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30, PDC_DIMM_SPD_SYSTEM_FREQ = 126,
PDC_DIMM_SPD_SYSTEM_FREQ = 126, PDC_CTL_STATUS = 0x08,
PDC_CTL_STATUS = 0x08, PDC_DIMM_WINDOW_CTLR = 0x0C,
PDC_DIMM_WINDOW_CTLR = 0x0C, PDC_TIME_CONTROL = 0x3C,
PDC_TIME_CONTROL = 0x3C, PDC_TIME_PERIOD = 0x40,
PDC_TIME_PERIOD = 0x40, PDC_TIME_COUNTER = 0x44,
PDC_TIME_COUNTER = 0x44, PDC_GENERAL_CTLR = 0x484,
PDC_GENERAL_CTLR = 0x484, PCI_PLL_INIT = 0x8A531824,
PCI_PLL_INIT = 0x8A531824, PCI_X_TCOUNT = 0xEE1E5CFF,
PCI_X_TCOUNT = 0xEE1E5CFF
/* PDC_TIME_CONTROL bits */
PDC_TIMER_BUZZER = (1 << 10),
PDC_TIMER_MODE_PERIODIC = 0, /* bits 9:8 == 00 */
PDC_TIMER_MODE_ONCE = (1 << 8), /* bits 9:8 == 01 */
PDC_TIMER_ENABLE = (1 << 7),
PDC_TIMER_MASK_INT = (1 << 5),
PDC_TIMER_SEQ_MASK = 0x1f, /* SEQ ID for timer */
PDC_TIMER_DEFAULT = PDC_TIMER_MODE_ONCE |
PDC_TIMER_ENABLE |
PDC_TIMER_MASK_INT,
}; };
...@@ -217,7 +279,7 @@ static const struct ata_port_info pdc_port_info[] = { ...@@ -217,7 +279,7 @@ static const struct ata_port_info pdc_port_info[] = {
ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING, ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING,
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = ATA_UDMA6,
.port_ops = &pdc_20621_ops, .port_ops = &pdc_20621_ops,
}, },
...@@ -999,17 +1061,17 @@ static unsigned int pdc20621_i2c_read(struct ata_host *host, u32 device, ...@@ -999,17 +1061,17 @@ static unsigned int pdc20621_i2c_read(struct ata_host *host, u32 device,
i2creg |= subaddr << 16; i2creg |= subaddr << 16;
/* Set the device and subaddress */ /* Set the device and subaddress */
writel(i2creg, mmio + PDC_I2C_ADDR_DATA_OFFSET); writel(i2creg, mmio + PDC_I2C_ADDR_DATA);
readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); readl(mmio + PDC_I2C_ADDR_DATA);
/* Write Control to perform read operation, mask int */ /* Write Control to perform read operation, mask int */
writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT,
mmio + PDC_I2C_CONTROL_OFFSET); mmio + PDC_I2C_CONTROL);
for (count = 0; count <= 1000; count ++) { for (count = 0; count <= 1000; count ++) {
status = readl(mmio + PDC_I2C_CONTROL_OFFSET); status = readl(mmio + PDC_I2C_CONTROL);
if (status & PDC_I2C_COMPLETE) { if (status & PDC_I2C_COMPLETE) {
status = readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); status = readl(mmio + PDC_I2C_ADDR_DATA);
break; break;
} else if (count == 1000) } else if (count == 1000)
return 0; return 0;
...@@ -1099,8 +1161,8 @@ static int pdc20621_prog_dimm0(struct ata_host *host) ...@@ -1099,8 +1161,8 @@ static int pdc20621_prog_dimm0(struct ata_host *host)
data |= (((size / 16) - 1) << 16); data |= (((size / 16) - 1) << 16);
data |= (0 << 23); data |= (0 << 23);
data |= 8; data |= 8;
writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); writel(data, mmio + PDC_DIMM0_CONTROL);
readl(mmio + PDC_DIMM0_CONTROL_OFFSET); readl(mmio + PDC_DIMM0_CONTROL);
return size; return size;
} }
...@@ -1122,27 +1184,27 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_host *host) ...@@ -1122,27 +1184,27 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_host *host)
*/ */
data = 0x022259F1; data = 0x022259F1;
writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); writel(data, mmio + PDC_SDRAM_CONTROL);
readl(mmio + PDC_SDRAM_CONTROL_OFFSET); readl(mmio + PDC_SDRAM_CONTROL);
/* Turn on for ECC */ /* Turn on for ECC */
pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS, pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
PDC_DIMM_SPD_TYPE, &spd0); PDC_DIMM_SPD_TYPE, &spd0);
if (spd0 == 0x02) { if (spd0 == 0x02) {
data |= (0x01 << 16); data |= (0x01 << 16);
writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); writel(data, mmio + PDC_SDRAM_CONTROL);
readl(mmio + PDC_SDRAM_CONTROL_OFFSET); readl(mmio + PDC_SDRAM_CONTROL);
printk(KERN_ERR "Local DIMM ECC Enabled\n"); printk(KERN_ERR "Local DIMM ECC Enabled\n");
} }
/* DIMM Initialization Select/Enable (bit 18/19) */ /* DIMM Initialization Select/Enable (bit 18/19) */
data &= (~(1<<18)); data &= (~(1<<18));
data |= (1<<19); data |= (1<<19);
writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); writel(data, mmio + PDC_SDRAM_CONTROL);
error = 1; error = 1;
for (i = 1; i <= 10; i++) { /* polling ~5 secs */ for (i = 1; i <= 10; i++) { /* polling ~5 secs */
data = readl(mmio + PDC_SDRAM_CONTROL_OFFSET); data = readl(mmio + PDC_SDRAM_CONTROL);
if (!(data & (1<<19))) { if (!(data & (1<<19))) {
error = 0; error = 0;
break; break;
...@@ -1176,7 +1238,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host) ...@@ -1176,7 +1238,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
VPRINTK("Time Period Register (0x40): 0x%x\n", time_period); VPRINTK("Time Period Register (0x40): 0x%x\n", time_period);
/* Enable timer */ /* Enable timer */
writel(0x00001a0, mmio + PDC_TIME_CONTROL); writel(PDC_TIMER_DEFAULT, mmio + PDC_TIME_CONTROL);
readl(mmio + PDC_TIME_CONTROL); readl(mmio + PDC_TIME_CONTROL);
/* Wait 3 seconds */ /* Wait 3 seconds */
......
...@@ -129,7 +129,7 @@ static const struct ata_port_info uli_port_info = { ...@@ -129,7 +129,7 @@ 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 = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 */ .udma_mask = ATA_UDMA6,
.port_ops = &uli_ops, .port_ops = &uli_ops,
}; };
......
...@@ -223,7 +223,7 @@ static const struct ata_port_info vt6420_port_info = { ...@@ -223,7 +223,7 @@ 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 = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &vt6420_sata_ops, .port_ops = &vt6420_sata_ops,
}; };
...@@ -231,7 +231,7 @@ static struct ata_port_info vt6421_sport_info = { ...@@ -231,7 +231,7 @@ 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 = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &vt6421_sata_ops, .port_ops = &vt6421_sata_ops,
}; };
...@@ -239,7 +239,7 @@ static struct ata_port_info vt6421_pport_info = { ...@@ -239,7 +239,7 @@ 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 = 0x1f,
.mwdma_mask = 0, .mwdma_mask = 0,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &vt6421_pata_ops, .port_ops = &vt6421_pata_ops,
}; };
...@@ -303,9 +303,7 @@ static int vt6420_prereset(struct ata_port *ap, unsigned long deadline) ...@@ -303,9 +303,7 @@ static int vt6420_prereset(struct ata_port *ap, unsigned long deadline)
if (!(ap->pflags & ATA_PFLAG_LOADING)) if (!(ap->pflags & ATA_PFLAG_LOADING))
goto skip_scr; goto skip_scr;
/* Resume phy. This is the old resume sequence from /* Resume phy. This is the old SATA resume sequence */
* __sata_phy_reset().
*/
svia_scr_write(ap, SCR_CONTROL, 0x300); svia_scr_write(ap, SCR_CONTROL, 0x300);
svia_scr_read(ap, SCR_CONTROL); /* flush */ svia_scr_read(ap, SCR_CONTROL); /* flush */
......
...@@ -371,7 +371,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d ...@@ -371,7 +371,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
ATA_FLAG_MMIO, ATA_FLAG_MMIO,
.pio_mask = 0x1f, .pio_mask = 0x1f,
.mwdma_mask = 0x07, .mwdma_mask = 0x07,
.udma_mask = 0x7f, .udma_mask = ATA_UDMA6,
.port_ops = &vsc_sata_ops, .port_ops = &vsc_sata_ops,
}; };
const struct ata_port_info *ppi[] = { &pi, NULL }; const struct ata_port_info *ppi[] = { &pi, NULL };
......
...@@ -126,6 +126,7 @@ enum { ...@@ -126,6 +126,7 @@ enum {
ATA_REG_IRQ = ATA_REG_NSECT, ATA_REG_IRQ = ATA_REG_NSECT,
/* ATA device commands */ /* ATA device commands */
ATA_CMD_DEV_RESET = 0x08, /* ATAPI device reset */
ATA_CMD_CHK_POWER = 0xE5, /* check power mode */ ATA_CMD_CHK_POWER = 0xE5, /* check power mode */
ATA_CMD_STANDBY = 0xE2, /* place in standby power mode */ ATA_CMD_STANDBY = 0xE2, /* place in standby power mode */
ATA_CMD_IDLE = 0xE3, /* place in idle power mode */ ATA_CMD_IDLE = 0xE3, /* place in idle power mode */
......
...@@ -116,6 +116,7 @@ static inline struct device *pci_dev_to_dev(struct pci_dev *pdev) ...@@ -116,6 +116,7 @@ static inline struct device *pci_dev_to_dev(struct pci_dev *pdev)
enum { enum {
/* various global constants */ /* various global constants */
LIBATA_MAX_PRD = ATA_MAX_PRD / 2, LIBATA_MAX_PRD = ATA_MAX_PRD / 2,
LIBATA_DUMB_MAX_PRD = ATA_MAX_PRD / 4, /* Worst case */
ATA_MAX_PORTS = 8, ATA_MAX_PORTS = 8,
ATA_DEF_QUEUE = 1, ATA_DEF_QUEUE = 1,
/* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */ /* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
...@@ -136,6 +137,8 @@ enum { ...@@ -136,6 +137,8 @@ enum {
ATA_DFLAG_CDB_INTR = (1 << 2), /* device asserts INTRQ when ready for CDB */ ATA_DFLAG_CDB_INTR = (1 << 2), /* device asserts INTRQ when ready for CDB */
ATA_DFLAG_NCQ = (1 << 3), /* device supports NCQ */ ATA_DFLAG_NCQ = (1 << 3), /* device supports NCQ */
ATA_DFLAG_FLUSH_EXT = (1 << 4), /* do FLUSH_EXT instead of FLUSH */ ATA_DFLAG_FLUSH_EXT = (1 << 4), /* do FLUSH_EXT instead of FLUSH */
ATA_DFLAG_ACPI_PENDING = (1 << 5), /* ACPI resume action pending */
ATA_DFLAG_ACPI_FAILED = (1 << 6), /* ACPI on devcfg has failed */
ATA_DFLAG_CFG_MASK = (1 << 8) - 1, ATA_DFLAG_CFG_MASK = (1 << 8) - 1,
ATA_DFLAG_PIO = (1 << 8), /* device limited to PIO mode */ ATA_DFLAG_PIO = (1 << 8), /* device limited to PIO mode */
...@@ -196,6 +199,7 @@ enum { ...@@ -196,6 +199,7 @@ enum {
ATA_PFLAG_FLUSH_PORT_TASK = (1 << 16), /* flush port task */ ATA_PFLAG_FLUSH_PORT_TASK = (1 << 16), /* flush port task */
ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */
ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */
ATA_PFLAG_GTM_VALID = (1 << 19), /* acpi_gtm data valid */
/* struct ata_queued_cmd flags */ /* struct ata_queued_cmd flags */
ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */ ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */
...@@ -363,6 +367,9 @@ struct ata_host { ...@@ -363,6 +367,9 @@ struct ata_host {
void *private_data; void *private_data;
const struct ata_port_operations *ops; const struct ata_port_operations *ops;
unsigned long flags; unsigned long flags;
#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
#endif
struct ata_port *simplex_claimed; /* channel owning the DMA */ struct ata_port *simplex_claimed; /* channel owning the DMA */
struct ata_port *ports[0]; struct ata_port *ports[0];
}; };
...@@ -429,6 +436,9 @@ struct ata_device { ...@@ -429,6 +436,9 @@ struct ata_device {
unsigned int devno; /* 0 or 1 */ unsigned int devno; /* 0 or 1 */
unsigned long flags; /* ATA_DFLAG_xxx */ unsigned long flags; /* ATA_DFLAG_xxx */
struct scsi_device *sdev; /* attached SCSI device */ struct scsi_device *sdev; /* attached SCSI device */
#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
#endif
/* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
u64 n_sectors; /* size of device, if ATA */ u64 n_sectors; /* size of device, if ATA */
unsigned int class; /* ATA_DEV_xxx */ unsigned int class; /* ATA_DEV_xxx */
...@@ -457,10 +467,6 @@ struct ata_device { ...@@ -457,10 +467,6 @@ struct ata_device {
struct ata_ering ering; struct ata_ering ering;
int spdn_cnt; int spdn_cnt;
unsigned int horkage; /* List of broken features */ unsigned int horkage; /* List of broken features */
#ifdef CONFIG_ATA_ACPI
/* ACPI objects info */
acpi_handle obj_handle;
#endif
}; };
/* Offset into struct ata_device. Fields above it are maintained /* Offset into struct ata_device. Fields above it are maintained
...@@ -489,6 +495,17 @@ struct ata_eh_context { ...@@ -489,6 +495,17 @@ struct ata_eh_context {
unsigned int did_probe_mask; unsigned int did_probe_mask;
}; };
struct ata_acpi_drive
{
u32 pio;
u32 dma;
} __packed;
struct ata_acpi_gtm {
struct ata_acpi_drive drive[2];
u32 flags;
} __packed;
struct ata_port { struct ata_port {
struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ struct Scsi_Host *scsi_host; /* our co-allocated scsi host */
const struct ata_port_operations *ops; const struct ata_port_operations *ops;
...@@ -549,6 +566,10 @@ struct ata_port { ...@@ -549,6 +566,10 @@ struct ata_port {
void *private_data; void *private_data;
#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
struct ata_acpi_gtm acpi_gtm;
#endif
u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */
}; };
...@@ -758,6 +779,7 @@ extern void ata_data_xfer(struct ata_device *adev, unsigned char *buf, ...@@ -758,6 +779,7 @@ extern void ata_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data); unsigned int buflen, int write_data);
extern void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf, extern void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data); unsigned int buflen, int write_data);
extern void ata_dumb_qc_prep(struct ata_queued_cmd *qc);
extern void ata_qc_prep(struct ata_queued_cmd *qc); extern void ata_qc_prep(struct ata_queued_cmd *qc);
extern void ata_noop_qc_prep(struct ata_queued_cmd *qc); extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);
extern unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc); extern unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc);
......
...@@ -8,6 +8,11 @@ struct pata_platform_info { ...@@ -8,6 +8,11 @@ struct pata_platform_info {
* spacing used by ata_std_ports(). * spacing used by ata_std_ports().
*/ */
unsigned int ioport_shift; unsigned int ioport_shift;
/*
* Indicate platform specific irq types and initial
* IRQ flags when call request_irq()
*/
unsigned int irq_flags;
}; };
#endif /* __LINUX_PATA_PLATFORM_H */ #endif /* __LINUX_PATA_PLATFORM_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment