Commit 9af5c9c9 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

libata-link: introduce ata_link

Introduce ata_link.  It abstracts PHY and sits between ata_port and
ata_device.  This new level of abstraction is necessary to support
SATA Port Multiplier, which basically adds a bunch of links (PHYs) to
a ATA host port.  Fields related to command execution, spd_limit and
EH are per-link and thus moved to ata_link.

This patch only defines the host link.  Multiple link handling will be
added later.  Also, a lot of ap->link derefences are added but many of
them will be removed as each part is converted to deal directly with
ata_link instead of ata_port.

This patch introduces no behavior change.
Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Cc: James Bottomley <James.Bottomley@SteelEye.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 640fdb50
...@@ -1064,7 +1064,7 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class, ...@@ -1064,7 +1064,7 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
ata_port_printk(ap, KERN_WARNING, ata_port_printk(ap, KERN_WARNING,
"failed to reset engine (errno=%d)", rc); "failed to reset engine (errno=%d)", rc);
ata_tf_init(ap->device, &tf); ata_tf_init(ap->link.device, &tf);
/* issue the first D2H Register FIS */ /* issue the first D2H Register FIS */
msecs = 0; msecs = 0;
...@@ -1132,7 +1132,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class, ...@@ -1132,7 +1132,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
ahci_stop_engine(ap); ahci_stop_engine(ap);
/* clear D2H reception area to properly wait for D2H FIS */ /* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(ap->device, &tf); ata_tf_init(ap->link.device, &tf);
tf.command = 0x80; tf.command = 0x80;
ata_tf_to_fis(&tf, 0, 0, d2h_fis); ata_tf_to_fis(&tf, 0, 0, d2h_fis);
...@@ -1159,7 +1159,7 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class, ...@@ -1159,7 +1159,7 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class,
ahci_stop_engine(ap); ahci_stop_engine(ap);
rc = sata_port_hardreset(ap, sata_ehc_deb_timing(&ap->eh_context), rc = sata_port_hardreset(ap, sata_ehc_deb_timing(&ap->link.eh_context),
deadline); deadline);
/* vt8251 needs SError cleared for the port to operate */ /* vt8251 needs SError cleared for the port to operate */
...@@ -1278,7 +1278,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc) ...@@ -1278,7 +1278,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
{ {
struct ahci_port_priv *pp = ap->private_data; struct ahci_port_priv *pp = ap->private_data;
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
unsigned int err_mask = 0, action = 0; unsigned int err_mask = 0, action = 0;
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
u32 serror; u32 serror;
...@@ -1332,7 +1332,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) ...@@ -1332,7 +1332,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
ehi->serror |= serror; ehi->serror |= serror;
ehi->action |= action; ehi->action |= action;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc) if (qc)
qc->err_mask |= err_mask; qc->err_mask |= err_mask;
else else
...@@ -1347,7 +1347,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) ...@@ -1347,7 +1347,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
static void ahci_port_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->link.eh_info;
struct ahci_port_priv *pp = ap->private_data; struct ahci_port_priv *pp = ap->private_data;
u32 status, qc_active; u32 status, qc_active;
int rc, known_irq = 0; int rc, known_irq = 0;
...@@ -1360,7 +1360,7 @@ static void ahci_port_intr(struct ata_port *ap) ...@@ -1360,7 +1360,7 @@ static void ahci_port_intr(struct ata_port *ap)
return; return;
} }
if (ap->sactive) if (ap->link.sactive)
qc_active = readl(port_mmio + PORT_SCR_ACT); qc_active = readl(port_mmio + PORT_SCR_ACT);
else else
qc_active = readl(port_mmio + PORT_CMD_ISSUE); qc_active = readl(port_mmio + PORT_CMD_ISSUE);
...@@ -1380,7 +1380,7 @@ static void ahci_port_intr(struct ata_port *ap) ...@@ -1380,7 +1380,7 @@ static void ahci_port_intr(struct ata_port *ap)
/* if !NCQ, ignore. No modern ATA device has broken HSM /* if !NCQ, ignore. No modern ATA device has broken HSM
* implementation for non-NCQ commands. * implementation for non-NCQ commands.
*/ */
if (!ap->sactive) if (!ap->link.sactive)
return; return;
if (status & PORT_IRQ_D2H_REG_FIS) { if (status & PORT_IRQ_D2H_REG_FIS) {
...@@ -1433,7 +1433,7 @@ static void ahci_port_intr(struct ata_port *ap) ...@@ -1433,7 +1433,7 @@ static void ahci_port_intr(struct ata_port *ap)
if (!known_irq) if (!known_irq)
ata_port_printk(ap, KERN_INFO, "spurious interrupt " ata_port_printk(ap, KERN_INFO, "spurious interrupt "
"(irq_stat 0x%x active_tag 0x%x sactive 0x%x)\n", "(irq_stat 0x%x active_tag 0x%x sactive 0x%x)\n",
status, ap->active_tag, ap->sactive); status, ap->link.active_tag, ap->link.sactive);
} }
static void ahci_irq_clear(struct ata_port *ap) static void ahci_irq_clear(struct ata_port *ap)
......
...@@ -53,7 +53,7 @@ static int generic_set_mode(struct ata_port *ap, struct ata_device **unused) ...@@ -53,7 +53,7 @@ static int generic_set_mode(struct ata_port *ap, struct ata_device **unused)
dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
/* We don't really care */ /* We don't really care */
dev->pio_mode = XFER_PIO_0; dev->pio_mode = XFER_PIO_0;
......
...@@ -44,7 +44,8 @@ static void ata_acpi_associate_sata_port(struct ata_port *ap) ...@@ -44,7 +44,8 @@ static void ata_acpi_associate_sata_port(struct ata_port *ap)
{ {
acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT); acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
ap->device->acpi_handle = acpi_get_child(ap->host->acpi_handle, adr); ap->link.device->acpi_handle =
acpi_get_child(ap->host->acpi_handle, adr);
} }
static void ata_acpi_associate_ide_port(struct ata_port *ap) static void ata_acpi_associate_ide_port(struct ata_port *ap)
...@@ -60,7 +61,7 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap) ...@@ -60,7 +61,7 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
max_devices++; max_devices++;
for (i = 0; i < max_devices; i++) { for (i = 0; i < max_devices; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
dev->acpi_handle = acpi_get_child(ap->acpi_handle, i); dev->acpi_handle = acpi_get_child(ap->acpi_handle, i);
} }
...@@ -182,10 +183,10 @@ static int ata_acpi_stm(const struct ata_port *ap, struct ata_acpi_gtm *stm) ...@@ -182,10 +183,10 @@ static int ata_acpi_stm(const struct ata_port *ap, struct ata_acpi_gtm *stm)
/* Buffers for id may need byteswapping ? */ /* Buffers for id may need byteswapping ? */
in_params[1].type = ACPI_TYPE_BUFFER; in_params[1].type = ACPI_TYPE_BUFFER;
in_params[1].buffer.length = 512; in_params[1].buffer.length = 512;
in_params[1].buffer.pointer = (u8 *)ap->device[0].id; in_params[1].buffer.pointer = (u8 *)ap->link.device[0].id;
in_params[2].type = ACPI_TYPE_BUFFER; in_params[2].type = ACPI_TYPE_BUFFER;
in_params[2].buffer.length = 512; in_params[2].buffer.length = 512;
in_params[2].buffer.pointer = (u8 *)ap->device[1].id; in_params[2].buffer.pointer = (u8 *)ap->link.device[1].id;
input.count = 3; input.count = 3;
input.pointer = in_params; input.pointer = in_params;
...@@ -226,7 +227,7 @@ static int ata_acpi_stm(const struct ata_port *ap, struct ata_acpi_gtm *stm) ...@@ -226,7 +227,7 @@ static int ata_acpi_stm(const struct ata_port *ap, struct ata_acpi_gtm *stm)
static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf, static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf,
void **ptr_to_free) void **ptr_to_free)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->link->ap;
acpi_status status; acpi_status status;
struct acpi_buffer output; struct acpi_buffer output;
union acpi_object *out_obj; union acpi_object *out_obj;
...@@ -320,7 +321,7 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf, ...@@ -320,7 +321,7 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf,
static int taskfile_load_raw(struct ata_device *dev, static int taskfile_load_raw(struct ata_device *dev,
const struct ata_acpi_gtf *gtf) const struct ata_acpi_gtf *gtf)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->link->ap;
struct ata_taskfile tf, rtf; struct ata_taskfile tf, rtf;
unsigned int err_mask; unsigned int err_mask;
...@@ -424,7 +425,7 @@ static int ata_acpi_exec_tfs(struct ata_device *dev) ...@@ -424,7 +425,7 @@ static int ata_acpi_exec_tfs(struct ata_device *dev)
*/ */
static int ata_acpi_push_id(struct ata_device *dev) static int ata_acpi_push_id(struct ata_device *dev)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->link->ap;
int err; int err;
acpi_status status; acpi_status status;
struct acpi_object_list input; struct acpi_object_list input;
...@@ -519,7 +520,7 @@ void ata_acpi_on_resume(struct ata_port *ap) ...@@ -519,7 +520,7 @@ void ata_acpi_on_resume(struct ata_port *ap)
/* schedule _GTF */ /* schedule _GTF */
for (i = 0; i < ATA_MAX_DEVICES; i++) for (i = 0; i < ATA_MAX_DEVICES; i++)
ap->device[i].flags |= ATA_DFLAG_ACPI_PENDING; ap->link.device[i].flags |= ATA_DFLAG_ACPI_PENDING;
} }
/** /**
...@@ -538,8 +539,8 @@ void ata_acpi_on_resume(struct ata_port *ap) ...@@ -538,8 +539,8 @@ void ata_acpi_on_resume(struct ata_port *ap)
*/ */
int ata_acpi_on_devcfg(struct ata_device *dev) int ata_acpi_on_devcfg(struct ata_device *dev)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->link->ap;
struct ata_eh_context *ehc = &ap->eh_context; struct ata_eh_context *ehc = &ap->link.eh_context;
int acpi_sata = ap->flags & ATA_FLAG_ACPI_SATA; int acpi_sata = ap->flags & ATA_FLAG_ACPI_SATA;
int rc; int rc;
......
This diff is collapsed.
This diff is collapsed.
...@@ -1368,14 +1368,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) ...@@ -1368,14 +1368,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
case ATA_CMD_SET_FEATURES: case ATA_CMD_SET_FEATURES:
if ((qc->tf.feature == SETFEATURES_WC_ON) || if ((qc->tf.feature == SETFEATURES_WC_ON) ||
(qc->tf.feature == SETFEATURES_WC_OFF)) { (qc->tf.feature == SETFEATURES_WC_OFF)) {
ap->eh_info.action |= ATA_EH_REVALIDATE; ap->link.eh_info.action |= ATA_EH_REVALIDATE;
ata_port_schedule_eh(ap); ata_port_schedule_eh(ap);
} }
break; break;
case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */ case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
case ATA_CMD_SET_MULTI: /* multi_count changed */ case ATA_CMD_SET_MULTI: /* multi_count changed */
ap->eh_info.action |= ATA_EH_REVALIDATE; ap->link.eh_info.action |= ATA_EH_REVALIDATE;
ata_port_schedule_eh(ap); ata_port_schedule_eh(ap);
break; break;
} }
...@@ -1439,14 +1439,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) ...@@ -1439,14 +1439,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
*/ */
static int ata_scmd_need_defer(struct ata_device *dev, int is_io) static int ata_scmd_need_defer(struct ata_device *dev, int is_io)
{ {
struct ata_port *ap = dev->ap; struct ata_link *link = dev->link;
int is_ncq = is_io && ata_ncq_enabled(dev); int is_ncq = is_io && ata_ncq_enabled(dev);
if (is_ncq) { if (is_ncq) {
if (!ata_tag_valid(ap->active_tag)) if (!ata_tag_valid(link->active_tag))
return 0; return 0;
} else { } else {
if (!ata_tag_valid(ap->active_tag) && !ap->sactive) if (!ata_tag_valid(link->active_tag) && !link->sactive)
return 0; return 0;
} }
return 1; return 1;
...@@ -2426,7 +2426,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) ...@@ -2426,7 +2426,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
static struct ata_device * ata_find_dev(struct ata_port *ap, int id) static struct ata_device * ata_find_dev(struct ata_port *ap, int id)
{ {
if (likely(id < ATA_MAX_DEVICES)) if (likely(id < ATA_MAX_DEVICES))
return &ap->device[id]; return &ap->link.device[id];
return NULL; return NULL;
} }
...@@ -2458,7 +2458,7 @@ static int ata_scsi_dev_enabled(struct ata_device *dev) ...@@ -2458,7 +2458,7 @@ static int ata_scsi_dev_enabled(struct ata_device *dev)
if (unlikely(!ata_dev_enabled(dev))) if (unlikely(!ata_dev_enabled(dev)))
return 0; return 0;
if (!atapi_enabled || (dev->ap->flags & ATA_FLAG_NO_ATAPI)) { if (!atapi_enabled || (dev->link->ap->flags & ATA_FLAG_NO_ATAPI)) {
if (unlikely(dev->class == ATA_DEV_ATAPI)) { if (unlikely(dev->class == ATA_DEV_ATAPI)) {
ata_dev_printk(dev, KERN_WARNING, ata_dev_printk(dev, KERN_WARNING,
"WARNING: ATAPI is %s, device ignored.\n", "WARNING: ATAPI is %s, device ignored.\n",
...@@ -2961,7 +2961,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync) ...@@ -2961,7 +2961,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct scsi_device *sdev; struct scsi_device *sdev;
dev = &ap->device[i]; dev = &ap->link.device[i];
if (!ata_dev_enabled(dev) || dev->sdev) if (!ata_dev_enabled(dev) || dev->sdev)
continue; continue;
...@@ -2978,7 +2978,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync) ...@@ -2978,7 +2978,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
* whether all devices are attached. * whether all devices are attached.
*/ */
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
dev = &ap->device[i]; dev = &ap->link.device[i];
if (ata_dev_enabled(dev) && !dev->sdev) if (ata_dev_enabled(dev) && !dev->sdev)
break; break;
} }
...@@ -3049,7 +3049,7 @@ int ata_scsi_offline_dev(struct ata_device *dev) ...@@ -3049,7 +3049,7 @@ int ata_scsi_offline_dev(struct ata_device *dev)
*/ */
static void ata_scsi_remove_dev(struct ata_device *dev) static void ata_scsi_remove_dev(struct ata_device *dev)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->link->ap;
struct scsi_device *sdev; struct scsi_device *sdev;
unsigned long flags; unsigned long flags;
...@@ -3123,7 +3123,7 @@ void ata_scsi_hotplug(struct work_struct *work) ...@@ -3123,7 +3123,7 @@ void ata_scsi_hotplug(struct work_struct *work)
/* unplug detached devices */ /* unplug detached devices */
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
unsigned long flags; unsigned long flags;
if (!(dev->flags & ATA_DFLAG_DETACHED)) if (!(dev->flags & ATA_DFLAG_DETACHED))
...@@ -3162,6 +3162,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, ...@@ -3162,6 +3162,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
unsigned int id, unsigned int lun) unsigned int id, unsigned int lun)
{ {
struct ata_port *ap = ata_shost_to_port(shost); struct ata_port *ap = ata_shost_to_port(shost);
struct ata_eh_info *ehi = &ap->link.eh_info;
unsigned long flags; unsigned long flags;
int rc = 0; int rc = 0;
...@@ -3175,15 +3176,15 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, ...@@ -3175,15 +3176,15 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags);
if (id == SCAN_WILD_CARD) { if (id == SCAN_WILD_CARD) {
ap->eh_info.probe_mask |= (1 << ATA_MAX_DEVICES) - 1; ehi->probe_mask |= (1 << ATA_MAX_DEVICES) - 1;
ap->eh_info.action |= ATA_EH_SOFTRESET; ehi->action |= ATA_EH_SOFTRESET;
} else { } else {
struct ata_device *dev = ata_find_dev(ap, id); struct ata_device *dev = ata_find_dev(ap, id);
if (dev) { if (dev) {
ap->eh_info.probe_mask |= 1 << dev->devno; ehi->probe_mask |= 1 << dev->devno;
ap->eh_info.action |= ATA_EH_SOFTRESET; ehi->action |= ATA_EH_SOFTRESET;
ap->eh_info.flags |= ATA_EHI_RESUME_LINK; ehi->flags |= ATA_EHI_RESUME_LINK;
} else } else
rc = -EINVAL; rc = -EINVAL;
} }
...@@ -3220,7 +3221,7 @@ void ata_scsi_dev_rescan(struct work_struct *work) ...@@ -3220,7 +3221,7 @@ void ata_scsi_dev_rescan(struct work_struct *work)
spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags);
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
struct scsi_device *sdev = dev->sdev; struct scsi_device *sdev = dev->sdev;
if (!ata_dev_enabled(dev) || !sdev) if (!ata_dev_enabled(dev) || !sdev)
...@@ -3359,7 +3360,7 @@ EXPORT_SYMBOL_GPL(ata_sas_port_destroy); ...@@ -3359,7 +3360,7 @@ EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap) int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
{ {
ata_scsi_sdev_config(sdev); ata_scsi_sdev_config(sdev);
ata_scsi_dev_config(sdev, ap->device); ata_scsi_dev_config(sdev, ap->link.device);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(ata_sas_slave_configure); EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
...@@ -3382,8 +3383,8 @@ int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), ...@@ -3382,8 +3383,8 @@ int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
ata_scsi_dump_cdb(ap, cmd); ata_scsi_dump_cdb(ap, cmd);
if (likely(ata_scsi_dev_enabled(ap->device))) if (likely(ata_scsi_dev_enabled(ap->link.device)))
rc = __ata_scsi_queuecmd(cmd, done, ap->device); rc = __ata_scsi_queuecmd(cmd, done, ap->link.device);
else { else {
cmd->result = (DID_BAD_TARGET << 16); cmd->result = (DID_BAD_TARGET << 16);
done(cmd); done(cmd);
......
...@@ -445,7 +445,7 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, ...@@ -445,7 +445,7 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
unsigned long flags; unsigned long flags;
int thaw = 0; int thaw = 0;
qc = __ata_qc_from_tag(ap, ap->active_tag); qc = __ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && !(qc->flags & ATA_QCFLAG_FAILED)) if (qc && !(qc->flags & ATA_QCFLAG_FAILED))
qc = NULL; qc = NULL;
...@@ -909,7 +909,7 @@ unsigned long ata_pci_default_filter(struct ata_device *adev, unsigned long xfer ...@@ -909,7 +909,7 @@ unsigned long ata_pci_default_filter(struct ata_device *adev, unsigned long xfer
/* Filter out DMA modes if the device has been configured by /* Filter out DMA modes if the device has been configured by
the BIOS as PIO only */ the BIOS as PIO only */
if (adev->ap->ioaddr.bmdma_addr == 0) if (adev->link->ap->ioaddr.bmdma_addr == 0)
xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
return xfer_mask; return xfer_mask;
} }
......
...@@ -391,7 +391,7 @@ static void it821x_passthru_dev_select(struct ata_port *ap, ...@@ -391,7 +391,7 @@ static void it821x_passthru_dev_select(struct ata_port *ap,
{ {
struct it821x_dev *itdev = ap->private_data; struct it821x_dev *itdev = ap->private_data;
if (itdev && device != itdev->last_device) { if (itdev && device != itdev->last_device) {
struct ata_device *adev = &ap->device[device]; struct ata_device *adev = &ap->link.device[device];
it821x_program(ap, adev, itdev->pio[adev->devno]); it821x_program(ap, adev, itdev->pio[adev->devno]);
itdev->last_device = device; itdev->last_device = device;
} }
...@@ -464,7 +464,7 @@ static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused ...@@ -464,7 +464,7 @@ static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused
int i; int i;
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
/* We don't really care */ /* We don't really care */
dev->pio_mode = XFER_PIO_0; dev->pio_mode = XFER_PIO_0;
......
...@@ -31,7 +31,7 @@ static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device **error) ...@@ -31,7 +31,7 @@ static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device **error)
int i; int i;
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n"); ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n");
dev->pio_mode = XFER_PIO_0; dev->pio_mode = XFER_PIO_0;
...@@ -49,7 +49,7 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, ...@@ -49,7 +49,7 @@ static void ixp4xx_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
unsigned int i; unsigned int i;
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->link->ap;
void __iomem *mmio = 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;
......
...@@ -112,7 +112,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused) ...@@ -112,7 +112,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
int i; int i;
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
ata_dev_printk(dev, KERN_INFO, "configured for PIO\n"); ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
dev->pio_mode = XFER_PIO_0; dev->pio_mode = XFER_PIO_0;
...@@ -256,7 +256,7 @@ static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -256,7 +256,7 @@ static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev)
static void pdc_data_xfer_vlb(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data) static void pdc_data_xfer_vlb(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data)
{ {
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->link->ap;
int slop = buflen & 3; int slop = buflen & 3;
unsigned long flags; unsigned long flags;
......
...@@ -340,8 +340,8 @@ static int optidma_set_mode(struct ata_port *ap, struct ata_device **r_failed) ...@@ -340,8 +340,8 @@ static int optidma_set_mode(struct ata_port *ap, struct ata_device **r_failed)
pci_read_config_byte(pdev, 0x43, &r); pci_read_config_byte(pdev, 0x43, &r);
r &= (0x0F << nybble); r &= (0x0F << nybble);
r |= (optidma_make_bits43(&ap->device[0]) + r |= (optidma_make_bits43(&ap->link.device[0]) +
(optidma_make_bits43(&ap->device[0]) << 2)) << nybble; (optidma_make_bits43(&ap->link.device[0]) << 2)) << nybble;
pci_write_config_byte(pdev, 0x43, r); pci_write_config_byte(pdev, 0x43, r);
} }
return rc; return rc;
......
...@@ -67,8 +67,8 @@ struct ata_pcmcia_info { ...@@ -67,8 +67,8 @@ struct ata_pcmcia_info {
static int pcmcia_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev) static int pcmcia_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
{ {
struct ata_device *master = &ap->device[0]; struct ata_device *master = &ap->link.device[0];
struct ata_device *slave = &ap->device[1]; struct ata_device *slave = &ap->link.device[1];
if (!ata_dev_enabled(master) || !ata_dev_enabled(slave)) if (!ata_dev_enabled(master) || !ata_dev_enabled(slave))
return ata_do_set_mode(ap, r_failed_dev); return ata_do_set_mode(ap, r_failed_dev);
......
...@@ -486,7 +486,7 @@ static int pdc2027x_set_mode(struct ata_port *ap, struct ata_device **r_failed) ...@@ -486,7 +486,7 @@ static int pdc2027x_set_mode(struct ata_port *ap, struct ata_device **r_failed)
return i; return i;
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
......
...@@ -35,7 +35,7 @@ static int pata_platform_set_mode(struct ata_port *ap, struct ata_device **unuse ...@@ -35,7 +35,7 @@ static int pata_platform_set_mode(struct ata_port *ap, struct ata_device **unuse
int i; int i;
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
/* We don't really care */ /* We don't really care */
......
...@@ -126,7 +126,7 @@ static unsigned int qdi_qc_issue_prot(struct ata_queued_cmd *qc) ...@@ -126,7 +126,7 @@ static unsigned int qdi_qc_issue_prot(struct ata_queued_cmd *qc)
static void qdi_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data) static void qdi_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data)
{ {
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->link->ap;
int slop = buflen & 3; int slop = buflen & 3;
if (ata_id_has_dword_io(adev->id)) { if (ata_id_has_dword_io(adev->id)) {
......
...@@ -39,7 +39,7 @@ static int rz1000_set_mode(struct ata_port *ap, struct ata_device **unused) ...@@ -39,7 +39,7 @@ static int rz1000_set_mode(struct ata_port *ap, struct ata_device **unused)
int i; int i;
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->link.device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
/* We don't really care */ /* We don't really care */
dev->pio_mode = XFER_PIO_0; dev->pio_mode = XFER_PIO_0;
......
...@@ -785,7 +785,7 @@ static u8 scc_bmdma_status (struct ata_port *ap) ...@@ -785,7 +785,7 @@ static u8 scc_bmdma_status (struct ata_port *ap)
static void scc_data_xfer (struct ata_device *adev, unsigned char *buf, static void scc_data_xfer (struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data) unsigned int buflen, int write_data)
{ {
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->link->ap;
unsigned int words = buflen >> 1; unsigned int words = buflen >> 1;
unsigned int i; unsigned int i;
u16 *buf16 = (u16 *) buf; u16 *buf16 = (u16 *) buf;
......
...@@ -84,7 +84,7 @@ static int sis_short_ata40(struct pci_dev *dev) ...@@ -84,7 +84,7 @@ static int sis_short_ata40(struct pci_dev *dev)
static int sis_old_port_base(struct ata_device *adev) static int sis_old_port_base(struct ata_device *adev)
{ {
return 0x40 + (4 * adev->ap->port_no) + (2 * adev->devno); return 0x40 + (4 * adev->link->ap->port_no) + (2 * adev->devno);
} }
/** /**
......
...@@ -94,7 +94,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev) ...@@ -94,7 +94,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
static void winbond_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data) static void winbond_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data)
{ {
struct ata_port *ap = adev->ap; struct ata_port *ap = adev->link->ap;
int slop = buflen & 3; int slop = buflen & 3;
if (ata_id_has_dword_io(adev->id)) { if (ata_id_has_dword_io(adev->id)) {
......
...@@ -485,7 +485,7 @@ static inline unsigned int adma_intr_pkt(struct ata_host *host) ...@@ -485,7 +485,7 @@ static inline unsigned int adma_intr_pkt(struct ata_host *host)
pp = ap->private_data; pp = ap->private_data;
if (!pp || pp->state != adma_state_pkt) if (!pp || pp->state != adma_state_pkt)
continue; continue;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
if (status & aPERR) if (status & aPERR)
qc->err_mask |= AC_ERR_HOST_BUS; qc->err_mask |= AC_ERR_HOST_BUS;
...@@ -500,7 +500,7 @@ static inline unsigned int adma_intr_pkt(struct ata_host *host) ...@@ -500,7 +500,7 @@ static inline unsigned int adma_intr_pkt(struct ata_host *host)
if (!qc->err_mask) if (!qc->err_mask)
ata_qc_complete(qc); ata_qc_complete(qc);
else { else {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
ata_ehi_push_desc(ehi, ata_ehi_push_desc(ehi,
"ADMA-status 0x%02X", status); "ADMA-status 0x%02X", status);
...@@ -529,7 +529,7 @@ static inline unsigned int adma_intr_mmio(struct ata_host *host) ...@@ -529,7 +529,7 @@ static inline unsigned int adma_intr_mmio(struct ata_host *host)
struct adma_port_priv *pp = ap->private_data; struct adma_port_priv *pp = ap->private_data;
if (!pp || pp->state != adma_state_mmio) if (!pp || pp->state != adma_state_mmio)
continue; continue;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
/* check main status, clearing INTRQ */ /* check main status, clearing INTRQ */
...@@ -545,7 +545,8 @@ static inline unsigned int adma_intr_mmio(struct ata_host *host) ...@@ -545,7 +545,8 @@ static inline unsigned int adma_intr_mmio(struct ata_host *host)
if (!qc->err_mask) if (!qc->err_mask)
ata_qc_complete(qc); ata_qc_complete(qc);
else { else {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi =
&ap->link.eh_info;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
ata_ehi_push_desc(ehi, ata_ehi_push_desc(ehi,
"status 0x%02X", status); "status 0x%02X", status);
......
...@@ -285,7 +285,7 @@ static void inic_irq_clear(struct ata_port *ap) ...@@ -285,7 +285,7 @@ static void inic_irq_clear(struct ata_port *ap)
static void inic_host_intr(struct ata_port *ap) static void inic_host_intr(struct ata_port *ap)
{ {
void __iomem *port_base = inic_port_base(ap); void __iomem *port_base = inic_port_base(ap);
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
u8 irq_stat; u8 irq_stat;
/* fetch and clear irq */ /* fetch and clear irq */
...@@ -293,7 +293,8 @@ static void inic_host_intr(struct ata_port *ap) ...@@ -293,7 +293,8 @@ static void inic_host_intr(struct ata_port *ap)
writeb(irq_stat, port_base + PORT_IRQ_STAT); writeb(irq_stat, port_base + PORT_IRQ_STAT);
if (likely(!(irq_stat & PIRQ_ERR))) { if (likely(!(irq_stat & PIRQ_ERR))) {
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); struct ata_queued_cmd *qc =
ata_qc_from_tag(ap, ap->link.active_tag);
if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) { if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) {
ata_chk_status(ap); /* clear ATA interrupt */ ata_chk_status(ap); /* clear ATA interrupt */
...@@ -421,7 +422,7 @@ static int inic_hardreset(struct ata_port *ap, unsigned int *class, ...@@ -421,7 +422,7 @@ static int inic_hardreset(struct ata_port *ap, unsigned int *class,
{ {
void __iomem *port_base = inic_port_base(ap); void __iomem *port_base = inic_port_base(ap);
void __iomem *idma_ctl = port_base + PORT_IDMA_CTL; void __iomem *idma_ctl = port_base + PORT_IDMA_CTL;
const unsigned long *timing = sata_ehc_deb_timing(&ap->eh_context); const unsigned long *timing = sata_ehc_deb_timing(&ap->link.eh_context);
u16 val; u16 val;
int rc; int rc;
......
...@@ -1415,7 +1415,7 @@ static void mv_err_intr(struct ata_port *ap, struct ata_queued_cmd *qc) ...@@ -1415,7 +1415,7 @@ static void mv_err_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
struct mv_host_priv *hpriv = ap->host->private_data; struct mv_host_priv *hpriv = ap->host->private_data;
unsigned int edma_enabled = (pp->pp_flags & MV_PP_FLAG_EDMA_EN); unsigned int edma_enabled = (pp->pp_flags & MV_PP_FLAG_EDMA_EN);
unsigned int action = 0, err_mask = 0; unsigned int action = 0, err_mask = 0;
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
...@@ -1508,7 +1508,7 @@ static void mv_intr_pio(struct ata_port *ap) ...@@ -1508,7 +1508,7 @@ static void mv_intr_pio(struct ata_port *ap)
return; return;
/* get active ATA command */ /* get active ATA command */
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (unlikely(!qc)) /* no active tag */ if (unlikely(!qc)) /* no active tag */
return; return;
if (qc->tf.flags & ATA_TFLAG_POLLING) /* polling; we don't own qc */ if (qc->tf.flags & ATA_TFLAG_POLLING) /* polling; we don't own qc */
...@@ -1543,7 +1543,7 @@ static void mv_intr_edma(struct ata_port *ap) ...@@ -1543,7 +1543,7 @@ static void mv_intr_edma(struct ata_port *ap)
/* 50xx: get active ATA command */ /* 50xx: get active ATA command */
if (IS_GEN_I(hpriv)) if (IS_GEN_I(hpriv))
tag = ap->active_tag; tag = ap->link.active_tag;
/* Gen II/IIE: get active ATA command via tag, to enable /* Gen II/IIE: get active ATA command via tag, to enable
* support for queueing. this works transparently for * support for queueing. this works transparently for
...@@ -1646,7 +1646,7 @@ static void mv_host_intr(struct ata_host *host, u32 relevant, unsigned int hc) ...@@ -1646,7 +1646,7 @@ static void mv_host_intr(struct ata_host *host, u32 relevant, unsigned int hc)
if (unlikely(have_err_bits)) { if (unlikely(have_err_bits)) {
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (qc->tf.flags & ATA_TFLAG_POLLING)) if (qc && (qc->tf.flags & ATA_TFLAG_POLLING))
continue; continue;
...@@ -1688,14 +1688,14 @@ static void mv_pci_error(struct ata_host *host, void __iomem *mmio) ...@@ -1688,14 +1688,14 @@ static void mv_pci_error(struct ata_host *host, void __iomem *mmio)
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
ap = host->ports[i]; ap = host->ports[i];
if (!ata_port_offline(ap)) { if (!ata_port_offline(ap)) {
ehi = &ap->eh_info; ehi = &ap->link.eh_info;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
if (!printed++) if (!printed++)
ata_ehi_push_desc(ehi, ata_ehi_push_desc(ehi,
"PCI err cause 0x%08x", err_cause); "PCI err cause 0x%08x", err_cause);
err_mask = AC_ERR_HOST_BUS; err_mask = AC_ERR_HOST_BUS;
ehi->action = ATA_EH_HARDRESET; ehi->action = ATA_EH_HARDRESET;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc) if (qc)
qc->err_mask |= err_mask; qc->err_mask |= err_mask;
else else
...@@ -2269,7 +2269,7 @@ static void mv_phy_reset(struct ata_port *ap, unsigned int *class, ...@@ -2269,7 +2269,7 @@ static void mv_phy_reset(struct ata_port *ap, unsigned int *class,
static int mv_prereset(struct ata_port *ap, unsigned long deadline) static int mv_prereset(struct ata_port *ap, unsigned long deadline)
{ {
struct mv_port_priv *pp = ap->private_data; struct mv_port_priv *pp = ap->private_data;
struct ata_eh_context *ehc = &ap->eh_context; struct ata_eh_context *ehc = &ap->link.eh_context;
int rc; int rc;
rc = mv_stop_dma(ap); rc = mv_stop_dma(ap);
......
...@@ -594,7 +594,7 @@ static int nv_adma_slave_config(struct scsi_device *sdev) ...@@ -594,7 +594,7 @@ static int nv_adma_slave_config(struct scsi_device *sdev)
/* Not a proper libata device, ignore */ /* Not a proper libata device, ignore */
return rc; return rc;
if (ap->device[sdev->id].class == ATA_DEV_ATAPI) { if (ap->link.device[sdev->id].class == ATA_DEV_ATAPI) {
/* /*
* NVIDIA reports that ADMA mode does not support ATAPI commands. * NVIDIA reports that ADMA mode does not support ATAPI commands.
* Therefore ATAPI commands are sent through the legacy interface. * Therefore ATAPI commands are sent through the legacy interface.
...@@ -711,7 +711,7 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err) ...@@ -711,7 +711,7 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
flags & (NV_CPB_RESP_ATA_ERR | flags & (NV_CPB_RESP_ATA_ERR |
NV_CPB_RESP_CMD_ERR | NV_CPB_RESP_CMD_ERR |
NV_CPB_RESP_CPB_ERR)))) { NV_CPB_RESP_CPB_ERR)))) {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
int freeze = 0; int freeze = 0;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
...@@ -747,7 +747,7 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err) ...@@ -747,7 +747,7 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
DPRINTK("Completing qc from tag %d\n",cpb_num); DPRINTK("Completing qc from tag %d\n",cpb_num);
ata_qc_complete(qc); ata_qc_complete(qc);
} else { } else {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
/* Notifier bits set without a command may indicate the drive /* Notifier bits set without a command may indicate the drive
is misbehaving. Raise host state machine violation on this is misbehaving. Raise host state machine violation on this
condition. */ condition. */
...@@ -764,7 +764,7 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err) ...@@ -764,7 +764,7 @@ static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
static int nv_host_intr(struct ata_port *ap, u8 irq_stat) static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
{ {
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->link.active_tag);
/* freeze if hotplugged */ /* freeze if hotplugged */
if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) { if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) {
...@@ -817,7 +817,7 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance) ...@@ -817,7 +817,7 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
if (pp->flags & NV_ADMA_PORT_REGISTER_MODE) { if (pp->flags & NV_ADMA_PORT_REGISTER_MODE) {
u8 irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804) u8 irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804)
>> (NV_INT_PORT_SHIFT * i); >> (NV_INT_PORT_SHIFT * i);
if(ata_tag_valid(ap->active_tag)) if(ata_tag_valid(ap->link.active_tag))
/** NV_INT_DEV indication seems unreliable at times /** NV_INT_DEV indication seems unreliable at times
at least in ADMA mode. Force it on always when a at least in ADMA mode. Force it on always when a
command is active, to prevent losing interrupts. */ command is active, to prevent losing interrupts. */
...@@ -852,7 +852,7 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance) ...@@ -852,7 +852,7 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
NV_ADMA_STAT_HOTUNPLUG | NV_ADMA_STAT_HOTUNPLUG |
NV_ADMA_STAT_TIMEOUT | NV_ADMA_STAT_TIMEOUT |
NV_ADMA_STAT_SERROR))) { NV_ADMA_STAT_SERROR))) {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
__ata_ehi_push_desc(ehi, "ADMA status 0x%08x: ", status ); __ata_ehi_push_desc(ehi, "ADMA status 0x%08x: ", status );
...@@ -879,10 +879,10 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance) ...@@ -879,10 +879,10 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
u32 check_commands; u32 check_commands;
int pos, error = 0; int pos, error = 0;
if(ata_tag_valid(ap->active_tag)) if(ata_tag_valid(ap->link.active_tag))
check_commands = 1 << ap->active_tag; check_commands = 1 << ap->link.active_tag;
else else
check_commands = ap->sactive; check_commands = ap->link.sactive;
/** Check CPBs for completed commands */ /** Check CPBs for completed commands */
while ((pos = ffs(check_commands)) && !error) { while ((pos = ffs(check_commands)) && !error) {
...@@ -1333,7 +1333,7 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance) ...@@ -1333,7 +1333,7 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance)
!(ap->flags & ATA_FLAG_DISABLED)) { !(ap->flags & ATA_FLAG_DISABLED)) {
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
handled += ata_host_intr(ap, qc); handled += ata_host_intr(ap, qc);
else else
...@@ -1485,7 +1485,7 @@ static void nv_adma_error_handler(struct ata_port *ap) ...@@ -1485,7 +1485,7 @@ static void nv_adma_error_handler(struct ata_port *ap)
int i; int i;
u16 tmp; u16 tmp;
if(ata_tag_valid(ap->active_tag) || ap->sactive) { if(ata_tag_valid(ap->link.active_tag) || ap->link.sactive) {
u32 notifier = readl(mmio + NV_ADMA_NOTIFIER); u32 notifier = readl(mmio + NV_ADMA_NOTIFIER);
u32 notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR); u32 notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR);
u32 gen_ctl = readl(pp->gen_block + NV_ADMA_GEN_CTL); u32 gen_ctl = readl(pp->gen_block + NV_ADMA_GEN_CTL);
...@@ -1501,8 +1501,8 @@ static void nv_adma_error_handler(struct ata_port *ap) ...@@ -1501,8 +1501,8 @@ static void nv_adma_error_handler(struct ata_port *ap)
for( i=0;i<NV_ADMA_MAX_CPBS;i++) { for( i=0;i<NV_ADMA_MAX_CPBS;i++) {
struct nv_adma_cpb *cpb = &pp->cpb[i]; struct nv_adma_cpb *cpb = &pp->cpb[i];
if( (ata_tag_valid(ap->active_tag) && i == ap->active_tag) || if( (ata_tag_valid(ap->link.active_tag) && i == ap->link.active_tag) ||
ap->sactive & (1 << i) ) ap->link.sactive & (1 << i) )
ata_port_printk(ap, KERN_ERR, ata_port_printk(ap, KERN_ERR,
"CPB %d: ctl_flags 0x%x, resp_flags 0x%x\n", "CPB %d: ctl_flags 0x%x, resp_flags 0x%x\n",
i, cpb->ctl_flags, cpb->resp_flags); i, cpb->ctl_flags, cpb->resp_flags);
......
...@@ -626,7 +626,7 @@ static void pdc_post_internal_cmd(struct ata_queued_cmd *qc) ...@@ -626,7 +626,7 @@ static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc, static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
u32 port_status, u32 err_mask) u32 port_status, u32 err_mask)
{ {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
unsigned int ac_err_mask = 0; unsigned int ac_err_mask = 0;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
...@@ -773,7 +773,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance) ...@@ -773,7 +773,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance)
tmp = hotplug_status & (0x11 << ata_no); tmp = hotplug_status & (0x11 << ata_no);
if (tmp && ap && if (tmp && ap &&
!(ap->flags & ATA_FLAG_DISABLED)) { !(ap->flags & ATA_FLAG_DISABLED)) {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
ata_ehi_clear_desc(ehi); ata_ehi_clear_desc(ehi);
ata_ehi_hotplugged(ehi); ata_ehi_hotplugged(ehi);
ata_ehi_push_desc(ehi, "hotplug_status %#x", tmp); ata_ehi_push_desc(ehi, "hotplug_status %#x", tmp);
...@@ -788,7 +788,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance) ...@@ -788,7 +788,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance)
!(ap->flags & ATA_FLAG_DISABLED)) { !(ap->flags & ATA_FLAG_DISABLED)) {
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
handled += pdc_host_intr(ap, qc); handled += pdc_host_intr(ap, qc);
} }
......
...@@ -404,7 +404,7 @@ static inline unsigned int qs_intr_pkt(struct ata_host *host) ...@@ -404,7 +404,7 @@ static inline unsigned int qs_intr_pkt(struct ata_host *host)
struct qs_port_priv *pp = ap->private_data; struct qs_port_priv *pp = ap->private_data;
if (!pp || pp->state != qs_state_pkt) if (!pp || pp->state != qs_state_pkt)
continue; continue;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
switch (sHST) { switch (sHST) {
case 0: /* successful CPB */ case 0: /* successful CPB */
...@@ -437,7 +437,7 @@ static inline unsigned int qs_intr_mmio(struct ata_host *host) ...@@ -437,7 +437,7 @@ static inline unsigned int qs_intr_mmio(struct ata_host *host)
struct qs_port_priv *pp = ap->private_data; struct qs_port_priv *pp = ap->private_data;
if (!pp || pp->state != qs_state_mmio) if (!pp || pp->state != qs_state_mmio)
continue; continue;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
/* check main status, clearing INTRQ */ /* check main status, clearing INTRQ */
......
...@@ -312,7 +312,7 @@ static int sil_set_mode (struct ata_port *ap, struct ata_device **r_failed) ...@@ -312,7 +312,7 @@ static int sil_set_mode (struct ata_port *ap, struct ata_device **r_failed)
return rc; return rc;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
dev = &ap->device[i]; dev = &ap->link.device[i];
if (!ata_dev_enabled(dev)) if (!ata_dev_enabled(dev))
dev_mode[i] = 0; /* PIO0/1/2 */ dev_mode[i] = 0; /* PIO0/1/2 */
else if (dev->flags & ATA_DFLAG_PIO) else if (dev->flags & ATA_DFLAG_PIO)
...@@ -374,8 +374,8 @@ static int sil_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) ...@@ -374,8 +374,8 @@ static int sil_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
static void sil_host_intr(struct ata_port *ap, u32 bmdma2) static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
{ {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->link.active_tag);
u8 status; u8 status;
if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) { if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) {
...@@ -394,8 +394,8 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2) ...@@ -394,8 +394,8 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
* repeat probing needlessly. * repeat probing needlessly.
*/ */
if (!(ap->pflags & ATA_PFLAG_FROZEN)) { if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
ata_ehi_hotplugged(&ap->eh_info); ata_ehi_hotplugged(&ap->link.eh_info);
ap->eh_info.serror |= serror; ap->link.eh_info.serror |= serror;
} }
goto freeze; goto freeze;
...@@ -562,8 +562,8 @@ static void sil_thaw(struct ata_port *ap) ...@@ -562,8 +562,8 @@ static void sil_thaw(struct ata_port *ap)
*/ */
static void sil_dev_config(struct ata_device *dev) static void sil_dev_config(struct ata_device *dev)
{ {
struct ata_port *ap = dev->ap; struct ata_port *ap = dev->link->ap;
int print_info = ap->eh_context.i.flags & ATA_EHI_PRINTINFO; int print_info = ap->link.eh_context.i.flags & ATA_EHI_PRINTINFO;
unsigned int n, quirks = 0; unsigned int n, quirks = 0;
unsigned char model_num[ATA_ID_PROD_LEN + 1]; unsigned char model_num[ATA_ID_PROD_LEN + 1];
......
...@@ -456,7 +456,7 @@ static int sil24_tag(int tag) ...@@ -456,7 +456,7 @@ static int sil24_tag(int tag)
static void sil24_dev_config(struct ata_device *dev) static void sil24_dev_config(struct ata_device *dev)
{ {
void __iomem *port = dev->ap->ioaddr.cmd_addr; void __iomem *port = dev->link->ap->ioaddr.cmd_addr;
if (dev->cdb_len == 16) if (dev->cdb_len == 16)
writel(PORT_CS_CDB16, port + PORT_CTRL_STAT); writel(PORT_CS_CDB16, port + PORT_CTRL_STAT);
...@@ -609,7 +609,7 @@ static int sil24_do_softreset(struct ata_port *ap, unsigned int *class, ...@@ -609,7 +609,7 @@ static int sil24_do_softreset(struct ata_port *ap, unsigned int *class,
if (time_after(deadline, jiffies)) if (time_after(deadline, jiffies))
timeout_msec = jiffies_to_msecs(deadline - jiffies); timeout_msec = jiffies_to_msecs(deadline - jiffies);
ata_tf_init(ap->device, &tf); /* doesn't really matter */ ata_tf_init(ap->link.device, &tf); /* doesn't really matter */
rc = sil24_exec_polled_cmd(ap, pmp, &tf, 0, PRB_CTRL_SRST, rc = sil24_exec_polled_cmd(ap, pmp, &tf, 0, PRB_CTRL_SRST,
timeout_msec); timeout_msec);
if (rc == -EBUSY) { if (rc == -EBUSY) {
...@@ -804,7 +804,7 @@ static void sil24_error_intr(struct ata_port *ap) ...@@ -804,7 +804,7 @@ static void sil24_error_intr(struct ata_port *ap)
{ {
void __iomem *port = ap->ioaddr.cmd_addr; void __iomem *port = ap->ioaddr.cmd_addr;
struct sil24_port_priv *pp = ap->private_data; struct sil24_port_priv *pp = ap->private_data;
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
int freeze = 0; int freeze = 0;
u32 irq_stat; u32 irq_stat;
...@@ -856,7 +856,7 @@ static void sil24_error_intr(struct ata_port *ap) ...@@ -856,7 +856,7 @@ static void sil24_error_intr(struct ata_port *ap)
} }
/* record error info */ /* record error info */
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc) { if (qc) {
sil24_read_tf(ap, qc->tag, &pp->tf); sil24_read_tf(ap, qc->tag, &pp->tf);
qc->err_mask |= err_mask; qc->err_mask |= err_mask;
...@@ -910,7 +910,7 @@ static inline void sil24_host_intr(struct ata_port *ap) ...@@ -910,7 +910,7 @@ static inline void sil24_host_intr(struct ata_port *ap)
if (rc > 0) if (rc > 0)
return; return;
if (rc < 0) { if (rc < 0) {
struct ata_eh_info *ehi = &ap->eh_info; struct ata_eh_info *ehi = &ap->link.eh_info;
ehi->err_mask |= AC_ERR_HSM; ehi->err_mask |= AC_ERR_HSM;
ehi->action |= ATA_EH_SOFTRESET; ehi->action |= ATA_EH_SOFTRESET;
ata_port_freeze(ap); ata_port_freeze(ap);
...@@ -921,7 +921,7 @@ static inline void sil24_host_intr(struct ata_port *ap) ...@@ -921,7 +921,7 @@ static inline void sil24_host_intr(struct ata_port *ap)
if (!(ap->flags & SIL24_FLAG_PCIX_IRQ_WOC) && ata_ratelimit()) if (!(ap->flags & SIL24_FLAG_PCIX_IRQ_WOC) && ata_ratelimit())
ata_port_printk(ap, KERN_INFO, "spurious interrupt " ata_port_printk(ap, KERN_INFO, "spurious interrupt "
"(slot_stat 0x%x active_tag %d sactive 0x%x)\n", "(slot_stat 0x%x active_tag %d sactive 0x%x)\n",
slot_stat, ap->active_tag, ap->sactive); slot_stat, ap->link.active_tag, ap->link.sactive);
} }
static irqreturn_t sil24_interrupt(int irq, void *dev_instance) static irqreturn_t sil24_interrupt(int irq, void *dev_instance)
...@@ -963,7 +963,7 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance) ...@@ -963,7 +963,7 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance)
static void sil24_error_handler(struct ata_port *ap) static void sil24_error_handler(struct ata_port *ap)
{ {
struct ata_eh_context *ehc = &ap->eh_context; struct ata_eh_context *ehc = &ap->link.eh_context;
if (sil24_init_port(ap)) { if (sil24_init_port(ap)) {
ata_eh_freeze_port(ap); ata_eh_freeze_port(ap);
......
...@@ -854,7 +854,7 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance) ...@@ -854,7 +854,7 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance)
!(ap->flags & ATA_FLAG_DISABLED)) { !(ap->flags & ATA_FLAG_DISABLED)) {
struct ata_queued_cmd *qc; struct ata_queued_cmd *qc;
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
handled += pdc20621_host_intr(ap, qc, (i > 4), handled += pdc20621_host_intr(ap, qc, (i > 4),
mmio_base); mmio_base);
...@@ -881,7 +881,7 @@ static void pdc_eng_timeout(struct ata_port *ap) ...@@ -881,7 +881,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
spin_lock_irqsave(&host->lock, flags); spin_lock_irqsave(&host->lock, flags);
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
switch (qc->tf.protocol) { switch (qc->tf.protocol) {
case ATA_PROT_DMA: case ATA_PROT_DMA:
......
...@@ -296,7 +296,7 @@ static void svia_noop_freeze(struct ata_port *ap) ...@@ -296,7 +296,7 @@ static void svia_noop_freeze(struct ata_port *ap)
*/ */
static int vt6420_prereset(struct ata_port *ap, unsigned long deadline) static int vt6420_prereset(struct ata_port *ap, unsigned long deadline)
{ {
struct ata_eh_context *ehc = &ap->eh_context; struct ata_eh_context *ehc = &ap->link.eh_context;
unsigned long timeout = jiffies + (HZ * 5); unsigned long timeout = jiffies + (HZ * 5);
u32 sstatus, scontrol; u32 sstatus, scontrol;
int online; int online;
......
...@@ -240,7 +240,7 @@ static void vsc_port_intr(u8 port_status, struct ata_port *ap) ...@@ -240,7 +240,7 @@ static void vsc_port_intr(u8 port_status, struct ata_port *ap)
return; return;
} }
qc = ata_qc_from_tag(ap, ap->active_tag); qc = ata_qc_from_tag(ap, ap->link.active_tag);
if (qc && likely(!(qc->tf.flags & ATA_TFLAG_POLLING))) if (qc && likely(!(qc->tf.flags & ATA_TFLAG_POLLING)))
handled = ata_host_intr(ap, qc); handled = ata_host_intr(ap, qc);
......
...@@ -4988,14 +4988,14 @@ static void ipr_ata_phy_reset(struct ata_port *ap) ...@@ -4988,14 +4988,14 @@ static void ipr_ata_phy_reset(struct ata_port *ap)
switch(res->cfgte.proto) { switch(res->cfgte.proto) {
case IPR_PROTO_SATA: case IPR_PROTO_SATA:
case IPR_PROTO_SAS_STP: case IPR_PROTO_SAS_STP:
ap->device[0].class = ATA_DEV_ATA; ap->link.device[0].class = ATA_DEV_ATA;
break; break;
case IPR_PROTO_SATA_ATAPI: case IPR_PROTO_SATA_ATAPI:
case IPR_PROTO_SAS_STP_ATAPI: case IPR_PROTO_SAS_STP_ATAPI:
ap->device[0].class = ATA_DEV_ATAPI; ap->link.device[0].class = ATA_DEV_ATAPI;
break; break;
default: default:
ap->device[0].class = ATA_DEV_UNKNOWN; ap->link.device[0].class = ATA_DEV_UNKNOWN;
ap->ops->port_disable(ap); ap->ops->port_disable(ap);
break; break;
}; };
......
...@@ -249,17 +249,17 @@ static void sas_ata_phy_reset(struct ata_port *ap) ...@@ -249,17 +249,17 @@ static void sas_ata_phy_reset(struct ata_port *ap)
switch (dev->sata_dev.command_set) { switch (dev->sata_dev.command_set) {
case ATA_COMMAND_SET: case ATA_COMMAND_SET:
SAS_DPRINTK("%s: Found ATA device.\n", __FUNCTION__); SAS_DPRINTK("%s: Found ATA device.\n", __FUNCTION__);
ap->device[0].class = ATA_DEV_ATA; ap->link.device[0].class = ATA_DEV_ATA;
break; break;
case ATAPI_COMMAND_SET: case ATAPI_COMMAND_SET:
SAS_DPRINTK("%s: Found ATAPI device.\n", __FUNCTION__); SAS_DPRINTK("%s: Found ATAPI device.\n", __FUNCTION__);
ap->device[0].class = ATA_DEV_ATAPI; ap->link.device[0].class = ATA_DEV_ATAPI;
break; break;
default: default:
SAS_DPRINTK("%s: Unknown SATA command set: %d.\n", SAS_DPRINTK("%s: Unknown SATA command set: %d.\n",
__FUNCTION__, __FUNCTION__,
dev->sata_dev.command_set); dev->sata_dev.command_set);
ap->device[0].class = ATA_DEV_UNKNOWN; ap->link.device[0].class = ATA_DEV_UNKNOWN;
break; break;
} }
...@@ -317,7 +317,7 @@ static int sas_ata_scr_write(struct ata_port *ap, unsigned int sc_reg_in, ...@@ -317,7 +317,7 @@ static int sas_ata_scr_write(struct ata_port *ap, unsigned int sc_reg_in,
dev->sata_dev.serror = val; dev->sata_dev.serror = val;
break; break;
case SCR_ACTIVE: case SCR_ACTIVE:
dev->sata_dev.ap->sactive = val; dev->sata_dev.ap->link.sactive = val;
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -342,7 +342,7 @@ static int sas_ata_scr_read(struct ata_port *ap, unsigned int sc_reg_in, ...@@ -342,7 +342,7 @@ static int sas_ata_scr_read(struct ata_port *ap, unsigned int sc_reg_in,
*val = dev->sata_dev.serror; *val = dev->sata_dev.serror;
return 0; return 0;
case SCR_ACTIVE: case SCR_ACTIVE:
*val = dev->sata_dev.ap->sactive; *val = dev->sata_dev.ap->link.sactive;
return 0; return 0;
default: default:
return -EINVAL; return -EINVAL;
......
...@@ -436,7 +436,7 @@ struct ata_ering { ...@@ -436,7 +436,7 @@ struct ata_ering {
}; };
struct ata_device { struct ata_device {
struct ata_port *ap; struct ata_link *link;
unsigned int devno; /* 0 or 1 */ unsigned int devno; /* 0 or 1 */
unsigned long flags; /* ATA_DFLAG_xxx */ unsigned long flags; /* ATA_DFLAG_xxx */
unsigned int horkage; /* List of broken features */ unsigned int horkage; /* List of broken features */
...@@ -510,6 +510,24 @@ struct ata_acpi_gtm { ...@@ -510,6 +510,24 @@ struct ata_acpi_gtm {
u32 flags; u32 flags;
} __packed; } __packed;
struct ata_link {
struct ata_port *ap;
unsigned int active_tag; /* active tag on this link */
u32 sactive; /* active NCQ commands */
unsigned int hw_sata_spd_limit;
unsigned int sata_spd_limit;
unsigned int sata_spd; /* current SATA PHY speed */
/* record runtime error info, protected by host_set lock */
struct ata_eh_info eh_info;
/* EH context */
struct ata_eh_context eh_context;
struct ata_device device[ATA_MAX_DEVICES];
};
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;
...@@ -533,23 +551,12 @@ struct ata_port { ...@@ -533,23 +551,12 @@ struct ata_port {
unsigned int mwdma_mask; unsigned int mwdma_mask;
unsigned int udma_mask; unsigned int udma_mask;
unsigned int cbl; /* cable type; ATA_CBL_xxx */ unsigned int cbl; /* cable type; ATA_CBL_xxx */
unsigned int hw_sata_spd_limit;
unsigned int sata_spd_limit; /* SATA PHY speed limit */
unsigned int sata_spd; /* current SATA PHY speed */
/* record runtime error info, protected by host lock */
struct ata_eh_info eh_info;
/* EH context owned by EH */
struct ata_eh_context eh_context;
struct ata_device device[ATA_MAX_DEVICES];
struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; struct ata_queued_cmd qcmd[ATA_MAX_QUEUE];
unsigned long qc_allocated; unsigned long qc_allocated;
unsigned int qc_active; unsigned int qc_active;
unsigned int active_tag; struct ata_link link; /* host default link */
u32 sactive;
struct ata_port_stats stats; struct ata_port_stats stats;
struct ata_host *host; struct ata_host *host;
...@@ -912,8 +919,11 @@ extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, ...@@ -912,8 +919,11 @@ extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
#define ata_port_printk(ap, lv, fmt, args...) \ #define ata_port_printk(ap, lv, fmt, args...) \
printk(lv"ata%u: "fmt, (ap)->print_id , ##args) printk(lv"ata%u: "fmt, (ap)->print_id , ##args)
#define ata_link_printk(link, lv, fmt, args...) \
printk(lv"ata%u: "fmt, (link)->ap->print_id , ##args)
#define ata_dev_printk(dev, lv, fmt, args...) \ #define ata_dev_printk(dev, lv, fmt, args...) \
printk(lv"ata%u.%02u: "fmt, (dev)->ap->print_id, (dev)->devno , ##args) printk(lv"ata%u.%02u: "fmt, (dev)->link->ap->print_id, (dev)->devno , ##args)
/* /*
* ata_eh_info helpers * ata_eh_info helpers
...@@ -1149,7 +1159,7 @@ static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf) ...@@ -1149,7 +1159,7 @@ static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)
{ {
memset(tf, 0, sizeof(*tf)); memset(tf, 0, sizeof(*tf));
tf->ctl = dev->ap->ctl; tf->ctl = dev->link->ap->ctl;
if (dev->devno == 0) if (dev->devno == 0)
tf->device = ATA_DEVICE_OBS; tf->device = ATA_DEVICE_OBS;
else else
......
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