Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 73479
b: refs/heads/master
c: 32ebbc0
h: refs/heads/master
i:
  73477: 28ed8a9
  73475: 8d3ef18
  73471: bc90049
v: v3
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Nov 8, 2007
1 parent 3e67935 commit e18be0f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1974e20161a2c097c481d2ff711de7db56cb2cd6
refs/heads/master: 32ebbc0c0d5d18c0135b55d1eb0029f48c54aff0
52 changes: 39 additions & 13 deletions trunk/drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -6821,19 +6821,6 @@ static void ata_host_release(struct device *gendev, void *res)
struct ata_host *host = dev_get_drvdata(gendev);
int i;

for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];

if (!ap)
continue;

if ((host->flags & ATA_HOST_STARTED) && ap->ops->port_stop)
ap->ops->port_stop(ap);
}

if ((host->flags & ATA_HOST_STARTED) && host->ops->host_stop)
host->ops->host_stop(host);

for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];

Expand Down Expand Up @@ -6966,6 +6953,24 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
return host;
}

static void ata_host_stop(struct device *gendev, void *res)
{
struct ata_host *host = dev_get_drvdata(gendev);
int i;

WARN_ON(!(host->flags & ATA_HOST_STARTED));

for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];

if (ap->ops->port_stop)
ap->ops->port_stop(ap);
}

if (host->ops->host_stop)
host->ops->host_stop(host);
}

/**
* ata_host_start - start and freeze ports of an ATA host
* @host: ATA host to start ports for
Expand All @@ -6984,6 +6989,8 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
*/
int ata_host_start(struct ata_host *host)
{
int have_stop = 0;
void *start_dr = NULL;
int i, rc;

if (host->flags & ATA_HOST_STARTED)
Expand All @@ -6995,6 +7002,22 @@ int ata_host_start(struct ata_host *host)
if (!host->ops && !ata_port_is_dummy(ap))
host->ops = ap->ops;

if (ap->ops->port_stop)
have_stop = 1;
}

if (host->ops->host_stop)
have_stop = 1;

if (have_stop) {
start_dr = devres_alloc(ata_host_stop, 0, GFP_KERNEL);
if (!start_dr)
return -ENOMEM;
}

for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];

if (ap->ops->port_start) {
rc = ap->ops->port_start(ap);
if (rc) {
Expand All @@ -7007,6 +7030,8 @@ int ata_host_start(struct ata_host *host)
ata_eh_freeze_port(ap);
}

if (start_dr)
devres_add(host->dev, start_dr);
host->flags |= ATA_HOST_STARTED;
return 0;

Expand All @@ -7017,6 +7042,7 @@ int ata_host_start(struct ata_host *host)
if (ap->ops->port_stop)
ap->ops->port_stop(ap);
}
devres_free(start_dr);
return rc;
}

Expand Down

0 comments on commit e18be0f

Please sign in to comment.