Skip to content

Commit

Permalink
libata-link: linkify reset
Browse files Browse the repository at this point in the history
Make reset methods and related functions deal with ata_link instead of
ata_port.

* ata_do_reset()
* ata_eh_reset()
* all prereset/reset/postreset methods and related functions

This patch introduces no behavior change.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
htejun authored and Jeff Garzik committed Oct 12, 2007
1 parent 955e57d commit cc0680a
Show file tree
Hide file tree
Showing 31 changed files with 203 additions and 171 deletions.
34 changes: 19 additions & 15 deletions drivers/ata/ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1042,17 +1042,18 @@ static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp,
return 0;
}

static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
static int ahci_do_softreset(struct ata_link *link, unsigned int *class,
int pmp, unsigned long deadline)
{
struct ata_port *ap = link->ap;
const char *reason = NULL;
unsigned long now, msecs;
struct ata_taskfile tf;
int rc;

DPRINTK("ENTER\n");

if (ata_link_offline(&ap->link)) {
if (ata_link_offline(link)) {
DPRINTK("PHY reports no device\n");
*class = ATA_DEV_NONE;
return 0;
Expand All @@ -1061,10 +1062,10 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
/* prepare for SRST (AHCI-1.1 10.4.1) */
rc = ahci_kick_engine(ap, 1);
if (rc)
ata_port_printk(ap, KERN_WARNING,
ata_link_printk(link, KERN_WARNING,
"failed to reset engine (errno=%d)", rc);

ata_tf_init(ap->link.device, &tf);
ata_tf_init(link->device, &tf);

/* issue the first D2H Register FIS */
msecs = 0;
Expand Down Expand Up @@ -1109,19 +1110,20 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
return 0;

fail:
ata_port_printk(ap, KERN_ERR, "softreset failed (%s)\n", reason);
ata_link_printk(link, KERN_ERR, "softreset failed (%s)\n", reason);
return rc;
}

static int ahci_softreset(struct ata_port *ap, unsigned int *class,
static int ahci_softreset(struct ata_link *link, unsigned int *class,
unsigned long deadline)
{
return ahci_do_softreset(ap, class, 0, deadline);
return ahci_do_softreset(link, class, 0, deadline);
}

static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
static int ahci_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline)
{
struct ata_port *ap = link->ap;
struct ahci_port_priv *pp = ap->private_data;
u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
struct ata_taskfile tf;
Expand All @@ -1132,15 +1134,15 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
ahci_stop_engine(ap);

/* clear D2H reception area to properly wait for D2H FIS */
ata_tf_init(ap->link.device, &tf);
ata_tf_init(link->device, &tf);
tf.command = 0x80;
ata_tf_to_fis(&tf, 0, 0, d2h_fis);

rc = sata_std_hardreset(ap, class, deadline);
rc = sata_std_hardreset(link, class, deadline);

ahci_start_engine(ap);

if (rc == 0 && ata_link_online(&ap->link))
if (rc == 0 && ata_link_online(link))
*class = ahci_dev_classify(ap);
if (*class == ATA_DEV_UNKNOWN)
*class = ATA_DEV_NONE;
Expand All @@ -1149,17 +1151,18 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
return rc;
}

static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class,
static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline)
{
struct ata_port *ap = link->ap;
u32 serror;
int rc;

DPRINTK("ENTER\n");

ahci_stop_engine(ap);

rc = sata_port_hardreset(ap, sata_ehc_deb_timing(&ap->link.eh_context),
rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
deadline);

/* vt8251 needs SError cleared for the port to operate */
Expand All @@ -1176,12 +1179,13 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class,
return rc ?: -EAGAIN;
}

static void ahci_postreset(struct ata_port *ap, unsigned int *class)
static void ahci_postreset(struct ata_link *link, unsigned int *class)
{
struct ata_port *ap = link->ap;
void __iomem *port_mmio = ahci_port_base(ap);
u32 new_tmp, tmp;

ata_std_postreset(ap, class);
ata_std_postreset(link, class);

/* Make sure port's ATAPI bit is set appropriately */
new_tmp = tmp = readl(port_mmio + PORT_CMD);
Expand Down
7 changes: 4 additions & 3 deletions drivers/ata/ata_piix.c
Original file line number Diff line number Diff line change
Expand Up @@ -657,19 +657,20 @@ static int ich_pata_cable_detect(struct ata_port *ap)

/**
* piix_pata_prereset - prereset for PATA host controller
* @ap: Target port
* @link: Target link
* @deadline: deadline jiffies for the operation
*
* LOCKING:
* None (inherited from caller).
*/
static int piix_pata_prereset(struct ata_port *ap, unsigned long deadline)
static int piix_pata_prereset(struct ata_link *link, unsigned long deadline)
{
struct ata_port *ap = link->ap;
struct pci_dev *pdev = to_pci_dev(ap->host->dev);

if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no]))
return -ENOENT;
return ata_std_prereset(ap, deadline);
return ata_std_prereset(link, deadline);
}

static void piix_pata_error_handler(struct ata_port *ap)
Expand Down
49 changes: 24 additions & 25 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3306,10 +3306,10 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,

/**
* ata_std_prereset - prepare for reset
* @ap: ATA port to be reset
* @link: ATA link to be reset
* @deadline: deadline jiffies for the operation
*
* @ap is about to be reset. Initialize it. Failure from
* @link is about to be reset. Initialize it. Failure from
* prereset makes libata abort whole reset sequence and give up
* that port, so prereset should be best-effort. It does its
* best to prepare for reset sequence but if things go wrong, it
Expand All @@ -3321,9 +3321,9 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,
* RETURNS:
* 0 on success, -errno otherwise.
*/
int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
int ata_std_prereset(struct ata_link *link, unsigned long deadline)
{
struct ata_link *link = &ap->link;
struct ata_port *ap = link->ap;
struct ata_eh_context *ehc = &link->eh_context;
const unsigned long *timing = sata_ehc_deb_timing(ehc);
int rc;
Expand All @@ -3342,7 +3342,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
rc = sata_link_resume(link, timing, deadline);
/* whine about phy resume failure but proceed */
if (rc && rc != -EOPNOTSUPP)
ata_port_printk(ap, KERN_WARNING, "failed to resume "
ata_link_printk(link, KERN_WARNING, "failed to resume "
"link for reset (errno=%d)\n", rc);
}

Expand All @@ -3352,7 +3352,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_link_offline(link)) {
rc = ata_wait_ready(ap, deadline);
if (rc && rc != -ENODEV) {
ata_port_printk(ap, KERN_WARNING, "device not ready "
ata_link_printk(link, KERN_WARNING, "device not ready "
"(errno=%d), forcing hardreset\n", rc);
ehc->i.action |= ATA_EH_HARDRESET;
}
Expand All @@ -3363,7 +3363,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)

/**
* ata_std_softreset - reset host port via ATA SRST
* @ap: port to reset
* @link: ATA link to reset
* @classes: resulting classes of attached devices
* @deadline: deadline jiffies for the operation
*
Expand All @@ -3375,10 +3375,10 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
* RETURNS:
* 0 on success, -errno otherwise.
*/
int ata_std_softreset(struct ata_port *ap, unsigned int *classes,
int ata_std_softreset(struct ata_link *link, unsigned int *classes,
unsigned long deadline)
{
struct ata_link *link = &ap->link;
struct ata_port *ap = link->ap;
unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
unsigned int devmask = 0;
int rc;
Expand All @@ -3405,7 +3405,7 @@ int ata_std_softreset(struct ata_port *ap, unsigned int *classes,
rc = ata_bus_softreset(ap, devmask, deadline);
/* if link is occupied, -ENODEV too is an error */
if (rc && (rc != -ENODEV || sata_scr_valid(link))) {
ata_port_printk(ap, KERN_ERR, "SRST failed (errno=%d)\n", rc);
ata_link_printk(link, KERN_ERR, "SRST failed (errno=%d)\n", rc);
return rc;
}

Expand All @@ -3420,23 +3420,22 @@ int ata_std_softreset(struct ata_port *ap, unsigned int *classes,
}

/**
* sata_port_hardreset - reset port via SATA phy reset
* @ap: port to reset
* sata_link_hardreset - reset link via SATA phy reset
* @link: link to reset
* @timing: timing parameters { interval, duratinon, timeout } in msec
* @deadline: deadline jiffies for the operation
*
* SATA phy-reset host port using DET bits of SControl register.
* SATA phy-reset @link using DET bits of SControl register.
*
* LOCKING:
* Kernel thread context (may sleep)
*
* RETURNS:
* 0 on success, -errno otherwise.
*/
int sata_port_hardreset(struct ata_port *ap, const unsigned long *timing,
int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
unsigned long deadline)
{
struct ata_link *link = &ap->link;
u32 scontrol;
int rc;

Expand Down Expand Up @@ -3482,7 +3481,7 @@ int sata_port_hardreset(struct ata_port *ap, const unsigned long *timing,

/**
* sata_std_hardreset - reset host port via SATA phy reset
* @ap: port to reset
* @link: link to reset
* @class: resulting class of attached device
* @deadline: deadline jiffies for the operation
*
Expand All @@ -3495,19 +3494,19 @@ int sata_port_hardreset(struct ata_port *ap, const unsigned long *timing,
* RETURNS:
* 0 on success, -errno otherwise.
*/
int sata_std_hardreset(struct ata_port *ap, unsigned int *class,
int sata_std_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline)
{
struct ata_link *link = &ap->link;
struct ata_port *ap = link->ap;
const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context);
int rc;

DPRINTK("ENTER\n");

/* do hardreset */
rc = sata_port_hardreset(ap, timing, deadline);
rc = sata_link_hardreset(link, timing, deadline);
if (rc) {
ata_port_printk(ap, KERN_ERR,
ata_link_printk(link, KERN_ERR,
"COMRESET failed (errno=%d)\n", rc);
return rc;
}
Expand All @@ -3525,7 +3524,7 @@ int sata_std_hardreset(struct ata_port *ap, unsigned int *class,
rc = ata_wait_ready(ap, deadline);
/* link occupied, -ENODEV too is an error */
if (rc) {
ata_port_printk(ap, KERN_ERR,
ata_link_printk(link, KERN_ERR,
"COMRESET failed (errno=%d)\n", rc);
return rc;
}
Expand All @@ -3540,7 +3539,7 @@ int sata_std_hardreset(struct ata_port *ap, unsigned int *class,

/**
* ata_std_postreset - standard postreset callback
* @ap: the target ata_port
* @link: the target ata_link
* @classes: classes of attached devices
*
* This function is invoked after a successful reset. Note that
Expand All @@ -3550,9 +3549,9 @@ int sata_std_hardreset(struct ata_port *ap, unsigned int *class,
* LOCKING:
* Kernel thread context (may sleep)
*/
void ata_std_postreset(struct ata_port *ap, unsigned int *classes)
void ata_std_postreset(struct ata_link *link, unsigned int *classes)
{
struct ata_link *link = &ap->link;
struct ata_port *ap = link->ap;
u32 serror;

DPRINTK("ENTER\n");
Expand Down Expand Up @@ -6946,7 +6945,7 @@ EXPORT_SYMBOL_GPL(__sata_phy_reset);
EXPORT_SYMBOL_GPL(ata_bus_reset);
EXPORT_SYMBOL_GPL(ata_std_prereset);
EXPORT_SYMBOL_GPL(ata_std_softreset);
EXPORT_SYMBOL_GPL(sata_port_hardreset);
EXPORT_SYMBOL_GPL(sata_link_hardreset);
EXPORT_SYMBOL_GPL(sata_std_hardreset);
EXPORT_SYMBOL_GPL(ata_std_postreset);
EXPORT_SYMBOL_GPL(ata_dev_classify);
Expand Down
Loading

0 comments on commit cc0680a

Please sign in to comment.